Android 属性动画及自定义3D旋转动画

Android 动画框架

其中包括,帧动画、视图动画(补间动画)、属性动画。

在Android3.0之前,视图动画一家独大,之后属性动画框架被推出。属性动画框架,基本可以实现所有的视图动画效果。

视图动画的效率较高且使用方便。但是相比属性动画,视图动画一个非常大的缺陷就是不具备交互性。当某个元素发生视图动画后,其响应事件的位置还依然在动画前的地方,所以视图动画只能做普通的动画效果,避免交互发生。

书接上篇:Android 动画之视图动画的使用


Animator 属性动画

其拥有ObjectAnimator单个动画和AnimatorSet动画集两个类。

使用 ObjectAnimator 可以控制单个View的某个属性值的变化,而将多个 ObjectAnimator 组合到一起就可以形成一个 AnimatorSet 动画集合。

ObjectAnimator

ObjectAnimator可以调用 setFrameDelay(longframeDelay) 设置动画帧之间的间隙时间,通过调整帧率的方式减少动画过程中频繁绘制界面。从而在不影响动画效果的前提下减少CPU资源消耗。

最重要的是,属性动画通过属性的get、set方法来真实地控制一个View的属性值。使用方法如下:

  • translationX和translationY:控制着View从布局容器的左上角坐标偏移的位置;
ObjectAnimator animator=ObjectAnimator.ofFloat(view,"translationX",300);
animator.setDuration(300);
animator.start();
  • pivotX 和 privotY:控制着View的支点位置,默认支点为View的中心; 
  • rorationX 和 rorationY :控制View围绕支点进行2D和3D旋转;
  • scaleX 和 scaleY:控制着View围绕它的支点进行2D缩放;
  • alpha:控制View的alpha透明度。默认值1不透明,0完全透明。

监听事件

ObjectAnimator anima =ObjectAnimator.ofFloat(View,"alpha",0.5f);
anima.addListener(new AnimatorListener(){
    @Overrider
    public void onAnimationStart(Animator animation){//开始}
    @Overrider
    public void onAnimationRepeat(Animator animation){ //重复}
    @Overrider
    public void onAnimationEnd(Animator animation){//结束 }
    @Overrider
    public void onAnimationCancel(Animator animation){ //取消 }
});
anima.start();

也可以进行选择,单个事件进行监听:

anima.addListener(new AnimatorListenerAdapter(){
    @Override
    public void onAnimationEnd(Animator animation){
        //结束
    }
});

AnimatorSet

AnimatoSet 可以通过 playTogether()、playSequentially()、animSet.play().with()、before()、after(),来控制多个动画的协同工作方式,从而做到对动画播放顺序的控制。

ObjectAnimator animator1 =ObjecteAnimator.ofFloat(view,"translation",300f);
ObjectAnimator animator1 =ObjecteAnimator.ofFloat(view,"scaleX",1);
ObjectAnimator animator1 =ObjecteAnimator.ofFloat(view,"scaleY",1);
AnimatorSet set=new AnimatorSet();
set.setDuration(1000);
set.playTogether(animator1,animator2,animator3);//同时播放动画
set.start();

自定义动画

通过继承Animation类,重写其动画的方法实现。

其中一个关键方法如下:

applyTransformation(float interpolatedTime ,transformation t)
  • interpolatedTime:插值器的时间因子,取值范围为0~1 之间;
  • transformation :矩阵封装类,使用它获取矩阵对象getMatrix();

案例,模拟电视机关闭效果的动画来初步了解自定义动画。代码实现如下:

/**
 * Created by aiyang on 2018/5/28.
 */
public class CustomTV extends Animation {
    private int mCenterWidth;
    private int mCenterHeight;
    private Camera camera=new Camera();
    @Override
    public void initialize(int width, int height, int parentWidth, int parentHeight) {
        super.initialize(width, height, parentWidth, parentHeight);
        setDuration(2000);
        setFillAfter(false);
        setRepeatCount(3);
        setInterpolator(new AccelerateInterpolator());
        //缩放的中心位置
        mCenterWidth = width/2;
        mCenterHeight = height/2;
    }
    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {
        final Matrix matrix=t.getMatrix();
        //让一个图像纵向比例不断缩小就能实现电视机关闭的效果
        matrix.preScale(1,1-interpolatedTime,mCenterWidth,mCenterHeight);
    }
}

自定义3D动画

结合矩阵Matrix,并使用 Camera 类可以实现一个自定义的3D动画效果。

这里的Camera并非系统相机类,而是指的是android.graphics.Camera 中的 Camera 类,它封装了openGL的3D动画,从而可以非常方便的创建3D动画效果。

接上面的代码进行修改,如下:

/**
 * Created by aiyang on 2018/5/28.
 */
public class CustomAnim extends Animation {
    private int mCenterWidth;
    private int mCenterHeight;
    private Camera mCamera = new Camera();
    private float mRotateY = 0.0f;
    @Override
    public void initialize(int width, int height, int parentWidth, int parentHeight) {
        super.initialize(width, height, parentWidth, parentHeight);
        setDuration(3000);
        setFillAfter(true);
        setRepeatCount(3);
        setInterpolator(new BounceInterpolator());
        mCenterWidth = width / 2;
        mCenterHeight = height / 2;
    }
    //暴露接口,设置旋转角度
    public void setRotateY(float rotateY){
        mRotateY=rotateY;
    }
    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {
        final Matrix matrix=t.getMatrix();
        mCamera.save();
        //使用Camera设置旋转的角度
        mCamera.rotateY(mRotateY*interpolatedTime);
        //将旋转变换作用到Matrix上
        mCamera.getMatrix(matrix);
        mCamera.restore();
        //通过pre方法设置矩阵作用前的偏移量来改变旋转中心
        matrix.preTranslate(mCenterWidth,mCenterHeight);
        matrix.postTranslate(-mCenterWidth,-mCenterHeight);
    }
}

代码调用

 CustomAnim anim = new CustomAnim();
 anim.setRotateY(10);
 textView.setText("推开门");
 textView.startAnimation(anim);

当然,根据对属性动画的知识学习,我们知道属性动画可以支持3D旋转:

即rorationX 和 rorationY :控制View围绕支点进行2D和3D旋转;

  • 19
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Android属性动画是在Android 3.0之后出现的一种强大的动画框架,它可以为几乎任何对象添加动画效果。属性动画通过在指定的时间内更改对象中的属性值来实现动画效果。与帧动画和补间动画相比,属性动画的特点是可以实现更灵活、更丰富的动画效果。属性动画可以对任意属性进行动画操作,包括Alpha(透明度)、Scale(缩放)、Rotation(旋转)和Translation(平移),甚至可以对自定义属性进行动画操作。属性动画还可以对多个属性同时进行动画操作,可以实现复杂的动画效果。总之,属性动画为开发者提供了更多自由度和创造力,使得Android应用的动画效果更加生动和丰富。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Android 属性动画原理解析](https://blog.csdn.net/mg2flyingff/article/details/112726656)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [【Android属性动画最全解析](https://blog.csdn.net/huweiliyi/article/details/105671079)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

艾阳Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值