博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 动画之View动画效果和Activity切换动画效果
阅读量:5905 次
发布时间:2019-06-19

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

View动画效果:

1.>>Tween动画

通过对View的内容进行一系列的图形变换(平移、缩放、旋转、透明度变换)实现动画效果,补间动画需要使用<set>节点作为根节点,子节点里可以为下表格中的四种动画标签,也可以包继续含<set>标签;动画的定义xml文件需要添加到res/anim文件夹中;

动画类型 Xml定义动画使用的节点 编码定义动画使用的类
渐变透明度动画效果 <alpha/> AlphaAnimation
渐变尺寸缩放动画效果 <scale/> ScaleAnimation
画面位置移动动画效果 <translate/> TranslateAnimation
画面旋转动画效果 <rotate/> RotateAnimation
android:toAlpha="0" >   

在java代码中设置开始动画:

Animation animation = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.rotate);// 使用rotate.xml生成动画效果对象 animation.setFillAfter(true);// 动画停止时保持在该动画结束时的状态  ImageView.startAnimation(animation);  Animation animation1 = new RotateAnimation(0, 270, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);// 编码方式

2.>>Frame动画,即顺序播放事先做好的图像,开发步骤:

(1)把定义好的图片放进项目res/drawable下;
(2)在项目的res目录下创建anim文件夹,在此文件夹下定义动画xml文件,每一项静态的图像添加到drawable目录中,或者用编码方式定义动画效果;
(3)为View控件绑定动画效果,调用代表动画的AnimationDrawable的start()方法开始动画;

TextView tv = (TextView) findViewById(R.id.tv);        tv.setBackgroundResource(R.drawable.frame);        // 绑定frame动画,会发送一个消息到主线程的消息队列处理器等待处理,绑定事件完成之后才能进行动画启动        final AnimationDrawable drawable = (AnimationDrawable) findViewById(R.id.tv).getBackground();        // Looper().myQueue():取得消息队列,要消息(事件)处理完成之后才执行addIdleHandler添加进的handler中的方法        Looper.myQueue().addIdleHandler(                new MessageQueue.IdleHandler() {                    @Override                    public boolean queueIdle() {                        drawable.start();// 启动动画,要绑定事件处理完成之后才能启动动画                        return false;// 只要执行操作之后就会从消息队列中移出                    }                });// 取得处理主线程中处理的消息队列

注意: Frame动画必须使用<animation-list>作为根节点,下面是frame.xml文件的定义;

  
  

3.>>属性动画

属性动画可以使对象的属性值在一定时间间隔内变化到某一个值,如在1000毫秒内移动控件的位置(改变x,y的值),在0.5秒内改变alpha属性的值以改变控件透明度,属性动画资源文件位于res/animator目录中;如下是一个属性动画的定义

// 动画执行顺序,默认是同时执行,在此设置为按顺序执行
// 定义x,y的值在0.5秒内移动到(400,300) 在此未设置android:ordering属性,此set则为同时执行

加载属性动画资源文件:

// 加载动画资源        AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(getApplicationContext(), R.animator.aim);        // 设置要控制的对象        set.setTarget(null);        set.start();

4.>>LayoutAnimaionController

      LayoutAnimaionController为Layout或者viewGroup里的控件设置动画效果,特点是它会使其中的每个控件都有相同的动画效果,这些控件的动画效果可以在不同的时间显示出来。

mLayout = (LinearLayout) findViewById(R.id.ll);        Animation anim = new TranslateAnimation(0, 200, 0, 0);        anim.setDuration(500);        anim.setFillAfter(true);        LayoutAnimationController layoutAnim = new LayoutAnimationController(anim); // 设置动画        layoutAnim.setOrder(LayoutAnimationController.ORDER_NORMAL); // 设置子View动画顺序        mLayout.setLayoutAnimation(layoutAnim);

关于LayoutAnimaionController,它需要一个Animation对象用于实例化,可以设置子View动画顺序,有三种顺序方式

 

LayoutAnimaionController .ORDER_NORMAL       // 顺序

LayoutAnimaionController .ORDER_REVERSE     //反序
LayoutAnimaionController .ORDER_RANDOM      //随机

还可以设置延迟setDelay(param);

5.>>Interpolator动画速率

/** * An interpolator defines the rate of change of an animation. This allows * the basic animation effects (alpha, scale, translate, rotate) to be  * accelerated, decelerated, repeated, etc. */public interface Interpolator extends TimeInterpolator {
}

查看接口Interpolator的定义,Interpolator接口定义动画改变的速度,如基本的动画效果(透明度、比例、移动、旋转)的加速、减速、重复等;

/** * TimeInterpolator定义动画速率的改变,允许动画有非固定的运动如加速、减速 */public interface TimeInterpolator {    /**     * @param input 一个介于0到1的参数标识当前点的位置,0代表开始,1代表结束     * @return 返回一个动画补插值.这个值可以小于1{在目标的后面}或大于1{在目标的后面}      */    float getInterpolation(float input);}

Android已经定义了几个该接口的直接子类,在程序中可以直接调用

——AccelerateInterpolator:动画从开始到结束,变化率是一个加速的过程。
——DecelerateInterpolator:动画从开始到结束,变化率是一个减速的过程。
——CycleInterpolator:动画从开始到结束,变化率是循环给定次数的正弦曲线。
——Anticipate/Overshoot:往起点方向偏移少量距离再开始加速动画/往终点方向偏移少量距离再结束动画。
——Bounce:弹性效果。
——AccelerateDecelerateInterpolator:动画从开始到结束,变化率是先加速后减速的过程。
——LinearInterpolator:动画从开始到结束,变化率是线性变化。

上面是使用系统自带的Interpolator的方法,也可以自定义Interpolator

public class MyInter implements Interpolator {    // ...    @Override    public float getInterpolation(float input) {        // ...        return 0;    }    // ...}

在使用的时候,使用如下的方式;

ImageView iv = new ImageView(getContext());        Animation animation = AnimationUtils.loadAnimation(getContext(), 0x70982743);        animation.setInterpolator(new MyInter());        iv.startAnimation(animation);

Activity切换动画效果:

  关于Activity切换动画效果,网上比较普遍的是overridePendingTransition(enterAnim, exitAnim),但这种方式其实有一些问题;例如:被打开的Activity退出时,并没有动画效果;并且,如果需要当前Activity销毁返回到前一个Activity时,当前Activity和前一个Activity都执行动画,这种方法就根本不能满足了。

  言归正传,直接上我淘到的方法:通过Theme对Activity动画效果进行设置

    

上面activityAnimation下面四个item对应的动画分别为(假设从Activity A 进入到Activity B):

进入B时B执行的动画;

进入B时A执行的动画;
离开B返回A时A执行的动画;
离开B返回A时B执行的动画;

两个google官方参考链接:

 

转载地址:http://lhdpx.baihongyu.com/

你可能感兴趣的文章
java--Eclipse for mac 代码提示(代码助手,代码联想)快捷键修改
查看>>
left join on/right join on/inner join on/full join on连接
查看>>
template.helper 多参数
查看>>
Android 四大组件之一(Activity)
查看>>
扫描(一)
查看>>
Centos7安装rabbitmq server 3.6.0
查看>>
iostat命令学习
查看>>
html video的url更新,自动清缓存
查看>>
【11】ajax请求后台接口数据与返回值处理js写法
查看>>
Python菜鸟之路:Jquery Ajax的使用
查看>>
LeetCode算法题-Maximum Depth of Binary Tree
查看>>
Cox 教学视频5
查看>>
Jenkins持续集成学习-搭建jenkins问题汇总
查看>>
使用ffmpeg实现对h264视频解码 -- (实现了一个易于使用的c++封装库)
查看>>
flink watermark介绍
查看>>
Android Xutils 框架
查看>>
Sysbench 0.5版安装配置
查看>>
书摘—你不可不知的心理策略
查看>>
【博客话题】毕业——开始人生的艰苦历程
查看>>
Linux安装telnet
查看>>