Android中施用派生自ViewFlipper的自定义控件和GestureDetector实现平滑滚动翻页

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 stub
		Log.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;
	}
	
	@Override
	public boolean onTouch(View v, MotionEvent event) {
		// TODO Auto-generated method stub
		//return false;
		Log.v(TAG, "onTouch");
		return mGestureDetector.onTouchEvent(event);
	}

	@Override
	public 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;
	}

	@Override
	public boolean onDown(MotionEvent e) {
		// TODO Auto-generated method stub
		//Log.v(TAG, "onDown");
		return false;
	}

	@Override
	public void onLongPress(MotionEvent e) {
		// TODO Auto-generated method stub
		//Log.v(TAG, "onLongPress");
	}

	@Override
	public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
			float distanceY) {
		// TODO Auto-generated method stub
		//Log.v(TAG, "onScroll");
		return false;
	}

	@Override
	public void onShowPress(MotionEvent e) {
		// TODO Auto-generated method stub
		//Log.v(TAG, "onShowPress");
	}

	@Override
	public 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类似问题参照以下链接文章:

  1. http://www.iteye.com/topic/712644
  2.  http://blog.csdn.net/rmm0001/article/details/6624525

  

-----------------------------------华丽的分割线-----------------------------------------