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类似问题参照以下链接文章:
- http://www.iteye.com/topic/712644
- http://blog.****.net/rmm0001/article/details/6624525
-----------------------------------华丽的分割线-----------------------------------------