FlingAnimation使用

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

使用GestureDetector或者VelocityTracker获得速度

FlingAnimation的初始属性设置

FlingAnimation的动画配置

FlingAnimation的一些要点说明

本文示例对应的代码

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 Studio中,你可以通过使用RecyclerView、PagerAdapter以及FlingAnimation等组件来实现类似淘宝商品列表的图片轮播功能。以下是简要步骤: 1. **设置布局**: - 创建一个RecyclerView作为容器,用于展示商品列表项。 - 每个列表项可以包含一张主图和一组缩略图。 2. **创建Adapter**: - 实现`PagerAdapter`,负责管理当前显示的图片和切换。你需要维护一个图片数组,每个页面对应一个商品的商品图和多张缩略图。 3. **创建ViewHolder**: - 设计一个适配器,如`ImageViewHolder`,里面包含ImageView用于加载图片。主图和缩略图分别对应不同的ImageView。 4. **添加数据**: - 在`onCreateViewHolder()`和`onBindViewHolder()`方法中,根据布局填充数据,包括商品图片和描述。 5. **设置轮播效果**: - 使用`FlingAnimation`库或者自定义动画,当用户滚动到一定位置时,触发下一张图片的显示。可以监听`RecyclerView`的滑动事件(`addOnScrollListener()`)。 6. **设置ViewPager**: - 将Adapter绑定给`ViewPager`,这是RecyclerView内部管理页面切换的核心组件。 7. **启动轮播**: - 初始化`ViewPager`并设置Adapter,然后调用其startPageTurning动画开始轮播。 ```java // 示例代码片段 val viewPager = findViewById<ViewPager>(R.id.view_pager) val adapter = ImagePagerAdapter(imageList) // 自定义的PagerAdapter实例 viewPager.adapter = adapter viewPager.setOnPageChangeListener { _, position, _ -> if (position > 0) { viewPager.startPageTurning() } } ```
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值