热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

android透明度换算公式_Android动画

概述动画的本质,其实就是把内容的两个状态平滑的过度,而不是直接切换。示例:***通过不断平移*来实现动画效果*floatnewTransl
13d16c5421546b3728afd3dc1166d9c4.png
概述

动画的本质,其实就是把内容的两个状态平滑的过度,而不是直接切换。示例:

    /**
     * 通过不断平移
     * 来实现动画效果
     */
    float newTranslationX = 0;
    public void translationX(View view){
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                // 每次向右移动5像素,100次就是500像素。
                newTranslationX += 5 ;
                img.setTranslationX(newTranslationX);
            }
        };
        for (int i &#61;0;i<100;i&#43;&#43;){
            // 每10毫秒改变一次位置&#xff0c;f反复100次。
            img.postDelayed(runnable,i*10);
        }
    }

Android 系统也提供了&#xff1b;

  • View 动画&#xff1b;只能用于  View。并且动画改变的只是 View 的显示&#xff0c;但没改变 View 的响应区域。提供了四种类型的补间动画&#xff1b;
  • AlphaAnimation(透明度动画)
  • RotateAnimation(旋转动画)
  • ScaleAnimation(缩放动画)
  • TranslateAnimation(平移动画)
  • 动画集合类(AnimationSet)&#xff1b;可将多个补间动画以组合的形式显示出来。
  • 属性动画&#xff1b;于 Android 3.0 (API级别11)开始添加了属性动画。可以对任意对象的属性进行动画而不仅仅是 View&#xff0c;动画默认时间间隔 300ms&#xff0c;默认帧率 10ms/帧。提供了动画集合类(AnimatorSet)&#xff0c;可将多个属性动画以组合的形式显示出来。通过不断得更新 View 的属性&#xff0c;让它表现出动画效果&#xff0c;只要满足两个条件&#xff1a;1、object 必须要提供 setXxx 方法&#xff0c;如果动画的时候没有传递初始值&#xff0c;那么还要提供 getXxx 方法&#xff0c;因为系统要去拿 xxx 属性的初始值(就是通过反射技术来获取和执行属性的 get 和 set 方法。如果这条不满足&#xff0c;程序直接 Crash)。2、object的 setXxx 对属性 xxx 所做的改变必须能够通过某种方法反映出来&#xff0c;比如会带来ui的改变啥的(如果这条不满足&#xff0c;动画无效果但不会Crash)。解决办法&#xff1a;1、如有权限&#xff0c;给对象加上 set/get 方法。2、用一个类来包装原始对象&#xff0c;间接为其提供 get/set 方法。3、采用 ValueAnimator&#xff0c;监听动画过程&#xff0c;自己实现属性的改变。
  • 逐帧动画&#xff1b;可加载 Drawable 资源并逐帧的显示它们(一系列不同的图像按顺序显示)

预备知识

时间插值器(TimeInterpolator)

根据时间流逝的百分比(完成度)计算出动画进度的百分比(完成度)

    // 设置动画效果,时间插值器android:interpolator&#61;"&#64;android:anim/accelerate_interpolator"
    // 设置下面的控件(scale&#xff0c;alpha)共享一个Interpolatorandroid:shareInterpolator&#61;"true"
    >

set>

  • 对于补间动画(Tween Animation)&#xff1b;例如在 TranslateAnimation 类中计算出动画开始的关键帧与将要显示的帧之间的差异。

/**
* 查看源码
* 计算出动画开始的关键帧与将要显示的帧之间的差异
* 并根据帧之间的差异绘制出将要显示的帧&#xff0c;以此类推从而形成动画的效果。
**/
&#64;Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
    // interpolatedTime 通过时间插值器获取的动画进度的百分比
    float dx &#61; mFromXDelta;
    float dy &#61; mFromYDelta;
    if (mFromXDelta !&#61; mToXDelta) {
        dx &#61; mFromXDelta &#43; ((mToXDelta - mFromXDelta) * interpolatedTime);
    }
    if (mFromYDelta !&#61; mToYDelta) {
        dy &#61; mFromYDelta &#43; ((mToYDelta - mFromYDelta) * interpolatedTime);
    }
    t.getMatrix().setTranslate(dx, dy);
}

  • 对于属性动画&#xff1b;即属性值改变的百分比
  • 常用的时间插值器
  • AccelerateDecelerateInterpolator&#xff1b;&#64;android:anim/accelerate_decelerate_interpolator 在动画开始与结束的地方速率改变比较慢&#xff0c;在中间的时候加速
  • AccelerateInterpolator&#xff1b;&#64;android:anim/accelerate_interpolator 动画加速进行
  • AnticipateInterpolator&#xff1b;&#64;android:anim/anticipate_interpolator 先退后再加速前进
  • AnticipateOvershootInterpolator&#xff1b;&#64;android:anim/anticipate_overshoot_interpolator 先退后再加速前进&#xff0c;超出终点后再回终点
  • BounceInterpolator&#xff1b;&#64;android:anim/bounce_interpolator 最后阶段弹球效果
  • CycleInterpolator&#xff1b;&#64;android:anim/cycle_interpolator 动画循环播放特定的次数&#xff0c;速率改变沿着正弦曲线
  • DecelerateInterpolator&#xff1b;&#64;android:anim/decelerate_interpolator 减速动画
  • LinearInterpolator&#xff1b;&#64;android:anim/linear_interpolator 匀速动画
  • OvershootInterpolator&#xff1b;&#64;android:anim/overshoot_interpolator 快速完成动画&#xff0c;超出终点再回到终点
  • PathInterpolator(support v4)&#xff1a;用来定制出任何想要的速度模型。定制的方式是使用一个 Path 对象来绘制出想要的动画完成度 / 时间完成度曲线。

   public void viewAnimate(View view){
       ViewPropertyAnimator vpa &#61; img.animate();
    vpa.translationX(-300);
       Path interpolatorPath &#61; new Path();
       // 先以「动画完成度 : 时间完成度 &#61; 1 : 1」的速度匀速运行 25%
       interpolatorPath.lineTo(0.25f, 0.25f);
       // 然后瞬间跳跃到 150% 的动画完成度
       interpolatorPath.moveTo(0.25f, 1.5f);
       // 再匀速倒车&#xff0c;返回到目标点
       interpolatorPath.lineTo(1, 1);
       vpa.setInterpolator(PathInterpolatorCompat.create(interpolatorPath));
       vpa.setDuration(2000);
   }

  • Android5.0(API 21)引入了三个新的模型(support v4)&#xff1a;1.FastOutLinearInInterpolator&#xff1a;持续加速与AccelerateInterpolator类似&#xff0c;只不过 FastOutLinearInInterpolator(贝塞尔曲线公式)的初始阶段加速度比 AccelerateInterpolator(指数曲线公式)要快一些。但AccelerateInterpolator还可以在构造方法中调节变速系数。所以&#xff0c;使用起来没区别。2.FastOutSlowInInterpolator&#xff1a;先加速在减速FastOutSlowInInterpolator(贝塞尔曲线)的前期加速度(加速或减速都会更迅速)要比 AccelerateDecelerateInterpolator(正弦 / 余弦曲线)快得多。3.LinearOutSlowInInterpolator&#xff1a;持续减速LinearOutSlowInInterpolator 的初始速度比 DecelerateInterpolator 更高。

类型估值器(TypeEvaluator)

它是针对属性动画框架的&#xff0c;而 View 动画是不需要的。它的作用是根据属性值改变的百分比计算出改变后的属性值。系统内置的一些估值器&#xff0c;用来操作不同类型的属性&#xff1b;

  • ArgbEvaluator&#xff1b;针对Color属性&#xff0c;渐变色效果

// 颜色渐变
ObjectAnimator animator &#61; ObjectAnimator.ofInt(view, "colors", 0xffff0000, 0xff00ff00);  
// 按照ARGB规则来变化&#xff0c;而不是按照一个整形int。
animator.setEvaluator(new ArgbEvaluator());  
animator.start();  

// 在 Android 5.0(API 21)加入了新的方法 ofArgb()
// 所以如果 minSdk 大于或者等于 21 &#xff0c;可以直接用下面这种方式
ObjectAnimator animator &#61; ObjectAnimator.ofArgb(view, "color", 0xffff0000, 0xff00ff00);  
animator.start();  

  • IntEvaluator&#xff1b;针对整型属性&#xff0c;以整型的形式从初始值 - 结束值 进行过渡
  • FloatEvaluator&#xff1b;针对浮点型属性&#xff0c;返回Float类型属性改变
  • IntArrayEvaluator&#xff1b;
  • FloatArrayEvaluator&#xff1b;
  • PointFEvaluator&#xff1b;minSdk 大于或者等于 21
  • RectEvaluator&#xff1b;
  • TypeEvaluator&#xff1b;自定义TypeEvaluator

/**
* 使用自定义的 HslEvaluator
**/ 
// 因为argb的方式&#xff0c;是计算机的方式&#xff0c;对人的感官而言是不直观的
// 可以选择HSV(色相(Hue)&#xff0c;饱和度(Saturation)&#xff0c;明度(Value)),
// 或者HSL(色相(Hue)&#xff0c;饱和度(Saturation)&#xff0c;亮度(Lightness))。
ObjectAnimator animator1 &#61; ObjectAnimator.ofInt(circleViewArgb, "colors", 0xff00ff00);
animator1.setEvaluator(new HsvEvaluator());
animator1.setDuration(5000);
animator1.start();
animator1.addListener(new AnimatorListenerAdapter() {
    &#64;Override
    public void onAnimationEnd(Animator animation) {
        super.onAnimationEnd(animation);
        circleViewArgb.postDelayed(new Runnable() {
            Overridepublic void run() {
                 circleViewArgb.setColors(Color.RED);
            }
        },500);
    }
});
    
/**
* 使用ofObject()
* 对不限定类型的属性做动画
**/ 
// PointFEvaluator 这个类&#xff0c;所以 minSdk 大于或者等于 21 可以直接用&#xff0c;不用自己写了。
ObjectAnimator animator2 &#61; ObjectAnimator.ofObject(ofObjectView, "position",
   new PointFEvaluator(), new PointF(0, 0), new PointF(1, 1));
animator2.setInterpolator(new LinearInterpolator());
animator2.setDuration(2000);
animator2.start();    


使用动画的注意事项
  • OOM 问题
  • 内存泄漏
  • 兼容性问题
  • View 动画的问题
  • 不要使用 px
  • 动画元素的交互
  • 硬件加速

备注

参考资料&#xff1a;

View动画和属性动画

HenCoder属性动画

属性动画深入分析

Android 开发艺术探索

传送门&#xff1a;GitHub

欢迎关注微信公众号&#xff1a;非也缘也




推荐阅读
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • Imdevelopinganappwhichneedstogetmusicfilebystreamingforplayinglive.我正在开发一个应用程序,需要通过流 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • 深度学习中的Vision Transformer (ViT)详解
    本文详细介绍了深度学习中的Vision Transformer (ViT)方法。首先介绍了相关工作和ViT的基本原理,包括图像块嵌入、可学习的嵌入、位置嵌入和Transformer编码器等。接着讨论了ViT的张量维度变化、归纳偏置与混合架构、微调及更高分辨率等方面。最后给出了实验结果和相关代码的链接。本文的研究表明,对于CV任务,直接应用纯Transformer架构于图像块序列是可行的,无需依赖于卷积网络。 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
  • Learning to Paint with Model-based Deep Reinforcement Learning
    本文介绍了一种基于模型的深度强化学习方法,通过结合神经渲染器,教机器像人类画家一样进行绘画。该方法能够生成笔画的坐标点、半径、透明度、颜色值等,以生成类似于给定目标图像的绘画。文章还讨论了该方法面临的挑战,包括绘制纹理丰富的图像等。通过对比实验的结果,作者证明了基于模型的深度强化学习方法相对于基于模型的DDPG和模型无关的DDPG方法的优势。该研究对于深度强化学习在绘画领域的应用具有重要意义。 ... [详细]
  • WPF之Binding初探
      初学wpf,经常被Binding搞晕,以下记录写Binding的基础。首先,盗用张图。这图形象的说明了Binding的机理。对于Binding,意思是数据绑定,基本用法是:1、 ... [详细]
  • 详解 Python 的二元算术运算,为什么说减法只是语法糖?[Python常见问题]
    原题|UnravellingbinaryarithmeticoperationsinPython作者|BrettCannon译者|豌豆花下猫(“Python猫 ... [详细]
  • 本文整理了Java中org.apache.pig.backend.executionengine.ExecException.<init>()方法的一些代码 ... [详细]
author-avatar
Dr-xuan_484
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有