android弹性滑动,Android 弹性滑动

1、View使用Scroller滑动

/**

* 在scroller.startScroll()方法中,会将scrollX和deltaX相加存入mFinalX中

* invalidate()方法会调用draw()方法,draw()会调用computeScroll()方法,而在View

* 中computeScroll()方法是空实现,所以要复写该方法,在方法中调用

* scrollTo(scroller.getCurrX(), scroller.getCurrY()),又因为getCurrX()方法返回的是mFinalX

* 的值,调用postInvalidate()方法进行第二次重绘实现view的刷新

*/

Scroller scroller = new Scroller(mContext);

private void smoothScrollTo(int destX, int destY) {

int scrollX = getScrollX();

int deltaX = destX - scrollX;

// 1000ms内滑向destX,效果就是慢慢滑动

scroller.startScroll(scrollX, 0, deltaX, 0, 1000);

invalidate();

}

@Override

public void computeScroll() {

if (scroller.computeScrollOffset()) {

scrollTo(scroller.getCurrX(), scroller.getCurrY());

postInvalidate();

}

}

2、使用动画

final int startX = 0;

final int deltaX = 100;

final Button mButton = new Button(mContext);

ValueAnimator animator = ValueAnimator.ofInt(0, 1).setDuration(1000);

animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

@Override

public void onAnimationUpdate(ValueAnimator animator) {

float fraction = animator.getAnimatedFraction();

mButton.scrollTo(startX + (int) (deltaX * fraction), 0);

}

});

animator.start();

3、使用延时加载 Handler

private static final int MESSAGE_SCROLL_TO = 1;

private static final int FRAME_COUNT = 30;

private static final int DELAYED_TIME = 33;

private int mCount = 0;

private Button mButton;

private Handler mHandler = new Handler() {

@Override

public void handleMessage(Message msg) {

switch (msg.what) {

case MESSAGE_SCROLL_TO:

mCount++;

if (mCount <= FRAME_COUNT) {

float fraction = mCount / (float) FRAME_COUNT;

int scrollX = (int) (fraction * 100);

mButton.scrollTo(scrollX, 0);

mHandler.sendEmptyMessageDelayed(MESSAGE_SCROLL_TO, DELAYED_TIME);

}

break;

}

}

};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值