Android中使用派生自ViewFlipper的自定义控件和GestureDetector实现平滑滚动翻页
??
-----------------------------------华丽的分割线-----------------------------------------?
?继承自ViewFlipper 的自定义控件类:
public class NNViewFlipper extends ViewFlipper implements OnTouchListener, OnGestureListener {private static final String TAG = "NNViewFlipper:";private static final int FLING_MIN_DISTANCE = 50;private static final int FLING_MIN_VELOCITY = 0;private final Context mContext;private GestureDetector mGestureDetector = null;public NNViewFlipper(Context context) {super(context);// TODO Auto-generated constructor stubLog.v(TAG, "NNViewFlipper");this.mContext = context; addView(addTextView("step 1")); addView(addTextView("step 2")); addView(addTextView("step 3")); addView(addTextView("step 4")); addView(addTextView("step 5")); mGestureDetector = new GestureDetector(this); setOnTouchListener(this); setLongClickable(true); }private View addTextView(String text) {TextView tv = new TextView(mContext);tv.setText(text);tv.setGravity(Gravity.CENTER);return tv;}@Overridepublic boolean onTouch(View v, MotionEvent event) {// TODO Auto-generated method stub//return false;Log.v(TAG, "onTouch");return mGestureDetector.onTouchEvent(event);}@Overridepublic boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) {// TODO Auto-generated method stub//return super.onFling(e1, e2, velocityX, velocityY);Log.v(TAG, "onFling");if (e1.getX() - e2.getX() > FLING_MIN_DISTANCE && Math.abs(velocityX) > FLING_MIN_VELOCITY) {Log.v(TAG, "on left"); setInAnimation(AnimationUtils.loadAnimation(mContext, R.anim.push_left_in)); setOutAnimation(AnimationUtils.loadAnimation(mContext, R.anim.push_left_out)); showNext();return true;} else if (e2.getX() - e1.getX() > FLING_MIN_DISTANCE && Math.abs(velocityX) > FLING_MIN_VELOCITY) {Log.v(TAG, "on right");setInAnimation(AnimationUtils.loadAnimation(mContext, R.anim.push_right_in));setOutAnimation(AnimationUtils.loadAnimation(mContext, R.anim.push_right_out));showPrevious(); return true;} return false;}@Overridepublic boolean onDown(MotionEvent e) {// TODO Auto-generated method stub//Log.v(TAG, "onDown");return false;}@Overridepublic void onLongPress(MotionEvent e) {// TODO Auto-generated method stub//Log.v(TAG, "onLongPress");}@Overridepublic boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,float distanceY) {// TODO Auto-generated method stub//Log.v(TAG, "onScroll");return false;}@Overridepublic void onShowPress(MotionEvent e) {// TODO Auto-generated method stub//Log.v(TAG, "onShowPress");}@Overridepublic boolean onSingleTapUp(MotionEvent e) {// TODO Auto-generated method stub//Log.v(TAG, "onSingleTapUp");return false;}}
?
?主activity中的调用:
NNViewFlipper mNNViewFlipper = new NNViewFlipper(this); LayoutParams layoutParams = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT ); mNNViewFlipper.setLayoutParams(layoutParams); LinearLayout mViewFlipperLayout = (LinearLayout)findViewById(R.id.main_ViewFlipperLayout); mViewFlipperLayout.removeAllViews(); mViewFlipperLayout.addView(mNNViewFlipper); mViewFlipperLayout.invalidate();
?
?layout XML:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/main_ViewFlipperLayout" ></LinearLayout>
??
?注意:“setLongClickable(true)”不可缺少,否则你的onFling()事件不会被执行。
?
其它关于Animation类似问题参照以下链接文章:
- http://www.iteye.com/topic/712644?http://blog.csdn.net/rmm0001/article/details/6624525
??
-----------------------------------华丽的分割线-----------------------------------------?