首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Android >

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

2012-06-29 
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 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

??

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

热点排行