博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android开发之动画的详解 整理资料 Android开发程序小冰整理
阅读量:6982 次
发布时间:2019-06-27

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

hot3.png

 
/** * 作者:David Zheng on 2015/11/7 15:38 * * 
网站:http://www.93sec.cc * *
 微博:http://weibo.com/mcxiaobing * * 
微博:http://weibo.com/93sec.cc */ 个人交流QQ986945193
 
一、分类:
(一)、概要:
        3.0以前,android支持两种动画模式,补间动画(tween animation),帧动画(frame animation),在android3.0中又引入了一个新的动画系统:属性动画(property animation)。
        这三种动画模式在SDK中被称为view animation,drawable animation,property animation。
(二)、动画资源分类:
  1. 属性动画:Property Animation
  2. 帧动画:Frame Animation (Drawable Animation)
  3. 补间动画:Tween Animation (View Animation)
    • 透明度补间动画
    • 缩放补间动画
    • 旋转补间动画
    • 移动补间动画
二、补间动画:
        View Animation就是一系列View形状的变换,如大小的缩放、透明度的改变、位置的改变、旋转位置改变,动画的定义既可以用java代码定义也可以用XML定义。建议用XML定义。
        用XML定义的动画放在
/res/anim/文件夹内,XML文件的根元素为<set> , 二级节点可为<
alpha>,<
scale>,<
translate>,<
rotate>。
(一)、用xml资源实现补间动画:
(二)、用java代码实现补间动画:
 
public class MainActivity extends Activity { private ImageView imageView_main; private Animation animation = null;     @Override  protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); imageView_main = (ImageView) findViewById(R.id.imageView_main); } public void clickButton(View view) {
switch (view.getId()) {
case R.id.button_main_alpha: animation = new AlphaAnimation(0.0f, 1.0f); break; case R.id.button_main_scale: animation = new ScaleAnimation(0.0f, 1.0f, 0.0f, 1.0f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 1.0f); break; case R.id.button_main_translate: animation = new TranslateAnimation(0, 150, 0, 0); break; case R.id.button_main_rotate: animation = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 1.0f); break; default: break; } animation.setDuration(3000); imageView_main.setAnimation(animation); } }
三、帧动画:
        Frame Animation(AnimationDrawable对象):帧动画,就像GIF图片,通过一系列Drawable依次显示来模拟动画的效果。
        必须以<animation-list>为根元素,以<item>表示要轮换显示的图片,duration属性表示各项显示的时间。XML文件要放在
/res/anim/或者/
res/animator或者
/res/drawable目录下。
(一)、实例代码:
一、res/anim/frame_animation.xml的代码:
 

<animation-listxmlns:android="http://schemas.android.com/apk/res/android"

android:oneshot="true">

<itemandroid:drawable="@drawable/anim1"android:duration="50"/>

<itemandroid:drawable="@drawable/anim2"android:duration="50"/>

<itemandroid:drawable="@drawable/anim3"android:duration="50"/>

<itemandroid:drawable="@drawable/anim4"android:duration="50"/>

<itemandroid:drawable="@drawable/anim5"android:duration="50"/>

<itemandroid:drawable="@drawable/anim6"android:duration="50"/>

<itemandroid:drawable="@drawable/anim7"android:duration="50"/>

<itemandroid:drawable="@drawable/anim8"android:duration="50"/>

<itemandroid:drawable="@drawable/anim9"android:duration="50"/>

<itemandroid:drawable="@drawable/anim10"android:duration="50"/>

<itemandroid:drawable="@drawable/anim11"android:duration="50"/>

<itemandroid:drawable="@drawable/anim12"android:duration="50"/>

</animation-list>

 
二、MainActivity.java代码:
public class MainActivity extends Activity {

private ImageView imageView_main_show;

private AnimationDrawable animationDrawable = null;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

imageView_main_show = (ImageView) findViewById(R.id.imageView_main_show);

imageView_main_show.setBackgroundResource(R.anim.frame_animation);

animationDrawable = (AnimationDrawable) imageView_main_show.getBackground();

}

public void clickButton(View view) {

switch (view.getId()) {

case R.id.button_main_start:

if (!animationDrawable.isRunning()) {

                                //一组动画是否只播放一次

animationDrawable.setOneShot(false);

animationDrawable.start();

}

break;

case R.id.button_main_stop:

if (animationDrawable.isRunning()) {

animationDrawable.stop();

}

break;

}

}

@Override

public void onWindowFocusChanged(boolean hasFocus) {

super.onWindowFocusChanged(hasFocus);

if (!animationDrawable.isRunning()) {

animationDrawable.setOneShot(false);

animationDrawable.start();

}

}

}

【备注:】
        SDK中提到,不要在onCreate()中调用start(),因为AnimationDrawable还没有完全跟Window相关联,如果想要界面显示时就开始动画的话,可以在
onWindowFoucsChanged()中调用
start()。
四、属性动画:
(一)、概念:
        属性动画,这个是在Android 3.0中才引进的。Property Animation故名思议就是通过动画的方式改变对象的属性.属性动画更改的是对象的实际属性,在View Animation(Tween Animation)中,其改变的是
View的绘制效果,真正的View的属性保持不变
        比如无论如何缩放Button的大小,Button的有效点击区域还是没有应用动画时的区域,其位置与大小都不变。而在Property Animation中,改变的是对象的实际属性,如Button的缩放,Button的位置与大小属性值都改变了。
        Property Animation不止可以应用于View,还可以应用于任何对象。Property Animation只是表示一个值在一段时间内的改变,当值改变时要做什么事情完全是你自己决定的。
(二)、常用属性:
  1. Duration动画的持续时间,默认300ms。
  2. Time interpolation:时间插值。LinearInterpolator、AccelerateDecelerateInterpolator,定义动画的变化率。
  3. Repeat count and behavior:重复次数、以及重复模式;可以定义重复多少次;重复时从头开始,还是反向。
  4. Animator sets: 动画集合,你可以定义一组动画,一起执行或者顺序执行。
  5. Frame refresh delay:帧刷新延迟,对于你的动画,多久刷新一次帧;默认为10ms,但最终依赖系统的当前状态;基本不用管。
(三)、相关的类:
  1. ObjectAnimator 动画的执行类(常用属性:alpha,rotation,rotationX,rotationY,translationX,translationY,scaleX,scaleY)
  2. ValueAnimator 动画的执行类
  3. AnimatorSet 用于控制一组动画的执行:线性,一起,每个动画的先后执行等。
  4. AnimatorInflater 用户加载属性动画的xml文件
  5. TypeEvaluator 类型估值,主要用于设置动画操作属性的值。
  6. TimeInterpolator 时间插值
  • 总的来说,属性动画就是,动画的执行类来设置动画操作的对象的属性、持续时间,开始和结束的属性值,时间差值等,然后系统会根据设置的参数动态的变化对象的属性。
(一)、实例代码:
一、res/anim/property_anim.xml的代码:
 

<setxmlns:android="http://schemas.android.com/apk/res/android"

    android:ordering="sequentially">

<objectAnimator

        android:duration="4000"

        android:propertyName="x"

        android:valueTo="300"

        android:valueType="intType"/>

    <objectAnimator

        android:duration="4000"

        android:propertyName="y"

        android:valueTo="400"

        android:valueType="intType"/>

    

<objectAnimator

        android:duration="4000"

        android:propertyName="x"

        android:valueTo="0"

        android:valueType="intType"/>

    <objectAnimator

        android:duration="4000"

        android:propertyName="y"

        android:valueTo="0"

        android:valueType="intType"/>

</set>

 
二、MainActivity.java代码:

public class MainActivity extends Activity {

private ImageView imageView_main_obj;

private Move move;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

imageView_main_obj = (ImageView) findViewById(R.id.imageView_main_obj);

move = new Move();

imageView_main_obj.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

setTitle(move.getX() + ":" + move.getY());

}

});

}

class Move {

    private int y;

    private int x;

    publicint getY() {

        return y;

    }

public void setY(int y) {

    this.y = y;

    imageView_main_obj.layout(imageView_main_obj.getLeft(), y,imageView_main_obj.getRight(),y + imageView_main_obj.getMeasuredHeight());

}

public int getX() {

    return x;

}

publi cvoid setX(int x) {

    this.x = x;

    imageView_main_obj.layout(x, imageView_main_obj.getTop(), x imageView_main_obj.getMeasuredWidth(),imageView_main_obj.getBottom());

}

}

public void clickButton(View view) {

// 装载属性动画资源

AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(this,

R.animator.property_anim);

// 设置要控制的对象

set.setTarget(move);

// 开始动画

set.start();

}

}

【备注说明:】

 

<objectAnimator

        android:duration="4000"

        android:propertyName="x"

        android:valueTo="300"

        android:valueType="intType"/>

【备注:】
  • android:ordering说明一系列动画动作的执行顺序,有两个选择: sequentially 和together,顺序执行还是一起执行; 
  • objectAnimator 是设定动画实施的对象;
  • duration是该动画动作执行从开始到结束所用的时间;
  • android:repeatCount="infinite"   可以是整数或者infinite
  • android:repeatMode="restart"    可以是restart 或者 reverse
  • android:valueFrom=" "     整数|浮点数|颜色
/** * 作者:David Zheng on 2015/11/7 15:38 * * 
网站:http://www.93sec.cc * *
 微博:http://weibo.com/mcxiaobing * * 
微博:http://weibo.com/93sec.cc */ 个人交流QQ986945193

转载于:https://my.oschina.net/mcxiaobing/blog/647485

你可能感兴趣的文章
表设置了自增后往里面插入不自增的id时的处理方法
查看>>
MySQL:MySQL日期数据类型、MySQL时间类型使用总结
查看>>
关于在react中使用cssmodules
查看>>
Proguard打包混淆报错:can't find superclass or interface
查看>>
2014美团笔试之寻找最短子串
查看>>
如何调整eclipse中代码字体大小
查看>>
Open Flash Charts
查看>>
SpringMvc 数据绑定400错误
查看>>
pycharm中不能安装bs4的解决方案
查看>>
我对编程语言选择的理解
查看>>
6.3、Android Studio的CPU Monitor
查看>>
【java】JDK1.8时间日期库 新特性 所有java中时间Date的使用
查看>>
Android 应用开发者必看的 9 个 Tips
查看>>
关于Fragment框架,说的够清晰了。。。
查看>>
批处理写的俄罗斯方块
查看>>
ubuntu下安装加装DNS
查看>>
jquery简单笔记(1) - 基础记录
查看>>
线性回归——最小二乘法_实例(二)
查看>>
django中url,静态文件,POST请求的配置 分类: Pytho...
查看>>
(旧)子数涵数·PS——文字人物
查看>>