动画机制与使用

Android3.0之前有两种动画,一种方式是补间动画 Tween Animation、另一种叫逐帧动画 Frame Animation(也称Drawable Animation )Android3.0以后增加了属性动画 Property Animation。Tween Animation、Frame Animation只能用于View,被归类为View Animation

一、1、View Animation

视图动画提供:AlphaAnimation、RotateAniamtion、TranslateAniamtion、ScaleAnimation四种动画方式。

<1>AlphaAnimation透明度动画

public class

AlphaAnimation

extends Animation
java.lang.Object
   ↳android.view.animation.Animation

   ↳android.view.animation.AlphaAnimation
AlphaAnimation(float fromAlpha, float toAlpha),0为全透明,1为不透明。

<span style="font-size:18px;">AlphaAnimation alphaAnimation = new AlphaAniamtion(0,1);
alphaAnimation.setDuration(1000);
view.startAnimation(alphaAnimation);</span>

res/anim/

<span style="font-size:18px;"><alpha
android:fromAlpha="0.0"
android:toAlpha="1.0"/></span>

<2>RotateAnimation旋转动画

public class

RotateAnimation

extends Animation
java.lang.Object
   ↳android.view.animation.Animation

   ↳android.view.animation.RotateAnimation
常用的构造函数:

RotateAnimation(float fromDegrees, float toDegrees)
Constructor to use when building a RotateAnimation from code.

RotateAnimation(float fromDegrees, float toDegrees, float pivotX, float pivotY)
Constructor to use when building a RotateAnimation from code
RotateAnimation(float fromDegrees, float toDegrees, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)
Constructor to use when building a RotateAnimation from code

<span style="white-space:pre">		</span>btn = (Button)findViewById(R.id.b);rotateAnimation2 = new RotateAnimation(0f,1080f,RotateAnimation.RELATIVE_TO_SELF,0.5f,RotateAnimati	on.RELATIVE_TO_SELF,0.5f);btn.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {// TODO Auto-generated method stubrotateAnimation2.setInterpolator(new OvershootInterpolator());rotateAnimation2.setDuration(3000);btn.setAnimation(rotateAnimation2);btn.startAnimation(rotateAnimation2);}			});

res/anim

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"android:fromDegrees="0"android:pivotX="50%"android:pivotY="50%"android:toDegrees="1080.0"><shapeandroid:innerRadiusRatio="3"android:shape="ring"android:thicknessRatio="8"android:useLevel="false"><gradientandroid:endColor="#2F90BD"android:startColor="#FFFFFF"android:type="sweep" /></shape>
</rotate>
<!-- 放在anim文件夹下,AnimationUtils.loadAnimation(this, R.anim.shape_ring);
image.startAnimation(animation);   
<3>TranslateAniamtion位移动画

public class

TranslateAnimation

extends Animation
java.lang.Object
   ↳android.view.animation.Animation

   ↳android.view.animation.TranslateAnimation
常用构造函数:

TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta)
Constructor to use when building a TranslateAnimation from code

TranslateAnimation(int fromXType, float fromXValue, int toXType, float toXValue, int fromYType, float fromYValue, int toYType, float toYValue)
Constructor to use when building a TranslateAnimation from code

<span style="font-size:18px;">TranslateAnimation translateAnimation = new TranslateAnimation(0,200,0,300);
translationAnimation.setDuration(1000);
view.startAniamtion(translateAniamtion);</span>
res/anim

<span style="font-size:18px;"> <translate  android:fromXDelta="float"  android:toXDelta="float"  android:fromYDelta="float"  android:toYDelta="float" /> </span>
<4>ScaleAniamtion缩放动画

public class

ScaleAnimation

extends Animation
java.lang.Object
   ↳android.view.animation.Animation

   ↳android.view.animation.ScaleAnimation
常用构造函数:

ScaleAnimation(float fromX, float toX, float fromY, float toY)
Constructor to use when building a ScaleAnimation from code

ScaleAnimation(float fromX, float toX, float fromY, float toY, float pivotX, float pivotY)
Constructor to use when building a ScaleAnimation from code
ScaleAnimation(float fromX, float toX, float fromY, float toY, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)
Constructor to use when building a ScaleAnimation from code

ScaleAniamtion scaleAniamtion = new ScaleAniamtion(0,1,0,1,Animation.RELATIVE_TO_SELF,0.5F,Animation.RELATIVE_TO_SELF,0.5F);
scaleAniamtion.setDuration(1000);
view.startAniamtion(scaleAnimation);
res/anim
<scale  android:fromXScale="float"  android:toXScale="float"  android:fromYScale="float"  android:toYScale="float"  android:pivotX="float"  android:pivotY="float" />
动画集合AnimationSet

public class

AnimationSet

extends Animation
java.lang.Object
   ↳android.view.animation.Animation

   ↳android.view.animation.AnimationSet
构造函数:
AnimationSet(boolean shareInterpolator)
Constructor to use when building an AnimationSet from code
AnimationSet set = new AnimationSet(true);button2 = (Button)findViewById(R.id.b5);button2.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v){set.addAnimation(alphaAnimation);set.addAnimation(rotateAnimation);set.setDuration(3000);button2.startAnimation(set);}});//动画集
res/anima
<?xml version="1.0" encoding="utf-8"?>  
<set xmlns:android="http://schemas.android.com/apk/res/android"  android:interpolator="@[package:]anim/interpolator_resource"  android:shareInterpolator=["true" | "false"] >  <alpha  android:fromAlpha="float"  android:toAlpha="float" />  <scale  android:fromXScale="float"  android:toXScale="float"  android:fromYScale="float"  android:toYScale="float"  android:pivotX="float"  android:pivotY="float" />  <translate  android:fromXDelta="float"  android:toXDelta="float"  android:fromYDelta="float"  android:toYDelta="float" />  <rotate  android:fromDegrees="float"  android:toDegrees="float"  android:pivotX="float"  android:pivotY="float" />  <set>  ...  </set>  
</set>  
在java代码中使用:

ImageView spaceshipImage = (ImageView) findViewById(R.id.spaceshipImage);  
Animation hyperspaceJumpAnimation = AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump);  
spaceshipImage.startAnimation(hyperspaceJumpAnimation); 
2、Drawable Animation逐帧动画

可以使用多幅图片实现动画效果。

首先定义一个以 <animation-list>为根节点的xml文件,命名为 anim.xml 放在 res/drawable/目录下。

<animation-list xmlns:android="http://schemas.android.com/apk/res/android"  android:oneshot="true">  <item android:drawable="@drawable/image1" android:duration="200" />  <item android:drawable="@drawable/image2" android:duration="200" />  <item android:drawable="@drawable/image3" android:duration="200" />  
</animation-list>
对控件中使用此动画:

ImageView image = (ImageView) findViewById(R.id.rocket_image);  
image.setBackgroundResource(R.drawable.rocket_thrust);  
AnimationDrawable animation = (AnimationDrawable) image.getBackground(); 
animation.start();

3、视图动画的监听

animation.setAnimationListener(new AnimationListener(){@Overridepublic void onAnimationStart(Animation animation) {// TODO Auto-generated method stub}@Overridepublic void onAnimationEnd(Animation animation) {// TODO Auto-generated method stubmHandler.post(new Runnable(){@Overridepublic void run() {// TODO Auto-generated method stubIntent intent = new Intent(WelcomActivity.this,MainActivity.class);startActivity(intent);WelcomActivity.this.finish();}});}

视图动画实现原理:每次绘制视图时,View所在的ViewGroup中的drawChild()函数获取该View的Animation的Transformation值,然后调用canvas.concat(transformToApply.getMatrix());通过矩阵完成动画帧。若动画没有完成就调用invalidate()函数,启动下次绘制来驱动动画,从而完成整个动画绘制。

视图动画一个非常大的缺陷:当view发生视图动画后,其相应事件的位置还在动画前的地方,不具备交互性。优点:效率高、使用方便。

二、PropertyAnimation属性动画

PropertyAnimation是通过修改控件的属性实现的动画,基本上可以实现所有动画效果,并且可以交互。

常用的属性动画:ObjectAnimator、AnimatorSet(PropertyValuesHolder也可以实现类似效果)、ValueAnimator、TimeAnimator...

1、ObjectAnimator

public final class

ObjectAnimator

extends ValueAnimator
java.lang.Object
   ↳android.animation.Animator

   ↳android.animation.ValueAnimator


   ↳android.animation.ObjectAnimator
ObjectAnimator是属性动画框架中最重要的实行类,创建:通过静态工厂类直接返回一个ObjectAnimator对象.

static <T> ObjectAnimatorofFloat(T target,Property<T, Float> property, float... values)
Constructs and returns an ObjectAnimator that animates between float values.
static ObjectAnimatorofFloat(Object target,String propertyName, float... values)
Constructs and returns an ObjectAnimator that animates between float values.
static <T> ObjectAnimatorofInt(T target,Property<T, Integer> property, int... values)
Constructs and returns an ObjectAnimator that animates between int values.
static ObjectAnimatorofInt(Object target,String propertyName, int... values)
Constructs and returns an ObjectAnimator that animates between int values.
static <T, V> ObjectAnimatorofObject(T target,Property<T, V> property,TypeEvaluator<V> evaluator, V... values)
Constructs and returns an ObjectAnimator that animates between Object values.
static ObjectAnimatorofObject(Object target,String propertyName, TypeEvaluator evaluator,Object... values)
Constructs and returns an ObjectAnimator that animates between Object values.
static ObjectAnimatorofPropertyValuesHolder(Object target,PropertyValuesHolder... values)
Constructs and returns an ObjectAnimator that animates between the sets of values specified inPropertyValueHolder objects.

objectAnimator = ObjectAnimator.ofFloat(view, "translationX", 300);
参数包括一个实施动画的对象target(eg.view),target的属性名(eg.translationX),第三个参数是一个可变数组参数,传入该属性值变化的过程,但这个属性必须有get和set函数,否则ObjectAnimator无法有作用,内部会通过java反射机制来调用set函数修改对象的属性值。
例:平移动画

objectAnimator = ObjectAnimator.ofFloat(view, "translationX", 300);
objectAnimator.setRepeatCount(3);//ObjectAnimator.INFINITE
//objectAnimator.setDuration(3000);//设置setRepeatCount后Duration不起作用了
objectAnimator.start();
常用的可以直接使用的属性动画的属性值:

  • translationX、translationY:作为一种增量控制View对象从它布局容器的左上角坐标偏移的位置。
  • rotation、rotationX、rotationY:target绕它的支点进行2D、3D旋转。
  • scaleX、scaleY:target绕它的支点进行2D缩放。
  • pivotX、pivotY:控制这target的支点位置,围绕这个支点进行旋转和缩放处理。默认是target的中心。
  • x、y:描述target在容器中的最终位置,是最初的左上角坐标和translationX、translationY值的和。
  • alpha:target的透明度。默认1(不透明),0(完全透明,不可见)。

如果想要作用动画的对象没有get和set方法,可以通过自定义一个属性类或包装类间接的给这个属性添加get和set方法:为target添加一个height属性:

package sunny.example.helloandroidheroesxmlshape;
//自定义一个包装类,间接给要进行动画的view增加它本身没有的get、set属性
import android.view.View;
public class WrapperView {private View mTarget;public WrapperView(View v){this.mTarget = v;}public int getHeight(){return mTarget.getLayoutParams().height;}public void setHeight(int height){mTarget.getLayoutParams().height = height;mTarget.requestLayout();}
}
使用height属性:
objectAnimator1 = ObjectAnimator.ofInt(viewWrapper, "height", 100);//
objectAnimator1.setDuration(3000).start();
2、ValueAniamtor

public class

ValueAnimator

extends Animator
java.lang.Object
   ↳android.animation.Animator

   ↳android.animation.ValueAnimator
创建对象:
static ValueAnimatorofFloat(float... values)
Constructs and returns a ValueAnimator that animates between float values.
static ValueAnimatorofInt(int... values)
Constructs and returns a ValueAnimator that animates between int values.
static ValueAnimatorofObject(TypeEvaluator evaluator,Object... values)
Constructs and returns a ValueAnimator that animates between Object values.
static ValueAnimatorofPropertyValuesHolder(PropertyValuesHolder... values)
Constructs and returns a ValueAnimator that animates between the values specified in the PropertyValuesHolder objects.
ValueAnimator是属性动画的核心所在,其本身不提供任何动画效果,更像一个数值发生器,用来产生具有移动规律的数字从而让调用者来控制动画的实现过程:

ValueAniamtor valueAnimator = ValueAniamtor.ofFloat(0,100);
animator.setTarget(view);
animator.setDuration(3000).start();
aniamtor.addUpdateListener(new AnimatorUpdateListaner(){
@Override
public void onAniamtionUpdate(ValueAnimator animation){
Float value = (Float)animation.getAnimatedValue();}
});
3、AnimatorSet

public final class

AnimatorSet

extends Animator
java.lang.Object
   ↳android.animation.Animator

   ↳android.animation.AnimatorSet

对一个target的属性作用多个动画效果,并可以控制各个动画执行顺序:

ObjectAniamtor animator1 = ObjectAnimator.ofFloat(view,"translationX",300f);
ObjectAnimator animator2 = ObjectAnimator.ofFloat(view,"scaleX",1f,0f,1f);
AnimationSet set = new AnimationSet();
set.setDuration(3000);
//set.play(animator1).after(animator2);
//set.playTogether(animator1,animator2);
//set.play(animator1).before(animator2);
//set.play(animator1).before(animator2).before(animator3);//此时时animator1结束后会同时play animator2和3
set.playSequentially(animator1,animator2);//1结束后执行2
set.start();
4、PropertyValuesHolder

public class

PropertyValuesHolder

extends Object
implements Cloneable

类似视图动画AnimationSet,可以对target的多个属性作用动画:
h1 = PropertyValuesHolder.ofFloat("translationX", 300f);
h2 = PropertyValuesHolder.ofFloat("scaleY", 1f,0.5f);
h3 = PropertyValuesHolder.ofInt("alpha", 0,1);
ObjectAnimator.ofPropertyValuesHolder(view1,h1,h2,h3).start();

5、动画事件的监听

objectAnimator1.addListener(new AnimatorListener(){@Overridepublic void onAnimationStart(Animator animation) {// TODO Auto-generated method stub}@Overridepublic void onAnimationEnd(Animator animation) {// TODO Auto-generated method stub}@Overridepublic void onAnimationCancel(Animator animation) {// TODO Auto-generated method stub}@Overridepublic void onAnimationRepeat(Animator animation) {// TODO Auto-generated method stub}});


6、在XML中使用属性动画:

<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"android:duration="1000"android:propertyName="scaleX"android:valueFrom="1.0"android:valueTo="2.0"android:valueType="floatType" ></objectAnimator>
在程序中使用XML中定义的动画:

public void scaleX(View v){
Animator ani = AnimatorInflater.loadAnimator(this,R.animator.scaleX);
ani.setTarget(mButton);
ani.start();}
github:https://github.com/HiSunny/HelloAnimation.git







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

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

相关文章

1、HTTP--Web's foundation

1、1 HTTP(HyperText Transfer Protocol)超文本传输协议----Internet的多媒体信使 1、2 Web客户端和服务器 Web内容都是存储在Web服务器上的&#xff0c;Web服务器使用的是HTTP协议&#xff0c;因此常被成为HTTP服务器。HTTP服务器和HTTP客户端共同构成World Wide Web的基本组…

IP地址分类及ISO-OSI、三次握手

1. A类地址A类地址的表示范围为&#xff1a;0.0.0.0~126.255.255.255(00000000~01111110)&#xff0c;最前面一位是“0”&#xff0c;用7位&#xff08;bit&#xff09;来标识网络号&#xff0c;24位标识主机号&#xff1b;默认网络掩码为&#xff1a;255.0.0.0&#xff0c;111…

drools 决策表_骆驼和春天的Drools决策表

drools 决策表正如我在之前的文章中所展示的那样&#xff0c; JBoss Drools是一个非常有用的规则引擎 。 唯一的问题是&#xff0c;对于非技术人员而言&#xff0c;以Rule语言创建规则可能会非常复杂。 这就是为什么人们可以提供一种简便的方法来创建业务规则-在电子表格中创建…

Thinking in Java方法签名

方法名和参数&#xff08;即&#xff0c;方法签名&#xff09;唯一标识某个方法&#xff1a;如&#xff0c; public void add(int a,int b){ } //这两个方法的方法签名一样&#xff0c;是不能在同一.java里的&#xff0c;编译通不过 public int add(int a,intb){ return a b; …

在Java中处理异常

每个程序员都希望编写一个完美的程序。 也就是说&#xff0c;程序运行时没有任何障碍。 好吧&#xff0c;如果希望是马&#xff0c;乞g就会骑。 除了程序员的所有愿望之外&#xff0c;有时还会发生无法预料的情况。 这些不可预见的情况在Java中通常被归类为“例外”。 异常会…

通信系统的组成

数字通信模型&#xff1a; http://blog.csdn.net/yaosiming2011/article/details/44280797 进程和线程

存储卡显示0字节怎么办?恢复0字节的存储小技巧

存储卡显示0字节是一个常见的故障现象&#xff0c;可能由多种原因引起。本文将详细分析存储卡出现此类问题的各种原因&#xff0c;并提供针对性的解决方法。通过深入了解这些原因和解决方案&#xff0c;读者可以有效地应对存储卡显示0字节的故障&#xff0c;从而恢复存储卡的正…

OSI模型和TCP/IP协议族

1、协议分层 两个实体之间要进行通信就需要有一个协议。而当通信比较复杂时就有必要将这个复杂的任务划分为多层&#xff0c;就需要有多个协议&#xff0c;每一层都有自己的协议。 2、ISO 国际标准化组织&#xff08;International Standard Organization &#xff0c; ISO&…

亚马逊s3的使用方法_使用jclouds库在Amazon S3上上传

亚马逊s3的使用方法在Java世界中&#xff0c;有几种很好的方法可以将内容上传到S3存储桶-在本文中&#xff0c;我们将研究jclouds库为此提供的功能。 要使用jclouds –特别是本文中讨论的API&#xff0c;应将此简单的Maven依赖项添加到项目的pom中&#xff1a; <dependency…

在PhotoShop中改像素m*n

快捷键&#xff1a;CtrlAlti&#xff0c;如图&#xff0c;改为28*28

Spring Boot Redis简介

1.概述 在本文中&#xff0c;我们将通过Spring Data Redis库回顾如何将Redis与Spring Boot结合使用的基础知识。 我们将构建一个应用程序&#xff0c;演示如何通过Web界面执行CRUD操作Redis 。 Github上提供了该项目的完整源代码。 2.什么是Redis&#xff1f; Redis是一个开源…

Dijkstra-解决最短路径问题

1、从A开始&#xff08;也可以从其他点&#xff0c;此处选择从A&#xff09; 将A 加入树&#xff0c;A被圈红 列出最短路径数组&#xff1a; 2、 确定从A到其他顶点的最短距离为50&#xff0c;A-->B 将B加入树&#xff1a; 更新最短路径数组&#xff1a; 比较到C的距离&a…

jackson使用_如何在Jackson中使用PropertyNamingStrategy

jackson使用Jackson api被广泛用于将json转换为Object并将Object转换为JSON。因此&#xff0c;如果您有json字符串并想在java对象中进行转换&#xff0c;请创建与json中的字段相同的bean的字段名。 Jackson在将json字段映射到java对象字段时遵循标准的bean约定&#xff0c;但是…

简单排序--冒泡排序

冒泡排序&#xff1a; public void sort(){int out,in;//out指向已经排好序的前一个for( outnElements-1;out>1;out--){for(in0;in<out;in){if(arr[in]>arr[in1]){swap(in,in1);//相邻的两个元素比较&#xff0c;交换}}}}//实现冒泡排序相邻的元素两两比较&#xff0c…

jca使用_使用JCA的密码学–提供者中的服务

jca使用Java密码体系结构&#xff08;JCA&#xff09;是一个可扩展的框架&#xff0c;使您能够使用执行加密操作。 JCA还促进实现独立性&#xff08;程序不应该在乎谁提供加密服务&#xff09;和实现互操作性&#xff08;程序不应该与特定加密服务的特定提供者联系在一起&#…

简单排序--选择排序

选择排序&#xff1a; public void sort(){int out,in,min;for(out0;out<nElements-1;out){min out;for(inout1;in<nElements;in)if(arr[in]<arr[min])min in;swap(out,min);//将min放在out位置&#xff0c;out始终指向最小值的下一个位置&#xff0c;即下一个min要…

Java 9模块服务

接线与查找 Java长期以来都有一个ServiceLoader类。 它是在1.6中引入的&#xff0c;但是自Java 1.2以来就使用了类似的技术。 一些软件组件使用了它&#xff0c;但是使用并不广泛。 它可以用于模块化应用程序&#xff08;甚至更多&#xff09;&#xff0c;并提供一种使用应用程…

简单排序--插入排序

插入排序&#xff1a; public void sort(){int in,out,temp;for(out1;out<nElements;out){temp arr[out];in out;while(in>0&&arr[in-1]>temp){arr[in] arr[in-1];//待插入的数据比其之前的数字大的右移&#xff0c;从小到大排序--in;//依次左移}arr[in] …

ejb 2.1 jboss_JBoss AS 8中的Java EE 7和EJB 3.2支持

ejb 2.1 jboss你们中有些人可能已经知道Java EE 7规范的Public Final Draft版本已经发布 。 除此以外&#xff0c;此版本的Java EE还引入了EJB规范的EJB 3.2版本。 与EJB 3.1规范相比&#xff0c;EJB 3.2具有一些新功能。 我在这里引用EJB 3.2规范中的文本&#xff0c;总结了新…