市场上有一款名为Floating images的应用程序.这个应用程序具有最流畅的滚动逻辑之一.基本上,应用程序有一个覆盖整个屏幕的空白画布,然后在空白画布的顶部显示一些图像.用户可以滑动,应用程序可以在滑动方向上移动图像.此外,它也进行动力学滚动.此外,没有滚动条,因此开发人员似乎创建了一个实现所有平滑滚动逻辑的自定义视图.
如果我能得到它的来源那将是很棒的..但是任何人都有关于如何实现这种功能的任何伪代码或逻辑.任何线索,网站链接都会有所帮助.
big*_*nes 64
我没有使用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);
}
Run Code Online (Sandbox Code Playgroud)
在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());
}
}
Run Code Online (Sandbox Code Playgroud)
也就是说,在动画运行之前,计算我们到达的点并滚动到那里.
作为最后一个音符:记得回到true你的OnGestureListener.onDown(),即使你不想下来做任何事情,否则将无法正常工作.
并且要小心,因为Scroller在Android 2.2中有一个错误,即使它达到你作为参数传递的限制,fling动画也不会真正结束(但是计算出的偏移量会影响它们,所以它实际上不会移动).
Floating Images应用程序是一个开源项目. http://code.google.com/p/floatingimage/
| 归档时间: |
|
| 查看次数: |
49569 次 |
| 最近记录: |