Property Animator 属性动画概述与示例

Property Animation 属性动画

       属性动画是一个强大的框架,它几乎可以让你的所有东西做动画,你可以随着时间的推移通过更改他们的属性来定义动画,无论它是否绘制在屏幕上,一个属性动画是在指定的时间内去改变属性(一个对象的字段)。你指定想要完成动画的对象的属性去做动画,比如你在屏幕上的位置,想让它动多久,和动画的属性值。


属性动画允许你定义以下特征:

Duraiton 时间:指定的动画发生的时间端,默认是300ms。

Time interpolation 插值器:指定属性的值,该值是由当前动画的时间计算而来的。

Repeat count and behavio 重复次数和行为:指定动画重复次数和动画反向播放。

Animator sets 动画集:指定多个动画同时播放或者按照一定的逻辑有序的播放。

Frame refresh delay 帧刷新延迟:指定动画刷新的延迟时间。


How Property Animation Works 属性动画是如何工作的

       首先,让我们看看如何在动画作品用一个简单的例子。图1描绘了动画与其x属性,它表示在画面上的水平位置的假想物体。动画的持续时间被设定为40毫秒,并以行进的距离是40个像素。每隔10毫秒,这是默认的帧刷新速率,目的是通过10个像素沿水平方向移动。在40毫秒结束时,动画停止,并且对象结束于水平位置40,这是与线性内插的动画的例子,这意味着在一个恒定速度的物体运动。


还可以指定动画具有非线性内插。图2示出了加速时的动画开始一个假想的对象,并减速在动画结束。对象仍移动40个像素在40毫秒的,但非直线。在开始的时候,这个动画加速到中间点,然后减速,从中间点,直到动画结束。如图2所示,行进的距离在开始和动画的端小于在中间。


让我们来详细看一下属性动画系统的重要组成部分,如何将计算如上所示的那些动画。图3示出了主要的类与另一个是如何工作的。


原理一大堆:

ValueAnimator 对象跟踪你的动画时间,如动画已经运行了多长时间,动画正在运行时的当前属性值。

ValueAnimator封装了TimeInterpolator ,它定义动画差值和一个TypeEvaluator,它定义了如何去计算这些动画的属性,

创建一个动画,要给它一个起始值和终点值,运行期间的时间。启用start()之后动画就开始运行了,在整个动画,所述ValueAnimator计算0和1之间的经过部分,基于该动画的持续时间和还有多少时间结束。经过的分数表示的时间,该动画已完成的百分比,0表示0%和1的含义为100%。例如,在图1中,在t的经过分率=10毫秒将是0.25,因为总的持续时间为t= 40毫秒。


How Property Animation Differs from View Animation 属性动画与View动画的区别

该视图的动画系统提供的能力,只有动画视图对象,所以如果你想制作动画的非视图对象,你必须实现自己的代码来这样做。该视图的动画系统也受限于一个事实,即它仅公开了一个查看对象的几个方面进行动画,如一个视图的缩放和旋转,但不是背景颜色,例如。

视图动画系统的另一个缺点是,它仅修改其视图绘制,而不是实际的视图本身。举例来说,如果你的动画一个按钮在屏幕上移动,按钮绘制正确的,但在这里你可以点击按钮的实际位置不会改变,所以你要实现你自己的逻辑来处理这个问题。

随着物业动画系统,这些约束完全删除,并且可以设置动画的任何对象(视图和非视图)的任何属性和对象本身实际上被修改。属性动画系统也是它执行的动画的方式更加健壮。在一个较高的水平,分配给动画师要动画的属性,如颜色,位置或大小,可以定义动画的方面,如插补和多个动画同步。


API 概述:

你可以发现,大部分的属性动画系统API的android.animation。因为视图动画系统已经定义了android.view.animation许多插值,你可以使用这些插值物业动画系统也是如此。


属性动画使用示例:

新建application,创建布局文件,创建类,下面给一个ImageView属性动画,之后的变化只贴出动画方法。动画是通过点击ImageView自身触发的。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/parent"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><ImageViewandroid:id="@+id/image_view_01"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@drawable/png_01" /></LinearLayout>
java

mView.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {animator09(arg0);}});
反转动画:

private void animator01(View view) {ObjectAnimator.ofFloat(view, "rotationX", 0.0F, 360F).setDuration(500).start();}


缩小淡出动画

private void animator02(final View view) {ObjectAnimator mAnimator = ObjectAnimator.ofFloat(view, "zhy", 1.0F, 0.0F).setDuration(500);mAnimator.start();mAnimator.addUpdateListener(new AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {float cVal = (Float) animation.getAnimatedValue();view.setAlpha(cVal);view.setScaleX(cVal);view.setScaleY(cVal);}});}

放大缩小再放大动画,放大同时变化透明度

// 复合动画,放大,透明度变化@SuppressLint("NewApi")private void animator03(View view) {PropertyValuesHolder pX = PropertyValuesHolder.ofFloat("alpha", 1F, 0F, 1F);PropertyValuesHolder pY = PropertyValuesHolder.ofFloat("scaleX", 1F, 0F, 1F);PropertyValuesHolder pZ = PropertyValuesHolder.ofFloat("scaleY", 1F, 0F, 1F);ObjectAnimator.ofPropertyValuesHolder(view, pX, pY, pZ).setDuration(500).start();}


自由落体

// 自由落体@SuppressLint("NewApi")private void animator04(final View view) {ValueAnimator animator = ValueAnimator.ofFloat(0, 300);animator.setTarget(view);animator.setDuration(1000);animator.start();animator.addUpdateListener(new AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator arg0) {// TODO Auto-generated method stubview.setTranslationY((Float) arg0.getAnimatedValue());}});}


抛物线

private void animator05(final View view) {ValueAnimator animator = ValueAnimator.ofFloat();animator.setDuration(3000);animator.setObjectValues(new PointF(0, 0));animator.setInterpolator(new LinearInterpolator());animator.setEvaluator(new TypeEvaluator<PointF>() {@Overridepublic PointF evaluate(float fraction, PointF startValue, PointF endValue) {// Log.i("ABC", fraction + "");PointF mPointF = new PointF();mPointF.x = 200 * fraction * 3;mPointF.y = 0.5f * 200 * fraction * 3 * fraction * 3;return mPointF;}});animator.start();animator.addUpdateListener(new AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator arg0) {// TODO Auto-generated method stubPointF mPointF = (PointF) arg0.getAnimatedValue();view.setX(mPointF.x);view.setY(mPointF.y);}});animator.addListener(new AnimatorListener() {@Overridepublic void onAnimationStart(Animator arg0) {Log.i("ABC", "1");}@Overridepublic void onAnimationRepeat(Animator arg0) {Log.i("ABC", "2");}@Overridepublic void onAnimationEnd(Animator arg0) {Log.i("ABC", "3");}@Overridepublic void onAnimationCancel(Animator arg0) {Log.i("ABC", "4");}});animator.addListener(new AnimatorListenerAdapter() {@Overridepublic void onAnimationEnd(Animator animation) {// TODO Auto-generated method stubsuper.onAnimationEnd(animation);}});}
private void animator06(View view) {ObjectAnimator mAniX = ObjectAnimator.ofFloat(view, "scaleX", 1.0F, 2.0F);ObjectAnimator mAniY = ObjectAnimator.ofFloat(view, "scaleY", 1.0F, 2.0F);AnimatorSet animSet = new AnimatorSet();animSet.setDuration(2000);animSet.setInterpolator(new LinearInterpolator());animSet.playTogether(mAniX, mAniY);animSet.start();}


多动画同时进行

private void animator06(View view) {ObjectAnimator mAniX = ObjectAnimator.ofFloat(view, "scaleX", 1.0F, 2.0F);ObjectAnimator mAniY = ObjectAnimator.ofFloat(view, "scaleY", 1.0F, 2.0F);AnimatorSet animSet = new AnimatorSet();animSet.setDuration(2000);animSet.setInterpolator(new LinearInterpolator());animSet.playTogether(mAniX, mAniY);animSet.start();}

多动画有序进行

private void animator07(View view) {float cx = view.getX();ObjectAnimator mAni1 = ObjectAnimator.ofFloat(view, "scaleX", 1.0F, 2.0F);ObjectAnimator mAni2 = ObjectAnimator.ofFloat(view, "scaleY", 1.0F, 2.0F);ObjectAnimator mAni3 = ObjectAnimator.ofFloat(view, "x", cx, 0f);ObjectAnimator mAni4 = ObjectAnimator.ofFloat(view, "y", cx);AnimatorSet set = new AnimatorSet();set.play(mAni1).with(mAni2);set.play(mAni2).with(mAni3);set.play(mAni4).after(mAni3);set.setDuration(1000).start();}
效果同上。


xml定义属性动画

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" ><objectAnimatorandroid:duration="1000"android:propertyName="scaleX"android:valueFrom="1"android:valueTo="0.5" ></objectAnimator><objectAnimatorandroid:duration="1000"android:propertyName="scaleY"android:valueFrom="1"android:valueTo="0.5" ></objectAnimator></set>

private void animator08(View view) {Animator animator = AnimatorInflater.loadAnimator(this, R.animator.scalexy);view.setPivotX(0);view.setPivotY(0);view.invalidate();animator.setTarget(view);animator.start();}


View的animator属性设置动画

private void animator09(final View v) {v.animate().alpha(0).y(200).setDuration(500).withStartAction(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stub}}).withEndAction(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubrunOnUiThread(new Runnable() {@SuppressLint("NewApi")public void run() {v.setY(0);v.setAlpha(1.0f);}});}}).start();}


LayoutTransition 

LayoutTransition 对ViewGroup中的View改变进行动画显示

LayoutTransition.APPEARING                      view出现时自身view的动画。

LayoutTransition.CHANGE_APPEARING      view出现自身view此之外其他兄弟view的动画

LayoutTransition.DISAPPEARING                 view消失时本身view的动画

LayoutTransition.CHANGE_DISAPPEARING view消失时除自身view以外的兄弟view的动画

LayoutTransition.CHANGING                       不知道是干嘛的,试了好多情况没发现效果

java

public class MainActivity extends Activity {Button mAddBtn;ViewGroup group;//int btn = 0;GridLayout gridLayout = null;LayoutTransition mTransition;@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)protected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.activity_main);group = (ViewGroup) findViewById(R.id.parent);mAddBtn = (Button) findViewById(R.id.add_btn);mAddBtn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {addBtn(arg0);}});gridLayout = new GridLayout(this);gridLayout.setColumnCount(5);group.addView(gridLayout);mTransition = new LayoutTransition();mTransition.setAnimator(LayoutTransition.APPEARING, mTransition.getAnimator(LayoutTransition.APPEARING));mTransition.setAnimator(LayoutTransition.CHANGE_APPEARING, mTransition.getAnimator(LayoutTransition.CHANGE_APPEARING));mTransition.setAnimator(LayoutTransition.DISAPPEARING, mTransition.getAnimator(LayoutTransition.DISAPPEARING));mTransition.setAnimator(LayoutTransition.CHANGE_DISAPPEARING,mTransition.getAnimator(LayoutTransition.CHANGE_DISAPPEARING));mTransition.setAnimator(LayoutTransition.CHANGING, mTransition.getAnimator(LayoutTransition.CHANGING));gridLayout.setLayoutTransition(mTransition);}@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)@SuppressLint("NewApi")private void addBtn(View view) {final Button button = new Button(this);button.setText((++btn) + "");gridLayout.addView(button, Math.min(1, gridLayout.getChildCount()));button.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stubgridLayout.removeView(button);}});}
}



转载于:https://www.cnblogs.com/gmm283029/p/4498934.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/359229.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

注册服务号、订阅号流程

进入微信公众平台,选择注册类型,订阅号/服务号 填写基本信息 选择类型 选择订阅号或者服务号

sql并发 锁 优化思路_并发优化–减少锁粒度

sql并发 锁 优化思路在高负载多线程应用程序中&#xff0c;性能非常重要。 开发人员必须意识到并发问题才能获得更好的性能。 当我们需要并发时&#xff0c;我们通常拥有必须由两个或更多线程共享的资源。 在这种情况下&#xff0c;我们处于竞争状态 &#xff0c;其中只有一个线…

c语言 指针到字符串,C语言中的指针和字符串

前言务必理解指针与内存模型&#xff0c;不要死记硬背。内存里的字符串C语言中的字符串一般是char *类型的&#xff0c;这是怎样存在内存中的呢&#xff1f;cchar *s "NIHAO";| s:400 ||---|---|---|---||N|I|H|A|O| 0 ||---|---|---|---|---|---||400|401|402|403|…

【APICloud系列|33】移动应用软件加固步骤,适合所有的安卓应用市场

在腾讯开放平台下载应用加固工具legutools 下载安装打开 点击获取API密钥。链接: https://cloud.tencent.com/developer/article/1385239 一、登录腾讯云账号

Openjudge-计算概论(A)-放苹果

描述&#xff1a; 把M个同样的苹果放在N个同样的盘子里&#xff0c;允许有的盘子空着不放&#xff0c;问共有多少种不同的分法&#xff1f;&#xff08;用K表示&#xff09;5&#xff0c;1&#xff0c;1和1&#xff0c;5&#xff0c;1 是同一种分法。输入第一行是测试数据的数目…

c语言程序设计徐立辉答案,C语言程序设计 牛志成,徐立辉,刘冬莉著 清华大学出版社 9787302165620...

商品描述&#xff1a;【图书描述】:本书以2008年等级考试新需求为出发点&#xff0c;教学环境升级到了VC6&#xff0e;0平台。特别着重解决当前C语言教学中存在的一些问题和矛盾&#xff0c;在教学内容体系改革、教学过程组织、应对等级考试需要和素质教学实施等多个方面进行了…

怎么把图片内存变小尺寸保持不变呢。

在好多应用平台要求尺寸多少*多少&#xff0c;大小<50kb. 缩小图片的内存占用&#xff0c;但尺寸即分辨率不变&#xff0c;可以改变压缩的质量来实现。下面以PS为例&#xff1a; 1、用PS打开图片&#xff0c;然后选择文件菜单里的存储为&#xff0c;格式选择png。 2、选择…

C#vs Java哪一个更快? 将25k C#转换为Java(2)

在上一篇文章中&#xff0c;我描述了如何将25k行C&#xff03;转换为Java以及从该练习中学到的教训。 我收到以下问题&#xff1a; 顺便说一句很棒的文章。 迁移代码后&#xff0c;性能与C&#xff03;版本相比如何&#xff1f; 改写系统的动机之一是使系统变得更快&#xff…

将 改为c语言表达式,基于c语言表达式求解课程设计修改.doc

基于c语言表达式求解课程设计修改摘 要通过数据结构这门课程&#xff0c;我们较深入的了解到了栈&#xff0c;栈是一种重要的线性结构&#xff0c;它广泛应用于各种软件系统中&#xff0c;因此在面向对象的程序设计中&#xff0c;它们是多型数据类型。本次试验我们将探索表达式…

【Java必备资料包】

适合所有大厂java开发工场师。 链接&#xff1a;https://pan.baidu.com/s/1wRxRDCGvex_G2aCZ6W57vw 提取码&#xff1a;e9xu

SaaS系列介绍之十一: SaaS商业模式分析

1 配置模式 中国企业很多是人治&#xff0c;管理弹性非常大&#xff0c;公司的政策经常变化&#xff0c;管理流程、业务变化也非常大&#xff0c;发展也非常快;一个公司今年是10个人&#xff0c;明年是100个人&#xff0c;后年可能是1000人。管理机制、方法处于经常变化的状态&…

真机x86 android分辨率,Android-x86入门之--启动参数设置

之前的文章里面我也有提到分辨率的设置&#xff0c;这里就详细说下。Android-x86启动的时候有四个选项&#xff0c;大家都知道&#xff0c;第一个是高密度&#xff0c;第二个是低密度&#xff0c;两个启动之后的效果是不一样的&#xff0c;一个图标大&#xff0c;一个小&#x…

【APICloud系列|32】iOS 上架去除Icon图像中的alpha通道或透明度

上架的时候你们有没有遇到过这个问题?? 打开图片的“显示简介”,你会发现有个叫“alpha通道”的东西,(如果是“是”你的图片就不能上架)如下图: 第一种方法 怎样解决。把你的图片用PS打开,如下图选择进行操作:

关于excel中的查找

弹出查找界面后&#xff0c;点击“选项”按钮 在范围下拉框中选择&#xff1a; 1、工作表&#xff1a;表示在当前表sheet中进行查找 2、工作簿&#xff1a;表示在此excel整个文件中进行查找转载于:https://www.cnblogs.com/tonglingliangyong/p/4301873.html

android低电量提示,Android4.4开发之电池低电量告警提示原理与实现方法分析

本文实例讲述了Android4.4电池低电量告警提示原理与实现方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;之前版本的电池电量低是通过发送 intent ACTION_BATTERY_LOW来实现的&#xff0c;而在android4.4中&#xff0c;通过发送intent ACTION_BATTERY_CHANGED&…

网站如何快速搭建即时响应客服系统

首先简单说明一下情况&#xff0c;公司原来的网站是用微起点快速建站做的&#xff0c;几天就搭建完成啦&#xff0c;最近又原生开发了一个大数据网站。 自己在原来的网站搭建了一个客服系统&#xff0c;后来老板不喜欢&#xff0c;我又给取消啦。 直入主题啦 登录百度账号 选…

在NetBeans,Eclipse,IntelliJ,OpenShift和Maven上使用WildFly 9

WildFly 9 CR1是最近发布的。 包括许多很酷的功能&#xff1a; 智能负载均衡 HTTP / 2和SPDY支持 新的离线CLI模式 正常关闭单节点 新的仅Servlet发行版 而且这超出了通常的Java EE 7兼容性&#xff01; 该博客是一个快速检查&#xff0c;以验证它是否可以在所有三个主要…

【CSS】font样式简写(转)- 不是很建议简写

一、字体属性主要包括下面几个 font-family&#xff0c;font-style&#xff0c;font-variant&#xff0c;font-weight&#xff0c;font-size&#xff0c;fontfont-family&#xff08;字体族&#xff09;: “Arial”、“Times New Roman”、“宋体”、“黑体”等;font-style&…

Spring boot的简单用法

打算通过写一系列的文章,让大家能够认识SpringBoot,通过对SpringBoot的入门学习后,在通过一个示例Demo来让大家能够真正上手SpringBoot。 适合人群: 1、有一定Java基础的朋友 2、适合初中级的朋友。 1.什么是Spring Boot 来源官方文档: Spring Boot makes it…

android 布局防抖动,Android全屏返回布局抖动问题

在api19以后actvityA切到actvityB &#xff0c;如果B是全屏的&#xff0c;A是非全屏的&#xff0c;这个时候切换回A会有一个状态栏出现的动画&#xff0c;随着状态栏出现动画我们的布局会出现一个从上往下的抖动。在ActvityA的setContentView()方法后调用initStatusBar()方可解…