本文内容
使用GestureDetector或者VelocityTracker获得速度

FlingAnimation是甩动(Fling)效果动画, 即指尖离开屏幕后的惯性动画。设置一个初始属性值及速度值,就可以输出一个逐渐减小的属性值。最终以设置的最小值、最大值、最小可见值为停止条件。其中要注意的是速度单位是Pixel/second。添加库
implementation 'com.android.support:support-dynamic-animation:28.0.0'
使用GestureDetector或者VelocityTracker获得速度
首先,可以从利用GestureDetector的监测Fling动作, 在监听API中获得速度VelocityX和VelocityY,并且在这个onFling回调中使用FlingAnimation, 像这样
public void init(){
GestureDetector gestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
//TODO FlingAnimation here
//FlingAnimation fling = new FlingAnimation(target, DynamicAnimation.TRANSLATION_X);
//fling.setStartVelocity(velocityX)
// .start();
return false;
}
});
}
@Override
public boolean onTouchEvent(MotionEvent event){
gestureDetector.onTouchEvent(event);
return super.onTouchEvent(event)
}
或者从VelocityTracker获得速度, 像这样
@Override
public boolean onTouchEvent(MotionEvent event) {
//滑动速度
int index = event.getActionIndex();
int action = event.getActionMasked();
int pointerId = event.getPointerId(index);
switch (action){
case MotionEvent.ACTION_DOWN:
if(velocityTracker==null){
velocityTracker = VelocityTracker.obtain();
}else{
velocityTracker.clear();
}
velocityTracker.addMovement(event);
break;
case MotionEvent.ACTION_MOVE:
velocityTracker.addMovement(event);
velocityTracker.computeCurrentVelocity(1000);
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
float velocityX = velocityTracker.getXVelocity(pointerId);
float velocityY = velocityTracker.getYVelocity(pointerId);
//TODO FlingAnimation here
//FlingAnimation fling = new FlingAnimation(target, DynamicAnimation.TRANSLATION_X);
//fling.setStartVelocity(velocityX)
// .start();
velocityTracker.recycle();
velocityTracker=null;
break;
}
gestureDetectorCompat.onTouchEvent(event);
return true;
}
FlingAnimation的初始属性设置
Fling动画要设置初始速度值及初始属性,其他属性都有默认值的,可以不设置。初始属性,FloatPropertyCompat的getValue为FlingAnimation获取初始属性值获取的地方,而setValue为FlingAnimation动画后设置属性值的回调,属性如下
FlingAnimation fling = new FlingAnimation(target, new FloatPropertyCompat<View>(AStrName) {
@Override
public float getValue(View object) {
//这里返回要实现变化的
//比如可以设置为target.getTranslationX(),即当前target的X轴移动距离
return startValue;
}
@Override
public void setValue(View object, float value) {
//在startValue基础上的变化属性属性值
//如可以target.setTranslationX(value);
}
});
其实,Google在DynamicAnimation中已经写好了很多常用的属性FloatProperty可以直接使用,例如
public abstract class DynamicAnimation<T extends DynamicAnimation<T>>
implements AnimationHandler.AnimationFrameCallback {
public abstract static class ViewProperty extends FloatPropertyCompat<View> {
private ViewProperty(String name) {
super(name);
}
}
public

本文详细介绍了如何在Android中使用FlingAnimation来实现惯性滑动效果,包括从GestureDetector或VelocityTracker获取滑动速度,设置FlingAnimation的初始属性和动画配置,以及注意事项。示例代码展示了如何结合触摸事件监听和VelocityTracker计算速度,创建并启动FlingAnimation,实现View的平移动画。文章还强调了FlingAnimation的结束和更新监听器的使用,以及摩擦力和可见变化阈值的设置对动画效果的影响。
最低0.47元/天 解锁文章
879





