button在底部的多个view切换优化之<实例二3D切换>
2011-09-27 12:50
567 查看
在button在底部的多个view切换<实例二3D切换> 代码结构不甚合理,也不利于实现我后面计划实现的另外一个功能,先这里抛砖引玉一下--及通过touch屏幕,也可以实现3D切换。经过考虑之后,决定将代码重构为:
1.将View的操作借助一个单实例的MainViewmanager分离开来;
2.实现真正意义上的MVC;
3.继续使用原来的索引也即表驱动的方式来管理view的添加和删除等;
在重构之后,感觉代码的结构更简洁清晰,希望大家指点批评,下面贴上重构之后的代码:
MainActivity.java:
MainViewManager.java:
整个工程源代码详见: http://download.csdn.net/detail/androidzhaoxiaogang/3639973
1.将View的操作借助一个单实例的MainViewmanager分离开来;
2.实现真正意义上的MVC;
3.继续使用原来的索引也即表驱动的方式来管理view的添加和删除等;
在重构之后,感觉代码的结构更简洁清晰,希望大家指点批评,下面贴上重构之后的代码:
MainActivity.java:
package com.isomobile.widgets; import android.app.ActivityGroup; import android.os.Bundle; import android.view.View; public class MainActivity extends ActivityGroup implements View.OnClickListener { private int mCurId = 0; private MainViewManager mViewManager; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mViewManager = MainViewManager.getInstance(); mViewManager.setupViews(this); } @Override public void onClick(View v) { final int id = v.getId(); if (mCurId == id) { return; } mCurId = id; mViewManager.processViews(this, id); mViewManager.onRotateAnimation(mViewManager.getCurButtonIndex(id)); } }
MainViewManager.java:
package com.isomobile.widgets; import android.app.Activity; import android.app.ActivityGroup; import android.content.Context; import android.content.Intent; import android.view.View; import android.view.View.OnClickListener; import android.view.animation.Animation; import android.widget.Button; import android.widget.RelativeLayout; public class MainViewManager { public static String EXTRA_NAME_BUTTON_INDEX = "buton.index"; public final static Class<?>[] sActivityClasses = { Activity1.class, Activity2.class, Activity3.class, Activity4.class, Activity5.class }; public final static int[] sResIds = { R.id.btn1, R.id.btn2, R.id.btn3, R.id.btn4, R.id.btn5 }; public final static String[] sActivityIds = { "Activity1", "Activity2", "Activity3", "Activity4", "Activity5" }; private final static int DISTENCE_X = 240, DISTENCE_Y = 0; private final static int ROTATE_ANIMATION_DURATION = 300; private int mPreBtnPos, mCurBtnPos = 0; private RelativeLayout mViewContainer; private View mPreView; private View[] mCurView = new View[sResIds.length]; private Button[] mBtns = new Button[sResIds.length]; private static MainViewManager mInstance = new MainViewManager(); private MainViewManager() { } public static MainViewManager getInstance() { return mInstance; } public void setupViews(Context context) { mViewContainer = (RelativeLayout) ((Activity) context).findViewById(R.id.container); final Button[] btns = mBtns; for (int i = 0; i < btns.length; i++) { btns[i] = (Button) ((Activity) context).findViewById(sResIds[i]); btns[i].setOnClickListener((OnClickListener) context); } // 第一次启动时,默认跳转到第一个activity mCurView[0] = ((ActivityGroup) context).getLocalActivityManager().startActivity( sActivityIds[0], new Intent(context, sActivityClasses[0]).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)) .getDecorView(); mViewContainer.addView(mCurView[0]); mPreView = mCurView[0]; mPreBtnPos = 0; } public int getCurButtonIndex(int rid) { final int length = sResIds.length; for (int i = 0; i < length; i++) { if (rid == sResIds[i]) { return i; } } return 0; } public void processViews(Context context, int rid) { mViewContainer.removeAllViews(); mCurBtnPos = getCurButtonIndex(rid); final Intent intent = new Intent(context, sActivityClasses[mCurBtnPos]); intent.putExtra(EXTRA_NAME_BUTTON_INDEX, mCurBtnPos); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); mCurView[mCurBtnPos] = ((ActivityGroup) context).getLocalActivityManager().startActivity( sActivityIds[mCurBtnPos], intent).getDecorView(); } public void onRotateAnimation(int index) { if (mPreBtnPos > mCurBtnPos) { Rotate3d.rightRotate(mPreView, mCurView[index], DISTENCE_X, DISTENCE_Y, ROTATE_ANIMATION_DURATION, new AnimListener()); } else { Rotate3d.leftRotate(mPreView, mCurView[index], DISTENCE_X, DISTENCE_Y, ROTATE_ANIMATION_DURATION, new AnimListener()); } mPreView = mCurView[index]; mViewContainer.removeAllViews(); mViewContainer.addView(mCurView[index]); mPreBtnPos = mCurBtnPos; } private final static class AnimListener implements Animation.AnimationListener { public void onAnimationEnd(Animation animation) { // 可以设置buttons的背景或者状态(是否可点击等) } public void onAnimationRepeat(Animation animation) { } public void onAnimationStart(Animation animation) { // 可以设置buttons的背景或者状态(是否可点击等) } } }
整个工程源代码详见: http://download.csdn.net/detail/androidzhaoxiaogang/3639973
相关文章推荐
- button在底部的多个view切换<实例二3D切换>
- button在底部的多个view切换<实例一正常切换>
- button在底部的多个view切换<实例三触摸和点击实现3D切换>
- Android UI 优化<merge/> <include/> <ViewStub>
- android 布局优化标签<include/>、<merge />、<ViewStub />
- Android中View绘制优化二一---- 使用<include />标签复用布局文件
- The constructor Intent(new View.OnClickListener(){}, Class<ButtonStudyActivity>) is undefined
- 布局优化技巧--<include>/<merge>/<viewStub>
- Android最佳性能实践——布局优化技巧之<include>、<merge>标签及仅在需要时才加载布局的:ViewStub
- Android实战简易教程<二十六>(基于ViewPager实现微信页面切换效果)
- 【移动开发】布局优化利器<include/>和ViewStub
- Android布局优化之<merge>与<ViewStub>标签使用
- 【移动开发】布局优化利器<include/>和ViewStub
- Android实战简易教程<三十七>(ListView中点击button跳转到拨号界面实例)
- 【移动开发】布局优化利器<include/>和ViewStub
- C++封装SQLite实例<五>
- JSP_<jsp:application>实例
- Android实战简易教程<五十八>(AlarmManager类用法研究小实例)
- Android实战简易教程<三十五>(将二维码扫描和生成Demo引入项目实例)
- Android NDK学习 <三> Android.mk实例和NDK实用技巧