69.补间动画和属性动画
来源:互联网 发布:lca算法建模 编辑:程序博客网 时间:2024/06/03 22:57
补间动画:动画由最初始的形态向最终的状态变化的过程中,为了让渐变的过程更加自然,而生成的动画。并没有真正改变图形的位置,真实的位置没有变,只是显示的地方变了而已.
位移动画:
//定义位移动画
TranslateAnimation ta = new TranslateAnimation(10, 100, 10, 100);
第一个参数表示x左边的起始位置,相对于组件的而言,iv的真实x位置+10;
第二个参数表示x坐标的结束位置,相对于组件而言,iv的真实x位置+100;
第三个参数表示y左边的起始位置,相对于组件的而言,iv的真实y位置+10;
第四个参数表示y坐标的结束位置,相对于组件而言,iv的真实y位置+100;
位移动画还有一个八个参数的函数
TranslateAnimation ta = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 1, Animation.RELATIVE_TO_SELF, 2,
Animation.RELATIVE_TO_SELF, 1, Animation.RELATIVE_TO_SELF, 2);
Animation.RELATIVE_TO_SELF, 1:x坐标的初始位置:相对于组件而言,iv的真实x位置+1*iv宽;
下面的3个类似,都是2个一组的,数字代表宽度或者高度的倍数,0.5f表示0.5个宽度float类型
RELATIVE_TO_SELF:相对于自己
RELATIVE_TO_PARENT:相对于父元素
缩放动画:
ScaleAnimation sa = new ScaleAnimation(1, 3, 0.2f, 3);
前两个参数表示:x从1倍放大到3倍,
后两个参数表示:y从0.2倍放大到3倍
这个函数的缩放点在左上角
ScaleAnimation sa = new ScaleAnimation(1, 3, 1, 3, iv.getWidth()/2, iv.getHeight()/2);
前4个参数是一样的,后两个参数表示缩放点,这里设置在iv的正中间进行缩放
ScaleAnimation sa = new ScaleAnimation(1, 3, 1, 3, Animation.RELATIVE_TO_SELF,0.5f,
Animation.RELATIVE_TO_SELF, 0.5f);
前四个参数是一致的,后面4个参数2个一组,表示缩放点的左边iv的真实大小乘以倍数,第一组是x,第二组是y,这里是以中心为缩放点
补间动画范例
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" android:orientation="horizontal" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="平移" android:onClick="translate" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="缩放" android:onClick="scale" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="透明" android:onClick="alpha" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="透明" android:onClick="alpha" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="多个特效" android:onClick="multiple" /> </LinearLayout><ImageView android:id="@+id/iv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_launcher" /></LinearLayout>
MainActivity.java
package com.ldw.move;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.animation.AlphaAnimation;import android.view.animation.Animation;import android.view.animation.AnimationSet;import android.view.animation.RotateAnimation;import android.view.animation.ScaleAnimation;import android.view.animation.TranslateAnimation;import android.widget.ImageView;public class MainActivity extends Activity {private ImageView iv;private TranslateAnimation ta;private ScaleAnimation sa;private AlphaAnimation aa;private RotateAnimation ra; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); iv = (ImageView) findViewById(R.id.iv); } //位移动画 public void translate(View v){ //定义位移动画(x0,x1,y0,y1) //TranslateAnimation ta = new TranslateAnimation(10, 100, 10, 100); //下面一种是2个参数一组,数字代表平移距离,iv宽度*数字 ta = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 1, Animation.RELATIVE_TO_SELF, 2, Animation.RELATIVE_TO_SELF, 1, Animation.RELATIVE_TO_SELF, 2); //动画的持续时间 ta.setDuration(3000); //设置重复的次数 ta.setRepeatCount(2); //重复的时候反向运动 ta.setRepeatMode(Animation.REVERSE); iv.startAnimation(ta); } //缩放动画 public void scale(View v){ //定义缩放动画,(x0,x1,y0,y1),缩放点在左上角 //ScaleAnimation sa = new ScaleAnimation(1, 3, 0.2f, 3); //自定义缩放,前4个参数的意思是一样的,后2个参数是缩放点,这里设置成中间 //ScaleAnimation sa = new ScaleAnimation(1, 3, 1, 3, iv.getWidth()/2, iv.getHeight()/2); //前四个参数是一致的,后面4个参数2个一组,表示缩放点的左边iv的真实大小乘以倍数 sa = new ScaleAnimation(1, 3, 1, 3, Animation.RELATIVE_TO_SELF,0.5f, Animation.RELATIVE_TO_SELF, 0.5f); //填充动画的结束位置,动画停留在结束的位置 sa.setFillAfter(true); //缩放的次数 sa.setRepeatCount(2); sa.setRepeatMode(Animation.REVERSE); iv.startAnimation(sa); } //透明 public void alpha(View v){ //由全透明到半透明 aa = new AlphaAnimation(0, 0.5f); aa.setDuration(3000); iv.setAnimation(aa); } //旋转 public void rotate(View v){ //由20度旋转到180度,旋转中心点默认左上角 //RotateAnimation ra = new RotateAnimation(20, 180); //由20度旋转到180度,旋转中心点默认中心 //RotateAnimation ra = new RotateAnimation(20, 180, iv.getWidth()/2, iv.getHeight()/2); //由20度旋转到180度,旋转中心点默认左上角 ra = new RotateAnimation(20, 180, Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 0); ra.setDuration(3000); iv.setAnimation(ra); } //多个特效一起使用 public void multiple(View v){ //定义动画特效集合,参数true表示使用集合的校对器,false表示使用自己的校对器 AnimationSet set = new AnimationSet(false); set.addAnimation(ta); set.addAnimation(sa); set.addAnimation(aa); set.addAnimation(ra); iv.setAnimation(set); }}
属性动画
属性动画真实的改变了组件的属性,设置特效时,一次只能实现一个的变化,想多次变化,需要进行组合.
属性动画可以通过xml文件来定义,在res文件夹下面创建一个animator的文件夹,再创建一个安卓xml文件,type是Property Animation,如下
<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android" ><objectAnimator android:propertyName="translationX" android:duration="200" android:repeatCount="1" android:repeatMode="reverse" android:valueFrom="-100" android:valueTo="100" > </objectAnimator></set>
使用的方法是
public void xml(View v){Animator at = AnimatorInflater.loadAnimator(this, R.animator.objanimator);//设置作用于哪个组件at.setTarget(iv);at.start();}
属性动画范例
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" > <LinearLayout android:id="@+id/ll" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="平移" android:onClick="translate" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="缩放" android:onClick="scale" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="透明" android:onClick="alpha" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="旋转" android:onClick="rotate" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="一起飞" android:onClick="fly" /></LinearLayout> <Button android:layout_below="@id/ll" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="xml定义的属性动画" android:onClick="xml" /> <ImageView android:id="@+id/iv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_launcher" android:layout_centerInParent="true" /></RelativeLayout>MainActivity.java
package com.itheima.objectanimator;import android.os.Bundle;import android.animation.Animator;import android.animation.AnimatorInflater;import android.animation.AnimatorSet;import android.animation.ObjectAnimator;import android.animation.ValueAnimator;import android.app.Activity;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.view.animation.TranslateAnimation;import android.widget.ImageView;import android.widget.Toast;public class MainActivity extends Activity {private ImageView iv;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);iv = (ImageView) findViewById(R.id.iv);iv.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(MainActivity.this, "点不到我", 0).show();}});}public void translate(View v){//TranslateAnimation ta = new TranslateAnimation(0, 150, 0, 0);//ta.setDuration(2000);//ta.setFillAfter(true);//iv.startAnimation(ta);//target:动画作用于哪个组件,这里是改变x的坐标,一次只能改变一个坐标(x或者y),下面的参数的意思是x坐标先从10到70到20最后到100ObjectAnimator oa = ObjectAnimator.ofFloat(iv, "translationX", 10, 70, 20, 100);oa.setDuration(2000);oa.setRepeatCount(1);oa.setRepeatMode(ValueAnimator.REVERSE);oa.start();}//大小的改变public void scale(View v){ObjectAnimator oa = ObjectAnimator.ofFloat(iv, "scaleX", 1, 1.6f, 1.2f, 2);oa.setDuration(2000);oa.start();}public void alpha(View v){ObjectAnimator oa = ObjectAnimator.ofFloat(iv, "alpha", 0, 0.6f, 0.2f, 1);oa.setDuration(2000);oa.start();}public void rotate(View v){ObjectAnimator oa = ObjectAnimator.ofFloat(iv, "rotationY", 0, 180, 90, 360);oa.setDuration(2000);oa.setRepeatCount(1);oa.setRepeatMode(ValueAnimator.REVERSE);oa.start();}//多个特效一起public void multiple(View v){AnimatorSet set = new AnimatorSet();ObjectAnimator oa1 = ObjectAnimator.ofFloat(iv, "translationX", 10, 70, 20, 100);oa1.setDuration(2000);oa1.setRepeatCount(1);oa1.setRepeatMode(ValueAnimator.REVERSE);ObjectAnimator oa2 = ObjectAnimator.ofFloat(iv, "translationY", 10, 70, 20, 100);oa2.setDuration(2000);oa2.setRepeatCount(1);oa2.setRepeatMode(ValueAnimator.REVERSE);ObjectAnimator oa3 = ObjectAnimator.ofFloat(iv, "scaleX", 1, 1.6f, 1.2f, 2);oa3.setDuration(2000);oa3.setRepeatCount(1);oa3.setRepeatMode(ValueAnimator.REVERSE);ObjectAnimator oa4 = ObjectAnimator.ofFloat(iv, "rotation", 0, 180, 90, 360);oa4.setDuration(2000);oa4.setRepeatCount(1);oa4.setRepeatMode(ValueAnimator.REVERSE);//设置特效一个个执行//set.playSequentially(oa1, oa2, oa3, oa4);//设置特效一起执行set.playTogether(oa1, oa2, oa3, oa4);set.start();}public void xml(View v){Animator at = AnimatorInflater.loadAnimator(this, R.animator.objanimator);//设置作用于哪个组件at.setTarget(iv);at.start();}}
- 69.补间动画和属性动画
- 补间动画和属性动画
- 属性动画和补间动画
- 帧动画,补间动画,和属性动画
- Android属性动画和View动画(补间动画)
- 补间动画,属性动画
- 补间&属性动画
- 属性动画,补间动画,帧动画
- 帧动画、补间动画、属性动画
- 帧动画&补间动画&属性动画
- 属性动画、帧动画、补间动画
- Android中属性动画和补间动画的区别
- 简单的平移属性动画和补间动画区别
- Android中属性动画和补间动画的区别
- Android中属性动画和补间动画的区别
- 补间动画和属性动画的用法
- Android中属性动画和补间动画的区别
- android中的动画:帧动画、补间动画、属性动画
- swift3自定义下拉刷新控件(一)
- 简单工厂模式,工厂方法模式,抽象工厂模式
- [Leetcode] 22. Generate Parentheses
- GUI编程
- [LeetCode] 73. Set Matrix Zeroes
- 69.补间动画和属性动画
- Android 多媒体 通过MediaRecorder+SurfaceView实现拍照,录像
- 74. Search a 2D Matrix
- [学习交流] OC学习笔记之id类型及应用场景
- 网络编程
- gvim 操作
- [网易内推编程题] 地牢逃脱
- [LeetCode] 74. Search a 2D Matrix
- Android实现闹钟,通过AlarmManager+BroadcastReceiver(广播)