android菜单回弹,Android 实现ViewPager边界回弹效果实例代码

废话不多说了,直接给大家贴代码了,具体代码如下所示:

public class BounceBackViewPager extends ViewPager {

private int currentPosition = 0;

private Rect mRect = new Rect();//用来记录初始位置

private boolean handleDefault = true;

private float preX = 0f;

private static final float RATIO = 0.5f;//摩擦系数

private static final float SCROLL_WIDTH = 10f;

public BounceBackViewPager(Context context) {

super(context);

}

public BounceBackViewPager(Context context, AttributeSet attrs) {

super(context, attrs);

}

@Override

public boolean dispatchKeyEvent(KeyEvent event) {

return super.dispatchKeyEvent(event);

}

@Override

public boolean onInterceptTouchEvent(MotionEvent ev) {

if (ev.getAction() == MotionEvent.ACTION_DOWN) {

preX = ev.getX();//记录起点

currentPosition = getCurrentItem();

}

return super.onInterceptTouchEvent(ev);

}

@Override

public boolean onTouchEvent(MotionEvent ev) {

switch (ev.getAction()) {

case MotionEvent.ACTION_UP:

onTouchActionUp();

break;

case MotionEvent.ACTION_MOVE:

if (getAdapter().getCount() == 1) {

float nowX = ev.getX();

float offset = nowX - preX;

preX = nowX;

if (offset > SCROLL_WIDTH) {//手指滑动的距离大于设定值

whetherConditionIsRight(offset);

} else if (offset < -SCROLL_WIDTH) {

whetherConditionIsRight(offset);

} else if (!handleDefault) {//这种情况是已经出现缓冲区域了,手指慢慢恢复的情况

if (getLeft() + (int) (offset * RATIO) != mRect.left) {

layout(getLeft() + (int) (offset * RATIO), getTop(), getRight() + (int) (offset * RATIO), getBottom());

}

}

} else if ((currentPosition == 0 || currentPosition == getAdapter().getCount() - 1)) {

float nowX = ev.getX();

float offset = nowX - preX;

preX = nowX;

if (currentPosition == 0) {

if (offset > SCROLL_WIDTH) {//手指滑动的距离大于设定值

whetherConditionIsRight(offset);

} else if (!handleDefault) {//这种情况是已经出现缓冲区域了,手指慢慢恢复的情况

if (getLeft() + (int) (offset * RATIO) >= mRect.left) {

layout(getLeft() + (int) (offset * RATIO), getTop(), getRight() + (int) (offset * RATIO), getBottom());

}

}

} else {

if (offset < -SCROLL_WIDTH) {

whetherConditionIsRight(offset);

} else if (!handleDefault) {

if (getRight() + (int) (offset * RATIO) <= mRect.right) {

layout(getLeft() + (int) (offset * RATIO), getTop(), getRight() + (int) (offset * RATIO), getBottom());

}

}

}

} else {

handleDefault = true;

}

if (!handleDefault) {

return true;

}

break;

default:

break;

}

return super.onTouchEvent(ev);

}

private void whetherConditionIsRight(float offset) {

if (mRect.isEmpty()) {

mRect.set(getLeft(), getTop(), getRight(), getBottom());

}

handleDefault = false;

layout(getLeft() + (int) (offset * RATIO), getTop(), getRight() + (int) (offset * RATIO), getBottom());

}

private void onTouchActionUp() {

if (!mRect.isEmpty()) {

recoveryPosition();

}

}

private void recoveryPosition() {

TranslateAnimation ta = new TranslateAnimation(getLeft(), mRect.left, 0, 0);

ta.setDuration(300);

startAnimation(ta);

layout(mRect.left, mRect.top, mRect.right, mRect.bottom);

mRect.setEmpty();

handleDefault = true;

}

}

以上所述是小编给大家介绍的Android 实现ViewPager边界回弹效果实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对呐喊教程网站的支持!

声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:notice#nhooo.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值