提高滚动流畅的Android属性,在Android中流畅滚动

我没有OpenGL和加速度计的经验,但是滑动(在Android API中称为fling)并不难实现。进行这样的自定义时View,您需要做的第一件事就是实现一个,GestureDetector然后onTouchEvent()在您的视图中调用它onTouchEvent()

GestureDetector mGD = new GestureDetector(getContext(),

new SimpleOnGestureListener() {

@Override

public boolean onScroll(MotionEvent e1, MotionEvent e2,

float distanceX, float distanceY) {

// beware, it can scroll to infinity

scrollBy((int)distanceX, (int)distanceY);

return true;

}

@Override

public boolean onFling(MotionEvent e1, MotionEvent e2, float vX, float vY) {

mScroller.fling(getScrollX(), getScrollY(),

-(int)vX, -(int)vY, 0, (int)mMaxScrollX, 0, (int)mMaxScrollY);

invalidate(); // don't remember if it's needed

return true;

}

@Override

public boolean onDown(MotionEvent e) {

if(!mScroller.isFinished() ) { // is flinging

mScroller.forceFinished(true); // to stop flinging on touch

}

return true; // else won't work

}

});

@Override

public boolean onTouchEvent(MotionEvent event) {

return mGD.onTouchEvent(event);

}

虽然OnGestureListener.onScroll()直接调用View.scrollBy(),对于onFling()方法你需要一个Scroller。

Scroller正如参考文献所述,它是一个简单的对象,它封装了滚动。它可用于连续滚动或对弹起做出反应。Scroller.fling()开始对其内部滚动进行“模拟”,通过观看它,您可以使用连续重绘动画来复制其平滑度:

@Override

protected void onDraw(Canvas canvas) {

// ....your drawings....

// scrollTo invalidates, so until animation won't finish it will be called

// (used after a Scroller.fling() )

if(mScroller.computeScrollOffset()) {

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

}

}

也就是说,在动画运行之前,计算我们到达的点并在那里滚动。

作为最后一个音符:记得回到true你的OnGestureListener.onDown(),即使你不想下来做任何事情,否则将无法正常工作。

请注意,因为ScrollerAndroid 2.2中存在一个bug,即使到达达到您作为参数传递的限制时,fling动画也不会真正结束(但计算的偏移量尊重它们,因此它实际上不会移动)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值