Android动画学习(一)之动画概述和帧动画实现

来源:互联网 发布:电脑怎么用手机淘宝 编辑:程序博客网 时间:2024/05/16 15:20

Android动画学习(一)之动画概述

在App上实现动画效果在Android开发中越来越重要。最近花了一些时间将Android动画学习了一遍。现将学习到的知识分享给大家。
主要介绍的内容如下:

  • 动画概述
  • 实现帧动画
  • 实现补间动画
  • 实现属性动画
  • 实现转场动画
  • 实现SVG矢量动画
  • 一些功能强大的动画库介绍使用

    给大家看一个学习效果图
    这里写图片描述

动画实现的方式

纯编码的方式
代码实现动画即在XML中显示要进行动态显示的控件(一般ImageView),在Java代码中配置的属性。
XML配置:

  <ImageView        android:id="@+id/iv"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_centerHorizontal="true"        android:layout_centerVertical="true"        app:srcCompat="@drawable/girl" />

Java实现:

public void alph(View view) {        /*           AlphaAnimation(float fromAlpha, float toAlpha)          第一个参数fromAlpha为 动画开始时候透明度         第二个参数toAlpha为 动画结束时候透明度         */        animation_Alpha = new AlphaAnimation(0.1f, 1.0f);//说明:0.0表示完全透明,1.0表示完全不透明        animation_Alpha.setDuration(2000);        iv.startAnimation(animation_Alpha);    }

Xml配置的方式
代码实现动画即在XML中显示要进行动态显示的控件,在res下新建anim(设置普通动画属性), animator(设置属性动画属性) 的set标签下进行动画属性配置(后面详细讲),在Java代码中加载动画,也可以设置属性。

动画分类

View Animation(视图动画)

定义:同一个图形通过视图在界面上进行透明度,缩放,旋转,平移的变化(View动画)如补间动画。
分类:

  • 缩放动画(ScaleAnimation)
  • 透明度动画(AlphaAnimation)
  • 旋转动画(RotateAnimation)
  • 平移动画(TranslateAnimation)
  • 复合动画(AnimationSet) :由多个单一动画组合在一起的动画。

Drawable Animation(图片动画)

定义:在界面的同一个位置上不断切换显示不同的图片(Drawable动画)如帧动画。
工作原理:将一个完整的动画拆分成一张张单独的图片,然后再将它们连贯起来进行播放,类似于动画片的工作原理

ValueAnimator(属性动画)

概述:属性动画是Android3.0版本推出的动画框架,其功能和拓展性都很强,是一种不断地对值进行操作的机制,并将值赋值到指定对象的指定属性上,可以是任意对象的任意属性,可以将一个View进行移动或者缩放,可以对自定义View中的Point对象进行动画操作。
属性动画的机制
属性动画已经不是再针对于View而进行设计的了,而是一种不断地对值进行操作的机制,它可以将值赋值到指定对象的指定属性上。

CircularReveral

Android5.0推出的新的动画框架,可以给View做一个揭露效果。

帧动画学习使用

概述:
逐帧动画(Frame-by-frame Animations)从字面上理解就是一帧挨着一帧的播放图片,就像放电影一样。
逐帧动画是最简单的动画,它的使用非常简单,在动画过程中把每一张静态图片添加到动画集中,有Android动画机制控制依次显示动画集中的图片。
父类
从下面的继承关系中可以看出AnimationDrawable本质还是图片(Drawable)。

AnimationDrawable extends DrawableContainer  DrawableContainer extends Drawable

常见的API

  • setVisible( boolean visible, boolean restart):
    设置AnimationDrawable的可见性,true可见,false不可见,xml中定义的visible属性无用,因为根本没有解析。
  • void start():开始动画执行,不能在onCreate调用,如果有必要界面启动就运行动画,则在onWindowFocusChanged中调用;
  • void stop():停止动画执行
  • boolean isRunning():返回动画是否正在执行;
  • void unscheduleSelf(Runnable what):
  • 取消当前动画上计划执行的一个Runnable,一般这个Runnable都是用于绘制下一帧的;
  • int getNumberOfFrames():获取当前动画的帧数量;
  • Drawable getFrame( int index):获取指定位置的帧;
  • int getDuration( int i):获取指定位置帧的展示时长;
  • boolean isOneShot():获取动画是执行性一次还是无限循环,true只执行一次,false无限循环;
  • void setOneShot( boolean oneShot):设置动画是执行一次还是无限循环;
  • void addFrame(@NonNull Drawable frame, int duration):添加一个帧到动画序列中,duration动画时间;

    以上是AnimationDrawable 常用的一些API,可以满足AnimationDrawable 使用的基本功能。如果想深入了解,请参照官方API.

代码实现:
AnimationDrawable在Java代码中实现非常简单,调用AnimationDrawable .addFrame方法把动画需要的静态图片添加到AnimationDrawable 中,然后开启动画即可。

在xml中直接实现帧动画的步骤:
1、在drawable中创建 A.xml,在animation-list标签下item标签中设置动画属性;
2、在Layout布局文件中的ImageView控件中引用资源;
3、在Activity中调用AnimationDrawableAPI(参考常用上面API)。

注意:
AnimationDrawable动画不是默认播放的,必须在程序中调用动画播放的方法。如果需要进入界面就自动开始动画,则需要在onWindowFocusChanged()回调中执行,不能在onCreate中AnimationDrawable.start。(参考下面Activity中代码)
原因:onCreate中AnimationDrawable尚未绘制到View上,在onWindowFocusChanged()中,此时界面已经创建完成。

weather_animationlist.xml

<?xml version="1.0" encoding="utf-8"?><animation-list xmlns:android="http://schemas.android.com/apk/res/android">    <item        android:drawable="@drawable/clear"        android:duration="500" />    <item        android:drawable="@drawable/cloudy"        android:duration="500" />    <item        android:drawable="@drawable/haze"        android:duration="500" />    <item        android:drawable="@drawable/wind"        android:duration="500" />    <item        android:drawable="@drawable/rain"        android:duration="500" />    <item        android:drawable="@drawable/storm"        android:duration="500" />    <item        android:drawable="@drawable/snow"        android:duration="500" /></animation-list>

布局文件:(ImageView引用weather_animationlist)

 <ImageView            android:id="@+id/imageView"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_centerHorizontal="true"            android:layout_centerVertical="true"            android:layout_gravity="center"            android:src="@drawable/weather_animationlist" />

说明:引用weather_animationlist有两种方法,xml中直接引用,或者在Java中设置。这个看自己意愿。
Activity代码:

/** * 帧动画 * * @author ZD *         created at 2017/7/13 14:42 *         description: */public class FrameAnimatonActivity extends AppCompatActivity {    private ImageView iv;    private TextView textView;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        supportRequestWindowFeature(Window.FEATURE_NO_TITLE);        setContentView(R.layout.activity_frame);        iv = (ImageView) findViewById(R.id.imageView);        textView = (TextView) findViewById(R.id.tv_title);        //设置标题        textView.setText("帧动画使用");    }    public void start(View view) {//Xml开始动画        iv.setImageResource(R.drawable.weather_animationlist);        AnimationDrawable animationDrawable = (AnimationDrawable) iv.getDrawable();        animationDrawable.start();    }    public void end(View view) {//Xml结束动画        iv.setImageResource(R.drawable.weather_animationlist);        AnimationDrawable animationDrawable = (AnimationDrawable) iv.getDrawable();        animationDrawable.stop();    }    /*   AnimationDrawable.start实现不能在onCreate中,因为在onCreate中AnimationDrawable尚未绘制到View上。  如果需要进入界面就自动开始动画,需要在onWindowFocusChanged()回调中执行,此时界面已经创建完成。     */    @Override    public void onWindowFocusChanged(boolean hasFocus) {        super.onWindowFocusChanged(hasFocus);        iv.setImageResource(R.drawable.weather_animationlist);        AnimationDrawable animationDrawable = (AnimationDrawable) iv.getDrawable();        animationDrawable.start();    }    public void java(View view) {//java实现        AnimationDrawable anim = new AnimationDrawable();        //添加动画        anim.addFrame(getResources().getDrawable(R.drawable.clear), 200);        anim.addFrame(getResources().getDrawable(R.drawable.cloudy), 200);        anim.addFrame(getResources().getDrawable(R.drawable.haze), 200);        anim.addFrame(getResources().getDrawable(R.drawable.wind), 200);        anim.addFrame(getResources().getDrawable(R.drawable.rain), 200);        anim.addFrame(getResources().getDrawable(R.drawable.storm), 200);        anim.addFrame(getResources().getDrawable(R.drawable.snow), 200);        anim.setOneShot(false);        iv.setImageDrawable(anim);        anim.start();    }}

实现效果:

这里写图片描述

总结:

帧动画就是不停的切换图片实现动画效果.帧动画使用简单,但是没有扩展性,而且如果图片过大容易OOM。谨慎使用!一般不推荐使用。此篇文章到此结束。请继续关注下篇博客。
写博客是为了帮助开发者学习使用技术,同时巩固自己所学技术。如果此篇博客有助于您的学习,那是我的荣幸!如果此篇博客有任何瑕疵,请多多指教!在此感谢您的学习和指教!

阅读全文
0 0
原创粉丝点击