-----------------------------------华丽的分割线-----------------------------------------
继承自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类似问题参照以下链接文章:
-----------------------------------华丽的分割线-----------------------------------------