Android的三种动画
Android动画详解
- 帧动画
- 补间动画
- 属性动画
帧动画
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"android:oneshot="false"><itemandroid:drawable="@mipmap/one"android:duration="500"/><itemandroid:drawable="@mipmap/two"android:duration="500"/><itemandroid:drawable="@mipmap/three"android:duration="500"/><itemandroid:drawable="@mipmap/four"android:duration="500"/><itemandroid:drawable="@mipmap/five"android:duration="50"/><itemandroid:drawable="@mipmap/six"android:duration="50"/>
</animation-list>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><Buttonandroid:layout_height="wrap_content"android:layout_width="match_parent"android:text="开始"android:id="@+id/start"android:layout_marginTop="20dp"android:onClick="onStart"/><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="20dp"android:id="@+id/stop"android:text="停止"android:onClick="onStop"/><ImageViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop ="20dp"android:id="@+id/imageView"/></LinearLayout>
public class FrameAnimationActivity extends AppCompatActivity {private AnimationDrawable animationDrawable; //此处写错了 写成了Animationprivate ImageView imageView;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.frame_activity);init();}private void init(){imageView = (ImageView)findViewById(R.id.imageView);imageView.setBackgroundResource(R.drawable.frame_anim);animationDrawable = (AnimationDrawable) imageView.getBackground();}public void onStart(View view){if(animationDrawable != null && !animationDrawable.isRunning()){animationDrawable.start();}}public void onStop(View view){if(animationDrawable != null && animationDrawable.isRunning()){animationDrawable.stop();}}
}
补间动画
<?xml version="1.0" encoding="utf-8" ?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"android:interpolator="@android:anim/accelerate_decelerate_interpolator"android:fromAlpha="0"android:toAlpha="1"android:duration="4000"/><!-- interpolator:表示采用这个算法,设置动画播放的平缓的程度 -->
<!-- fromAlpha:初始透明度-->
<!-- toAlpha:最终透明度-->
<?xml version="1.0" encoding="utf-8" ?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"android:interpolator="@android:anim/accelerate_decelerate_interpolator"android:fromYScale="0"android:fromXScale="0"android:toXScale="1"android:toYScale="1"android:pivotY="0"android:pivotX="100%"android:duration="3000"/><!-- 缩放的的基点 pivotX和pivotY 如果在百分号数值后面加一个p,就是控件左上角加上父控件百分之多少的值-->
<!-- fromYScale:初始Y轴的缩放比例-->
<!-- fromXScale:初始X轴的缩放比例-->
<!-- toYScale:最终Y轴的缩放比例-->
<!-- toXScale:最终X轴的缩放比例-->
<?xml version="1.0" encoding="utf-8" ?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"android:interpolator="@android:anim/accelerate_decelerate_interpolator"android:pivotX="50%"android:pivotY="30%"android:fromDegrees="0"android:toDegrees="360"android:duration="3000"/><!-- 旋转的的基点 pivotX和pivotY 如果在百分号数值后面加一个p,就是控件左上角加上父控件百分之多少的值-->
<?xml version="1.0" encoding="utf-8" ?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"android:interpolator="@android:anim/accelerate_decelerate_interpolator"android:fromXDelta="0"android:fromYDelta="0"android:toYDelta="500"android:toXDelta="500"android:duration="3000"/>
<?xml version="1.0" encoding="utf-8" ?>
<set xmlns:android="http://schemas.android.com/apk/res/android"android:interpolator="@android:anim/accelerate_decelerate_interpolator"android:shareInterpolator="true"><scaleandroid:pivotY="50%"android:pivotX="50%"android:fromXScale="0"android:fromYScale="0"android:toYScale="1"android:toXScale="1"android:duration="1000"/><!-- 会覆盖前面的scale动画--><scaleandroid:pivotY="50%"android:pivotX="50%"android:fromXScale="1"android:fromYScale="1"android:toYScale="0"android:toXScale="0"android:duration="1000"/><alphaandroid:fromAlpha="0"android:toAlpha="1"android:duration="1000"/>
</set>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><Buttonandroid:layout_height="wrap_content"android:layout_width="match_parent"android:text="透明动画"android:onClick="onAlpha"android:layout_marginTop="20dp"/><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="20dp"android:onClick="onScale"android:text="缩放动画"/><Buttonandroid:layout_height="wrap_content"android:layout_width="match_parent"android:layout_marginTop="20dp"android:onClick="onRotate"android:text="旋转动画"/><Buttonandroid:layout_height="wrap_content"android:layout_width="match_parent"android:layout_marginTop="20dp"android:onClick="onTranslate"android:text="位移动画"/><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="20dp"android:onClick="onSet"android:text="动画组合"/><ImageViewandroid:layout_height="wrap_content"android:layout_width="wrap_content"android:layout_marginTop="20dp"android:layout_gravity="center_horizontal"android:id="@+id/imageView"android:background="@mipmap/five"/></LinearLayout>
public class TweenAnimationActivity extends AppCompatActivity {private Animation animation;private ImageView imageView;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.tween_activity);init();}private void init(){imageView = (ImageView)findViewById(R.id.imageView);}public void onAlpha(View view){animation = AnimationUtils.loadAnimation(this, R.anim.alpha);imageView.startAnimation(animation);}public void onScale(View view){animation = AnimationUtils.loadAnimation(this, R.anim.scale);imageView.startAnimation(animation);}public void onRotate(View view){animation = AnimationUtils.loadAnimation(this, R.anim.rotate);imageView.startAnimation(animation);}public void onTranslate(View view){animation = AnimationUtils.loadAnimation(this, R.anim.translate);imageView.startAnimation(animation);}/**** @param view** 对于set的理解就是,set.xml文件里面定义这四种动画,然后同时执行,也可以定义一样的动画类型,但是会覆盖前面的同类型动。*/public void onSet(View view){animation = AnimationUtils.loadAnimation(this, R.anim.set);imageView.startAnimation(animation);}
}
属性动画
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><Buttonandroid:layout_height="wrap_content"android:layout_width="match_parent"android:onClick="onAlpha"android:text="透明"/><Buttonandroid:layout_height="wrap_content"android:layout_width="match_parent"android:onClick="onScale"android:text="缩放"/><Buttonandroid:layout_height="wrap_content"android:layout_width="match_parent"android:onClick="onRotate"android:text="旋转"/><Buttonandroid:layout_height="wrap_content"android:layout_width="match_parent"android:onClick="onTranslate"android:text="移动"/><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="onSet"android:text="集合"/><Buttonandroid:layout_height="wrap_content"android:layout_width="wrap_content"android:layout_marginTop="30dp"android:layout_gravity="center_horizontal"android:text="我是移动的控件"android:id="@+id/move_button"/></LinearLayout>
public class AttributeAnimationActivity extends AppCompatActivity {private ObjectAnimator objectAnimator;private Button show_button;private final static String TAG = "提示";private AnimatorSet animatorSet = new AnimatorSet();ObjectAnimator rotateObjectAnimator1 = new ObjectAnimator();ObjectAnimator translateObjectAnimator1 = new ObjectAnimator();@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.attribute_activity);init();animatorSet.addListener(new AnimatorListenerAdapter() {private AnimatorSet animatorSet2 = new AnimatorSet();@Overridepublic void onAnimationEnd(Animator animation) {super.onAnimationEnd(animation);
// animation.cancel();Log.d(TAG, "onAnimationEnd: 动画完成,开始回来动画");ObjectAnimator rotateObjectAnimator2 = new ObjectAnimator();ObjectAnimator translateObjectAnimator2 = new ObjectAnimator();rotateObjectAnimator2 = rotateObjectAnimator2.ofFloat(show_button, "rotation", 0f, 360f);translateObjectAnimator2 = translateObjectAnimator2.ofFloat(show_button, "translationY", 200f, 150f, 100f, 50f, 0f);animatorSet2.setDuration(2000);animatorSet2.play(rotateObjectAnimator2).with(translateObjectAnimator2);animatorSet2.start();}});}private void init(){show_button = (Button)findViewById(R.id.move_button);}public void onAlpha(View view){Log.d(TAG, "onAlpha: ");//value是不定长形参数组。里面的值代表动画的变化过程值。objectAnimator = objectAnimator.ofFloat(show_button, "alpha", 1f, 0.5f, 0f, 0.5f, 1f);objectAnimator.setDuration(2000);objectAnimator.start();}public void onScale(View view){Log.d(TAG, "onScale: ");objectAnimator = objectAnimator.ofFloat(show_button, "scaleY", 0f, 1f, 2f, 1f);objectAnimator.setDuration(2000);objectAnimator.start();}public void onRotate(View view){Log.d(TAG, "onRotate: ");objectAnimator = objectAnimator.ofFloat(show_button, "rotation", 0f, 90f, 360f);objectAnimator.setDuration(2000);objectAnimator.setRepeatCount(3);objectAnimator.setRepeatMode(ValueAnimator.RESTART);objectAnimator.start();}public void onTranslate(View view){Log.d(TAG, "onTranslate: ");objectAnimator = objectAnimator.ofFloat(show_button, "translationY", 0f, 50f, 100f, 150f, 200f);objectAnimator.setDuration(2000);objectAnimator.start();}public void onSet(View view){Log.d(TAG, "onSet: ");rotateObjectAnimator1 = rotateObjectAnimator1.ofFloat(show_button, "rotation", 0f, 90f, 360f);translateObjectAnimator1 = translateObjectAnimator1.ofFloat(show_button, "translationY", 0f, 50f, 100f, 150f, 200f);animatorSet.setDuration(2000);animatorSet.play(rotateObjectAnimator1).with(translateObjectAnimator1);animatorSet.start();}
}
属性动画需要记住3点,1是属性动画不依赖xml文件。2是ObjectAnimator类以及它的ofFloat()方法的用法。3是AnimatorSet类的用法。
总结
Android动画类型从简单到复杂是,帧动画-补间动画-属性动画。同时灵活程度也是如此,帧动画可以实现一些简单的显示效果,如果想要移动、旋转等操作就需要用到补间动画了,而如果要实现是跟为复杂或者可响应点击事件的功能,那就只能选择属性动画了。
Android的三种动画相关推荐
- Android开发—三种动画实现原理及使用
Android动画目前分为三种: Frame Animation 帧动画,通过顺序播放一系列图像从而产生动画效果,.图片过多时容易造成OOM(Out Of Memory内存用完)异常. Tween A ...
- Android的三种动画详解(帧动画、View动画、属性动画)
Android的动画分为了三种, 分别是 帧动画.View动画.属性动画. 1.帧动画 帧动画就是顺序播放一组预先定义好的图片,就类似于我们观看视频,就是一张一张的图片连续播放. 帧动画的使用很简单, ...
- Android 三种动画 (帧动画 、补间动画、属性动画)
1.帧动画 帧动画是依次展示n张静态图片,造成动画的错觉,类似看视频一样. 使用方式 在drawable目录下定义XML文件,根节点为animation-list,然后放入定义更好的图片 onesho ...
- Android开发之三种动画
转载:http://www.cnblogs.com/angeldevil/archive/2011/12/02/2271096.html http://www.lightskystreet.com/2 ...
- android 那几种动画,Android 动画实现几种方案
Android 动画实现几种方案 在 Android 的 FrameWork 中,为我们提供三种动画的实现方式:逐帧(Frame)动画.视图/补间动画(View Animation)和属性动画(Pro ...
- Android之Android Studio三种方式导入外部资源 以及 报错处理
Android Studio三种方式导入外部资源 以及 报错处理 android studio提供了三种方式导入外部资源: 1. Library dependency – 在线添加.需联网下载 . 2 ...
- Android的三种网络联接方式(URL / HttpURLConnection | HttpClient | InetAddress )
Android SDK 中一些与网络有关的package,如下: 包描述 java.net 提供与联网有关的类,包括流和数据包(datagram)sockets.Internet 协议和常见 HTTP ...
- 19.React Native动画Animated效果三种动画类型二;
目录 1.介绍 2.Animated.decay() 2.1方法 2.1.1value参数值 2.1.2config参数有以下这些属性: 2.2示例-执行缩放 2.2.1初始化缩放值 2.2.2绑定缩 ...
- Android -- 三种动画(帧动画、View动画、属性动画)
Android的动画分为了三种, 分别是 帧动画.View动画.属性动画 一:帧动画 帧动画就是顺序播放一组预先定义好的图片,就类似于我们观看视频,就是一张一张的图片连续播放. 帧动画的使用很简单,总 ...
最新文章
- 自学python需要下载什么软件-学python下载什么软件开发
- 量子力学 一 基础6 厄尔米特算符的相容性
- 13道Python3实例
- Python 内嵌函数运用(探究模块)
- Sequelize 中文文档 v4 - Querying - 查询
- mybatis和spring整合时这个报错,应该这样解决!
- vue js 和原生app调用回调方法问题
- 069 Sqrt(x) 求平方根
- 环境变量的配置windows10系统
- [转载] python hasattr函数_Python的hasattr() getattr() setattr() 函数使用方法详解
- 安全防范报警系统产品质量监督检测测试中心(上海)
- 高级程序员的自我修养:如何才能成长为牛逼的高级程序员?
- windows中的文件共享(SMB服务)
- DNA甲基化数据分析专题
- RocketMq 消费者
- 编程创业赚钱-教你怎样开发热门配音程序
- 从viewport发现小米手机参数不一致
- 回车与换行符的区别及python中使用
- PCIe 均衡技术介绍(电气物理篇)
- 如何将微信公众号文章的长网址转换为短网址?