博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android三种动画实现原理及使用
阅读量:4225 次
发布时间:2019-05-26

本文共 31338 字,大约阅读时间需要 104 分钟。

  • Android动画目前分为三种:

    1. Frame Animation 帧动画,通过顺序播放一系列图像从而产生动画效果,。图片过多时容易造成OOM(Out Of Memory内存用完)异常。
    2. Tween Animation 补间动画(又叫view动画),是通过对场景里的对象不断做图像变换(透明度、缩放、平移、旋转)从而产生动画效果,是一种渐进式动画,并且View动画支持自定义。
    3. Accribute Animation 属性动画,这也是在android3.0之后引进的动画,在手机的版本上是android4.0就可以使用这个动 画,通过动态的改变对象的属性从而达到动画效果。

  • 补间动画和属性动画的区别

补间动画只是改变了View的显示效果而已,并不会真正的改变View的属性。而属性动画可以改变View的显示效果和属性。举个例子:例如屏幕左上角有一个Button按钮,使用补间动画将其移动到右下角,此刻你去点击右下角的Button,它是绝对不会响应点击事件的,因此其作用区域依然还在左上角。只不过是补间动画将其绘制在右下角而已,而属性动画则不会。

  • 接下来就来详细了解一下这三种动画效果的用法:

FrameAnimation

帧动画是顺序播放一组预先定义好的图片,类似于电影播放,系统提供了一个类AnimationDrawable来使用帧动画,首先看一下效果演示:

1、首先在drawable里创建一个animation-list类型的xml文件,命名为frame_animation:其中oneshot是设置动画是否重复播放,设置false为确定重复播放。drawable设置不同的图片,duration设置图片的显示时间(即按每帧多少毫秒播放)。

2、设置布局文件activity_frame:定义开始播放和停止按钮和显示动画的布局。

3、在FrameActivity中实现以下代码:

/**      
* 帧动画
*/
public
class FrameActivity extends AppCompatActivity implements View.OnClickListener {
private Button start;
private Button stop;
private ImageView view;
private AnimationDrawable animationDrawable;
//声明AnimationDrawable类
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_frame);
initView();
}
private void initView() {
start = findViewById(R.id.start);
stop = findViewById(R.id.stop);
view = findViewById(R.id.view);
start.setOnClickListener(
this);
stop.setOnClickListener(
this);
// 通过逐帧动画的资源文件获得AnimationDrawable示例
animationDrawable=(AnimationDrawable) getResources().getDrawable(R.drawable.frame_animation);
// 把AnimationDrawable设置为ImageView的背景
view.setBackgroundDrawable(animationDrawable);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.start:
start();
break;
case R.id.stop:
stop();
break;
}
}
protected void start() {
if (animationDrawable !=
null && !animationDrawable.isRunning()) {
//判断
animationDrawable.start();
}
}
protected void stop() {
if (animationDrawable !=
null && animationDrawable.isRunning()) {
animationDrawable.stop();
}
}
}

4、这样便可实现帧动画了,但帧动画比较容易引起OOM,所以在使用帧动画时,应尽量避免使用尺寸较大的图片。

Tween Animation

补间动画的四种变换效果对应Animation的四个子类:TranslateAnimation、ScaleAnimation、RotateAnimation、AlphaAnimation,这些动画可以通过XML来定义,也可以通过代码动态定义,以下示例通过XML定义的。

1、在res下创建一个anim文件夹,创建alpha类型xml文件用来实现动画透明度:

2、创建scal类型xml文件用来实现缩放动画:

3、 创建scal类型xml文件用来实现位移动画:

4、创建rotate类型xml文件用来实现旋转动画:    

5、创建set类型xml文件用来实现组合动画:

6、创建布局文件

7、实现TweenActivityde中的代码

/**      
* Created by CXB on 2018/6/6.
*/
public
class TweenActivity extends AppCompatActivity {
private ImageView img;
private Animation animation;
//声明Animation类
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tween);
img = findViewById(R.id.tween_img);
}
/**
* 透明度渐变
*
* @param view
*/
public void OnAlpha(View view) {
animation = AnimationUtils.loadAnimation(TweenActivity.
this, R.anim.tween_alpha);
img.startAnimation(animation);
}
/**
* 缩放渐变
*
* @param view
*/
public void OnScale(View view) {
animation = AnimationUtils.loadAnimation(TweenActivity.
this, R.anim.tween_scale);
img.startAnimation(animation);
}
/**
* 位移动画
*
* @param view
*/
public void OnTranslate(View view) {
animation = AnimationUtils.loadAnimation(TweenActivity.
this, R.anim.tween_translate);
img.startAnimation(animation);
}
/**
* 旋转动画
*
* @param view
*/
public void OnRotate(View view) {
animation = AnimationUtils.loadAnimation(TweenActivity.
this, R.anim.tween_rotate);
img.startAnimation(animation);
}
/**
* 组合动画
*
* @param view
*/
public void OnSet(View view) {
animation = AnimationUtils.loadAnimation(TweenActivity.
this, R.anim.tween_set);
img.startAnimation(animation);
}
}

Attribute Animation

属性动画和View动画不同,它对作用对象进行了扩展,属性动画可以对任何对象做动画,动画的效果也也得到了加强,可以实现更加绚丽的动画效果。

1、设置布局文件

2、实现AttributeActivity中的代码:

/**      
* Created by CXB on 2018/6/7.
*/
public
class AttributeActivity extends AppCompatActivity {
private Button btn_show;
private ObjectAnimator objectAnimator;
//声明ObjectAimator类
private LinearLayout ll_root;
private
float rotateDu =
0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_attribute);
btn_show = findViewById(R.id.attri_show);
ll_root = findViewById(R.id.attri_root);
}
/**
* 透明度渐变
*
* @param view
*/
public void OnAlpha(View view) {
objectAnimator = ObjectAnimator.ofFloat(btn_show,
"alpha",
1f,
0.8f,
0.7f,
0.2f,
0.1f);
//布局,类型,渐变程度
objectAnimator.setDuration(
4000);
objectAnimator.start();
}
/**
* 缩放
*
* @param view
*/
public void OnScale(View view) {
objectAnimator = ObjectAnimator.ofFloat(btn_show,
"scaleY",
1f,
2f,
3f,
4f,
3f,
2f,
1f);
objectAnimator.setDuration(
4000);
objectAnimator.start();
}
/**
* 位移
*
* @param view
*/
public void OnTranslate(View view) {
float width = ll_root.getWidth();
//获取当前手机的的屏幕宽高
objectAnimator = ObjectAnimator.ofFloat(btn_show,
"translationX", width /
10, width /
9, width /
4, width /
3, width /
2, width);
objectAnimator.setDuration(
4000);
objectAnimator.start();
}
/**
* 旋转
*
* @param view
*/
public void OnRotate(View view) {
objectAnimator = ObjectAnimator.ofFloat(btn_show,
"rotation", rotateDu,
360);
objectAnimator.setDuration(
2000);
objectAnimator.setRepeatCount(
100);
//设置动画重复次数
objectAnimator.setRepeatMode(ValueAnimator.RESTART);
//动画重复模式
objectAnimator.start();
}
/**
* 组合动画
*
* @param view
*/
public void OnSet(View view) {
float height = ll_root.getHeight();
ObjectAnimator objectAnimatorRotate = ObjectAnimator.ofFloat(btn_show,
"rotation", rotateDu,
360);
ObjectAnimator objectAnimatorTr = ObjectAnimator.ofFloat(btn_show,
"translationY", height, height /
2, height /
3, height /
4, height /
5, height /
6);
AnimatorSet animatorSet =
new AnimatorSet();
animatorSet.setDuration(
4000);
animatorSet.play(objectAnimatorRotate).with(objectAnimatorTr);
animatorSet.start();
}
}

源码下载:https://download.csdn.net/download/weixin_39001306/10465643

转载自:

你可能感兴趣的文章
干货 | 基于贝叶斯推断的分类模型& 机器学习你会遇到的“坑”
查看>>
手把手教你生成对抗网络 GAN,50 行代码玩转 GAN 模型!(附源码)
查看>>
带你和Python与R一起玩转数据科学: 探索性数据分析(附代码)
查看>>
不挡脸,放肆看!揭秘B站黑科技蒙版弹幕
查看>>
115页Slides带你领略深度生成模型全貌(附PPT)
查看>>
干货合集 | 带你深入浅出理解深度学习(附资源打包下载)
查看>>
干货 | 一文总结机器学习类面试问题与思路
查看>>
15篇最新AI论文推荐新鲜出炉!真的很skr了~(附链接)
查看>>
教你用Python解锁“吃鸡”的正确姿势!(附240行代码)
查看>>
收藏 | 200个精选ML、NLP、Python及数学最佳教程(附链接)
查看>>
一文带你入门图论和网络分析(附Python代码)
查看>>
对话清华大学周昊,详解IJCAI杰出论文及其背后的故事
查看>>
干货 | NLP、知识图谱教程、书籍、网站、工具...(附资源链接)
查看>>
独家 | 一文读懂如何用深度学习实现网络安全
查看>>
用这种方法实现无监督端到端图像分类!(附论文)
查看>>
10大称霸Kaggle的深度学习技巧(附课程&代码&论文)
查看>>
干货 | 6 种激活函数核心知识点,请务必掌握!
查看>>
TensorFlow超级指南 | 你能想到的TF教程和资源都在这里(附链接&视频)
查看>>
干货收藏 | 计算机学习绝对不能错过的10大网站(内附网站链接)
查看>>
Kotlin威胁、Python逆袭,2018年程序员需要升级哪些技能?(附报告下载)
查看>>