记一次动画使用总结

本文记录了一次在Android中实现动画效果的过程,重点讨论了如何设置锚点位置、避免动画结束后闪烁的问题,以及使用`ObjectAnimator`的细节。通过调整锚点位置和巧妙运用动画API,成功实现了指针的平滑移动和旋转效果。同时,文章提倡在遇到困难时通过编写代码提升技术能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考文章
https://blog.youkuaiyun.com/ruingman/article/details/54288403
https://hencoder.com/ui-1-6/
https://hencoder.com/ui-1-7/
这次实现的效果演示.gif

页面布局就不说了,就是FrameLayout

不过有一点要注意: 指针是长方形的图片,默认的锚点在中心,所以放大缩小旋转都不会改变锚点的位置,上面的演示指针的锚点是在左边,可以在xml文件中设置imageViewtransformPivotXtransformPivotY两个属性来设置锚点的位置,也可以在java代码中调用imageview.setPivotX()imageview.setPivotX()来设置锚点 。这里的锚点是相对于view来设置的,就是说如果设置成(10,10) 以view的左上角为原点的坐标(10,10)

之后就用ObjectAnimator来设置动画

private void initAnimator(){
        //圆盘动画
        animator = ObjectAnimator.ofFloat(
                musicPhoto, "rotation", 359).setDuration(7000);//设置7秒转一圈
        animator.setRepeatCount(-1);//不停循环
        animator.setInterpolator(new LinearInterpolator());//设置匀速
        //指针动画
        pointerAnimator = ObjectAnimator.ofFloat(pointer,"rotation",13/*角度*/).setDuration(500);
        pointerAnimatorBack = ObjectAnimator.ofFloat(pointer,"rotation",0/*从当前位置回到0°*/).setDuration(500);
    }

我这里指针动画设置了两个一个下移一个返回。本来用的是 RotationAnimator,后来发现回去的时候会闪一下,因为valueAnimator只改变显示位置,没改变本体位置,就是说动画是播放出来了但是在播放完毕后会立即回到原来的位置,当然也可以调用 rotateAnimation.setFillAfter(true);来让动画停止在结束位置,但是这样并没有改变image的属性,也就是没有改变image的本来的位置,此时在执行别的动画会发现闪一下从原点开始播放

提一下:https://hencoder.com/ui-1-6/这个链接有讲objectAnimator使用,非常详细

接下来就是控制播放动画了

boolean isStart = false;
boolean ispause = false;

start.setOnClickListener(new View.OnClickListener() {
            //这里必须要加上这个,用到start(),resume(),pause()方法就会强制加这个了,你也可以修改你的minSdkVersion改成21
            @RequiresApi(api = Build.VERSION_CODES.KITKAT)
            @Override
            public void onClick(View v) {
                if (!isStart) {//如果是停止状态就开始播放
                    pointerAnimator.start();//指针动画开始
                    if (!ispause) {//当前从未播放过
                        animator.start();
                    } else {//用户点击暂停后又点击开始
                        animator.resume();//从暂停位置开始播放
                    }
                    isStart = true;//把播放状态设置成true
                    start.setText("暂停");
                } else {
                    pointerAnimatorBack.start();//指针回去
                    isStart = false;//是否播放状态
                    ispause = true;//是否暂停
                    animator.pause();
                    start.setText("开始");
                }
            }
        });

这里说一下我之前旋转指针的做法

RotationAnimator r = new RotateAnimation(0.0f, 13f,Animation.RELATIVE_TO_SELF, 0.1f,Animation.RELATIVE_TO_SELF, 0.5f);
point.startAnimator(r);

参数:(开始角度,终点角度,用什么确定X坐标(这里是用自身坐标系取X),x轴位置(百分比),用什么确定Y坐标(这里是用自身坐标系取Y),y轴位置(百分比))
Animation.RELATIVE_TO_SELF:用自己坐标系取x,y的值
Animation.RELATIVE_TO_PARENT:以父view的坐标系取x,y的值

就这么多吧!颓废的时候就多写写代码,技术自然就上来了,共勉!!!

如果有哪位仁兄觉得哪里写错了或者可以写的更好的欢迎指出,共同进步

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值