android 可平滑滚动的自定义控件,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:

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:id="@+id/main_ViewFlipperLayout"

>

注意:“setLongClickable(true)”不可缺少,否则你的onFling()事件不会被执行。

其它关于Animation类似问题参照以下链接文章:

http://www.iteye.com/topic/712644

http://blog.csdn.net/rmm0001/article/details/6624525

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值