逐帧动画

    xiaoxiao2021-12-14  21

    逐帧动画是通过播放关键帧来达到动画的效果,基本类是Drawable的子类AnimationDrawable。可以通过xml资源文件和java代码来实现,一般推荐直接在xml中实现,也可以在java代码中对其进行一些动态的操作。

    1. 用xml文件实现

    1. 准备要播放的帧的图片:

    2. 以animation-list为根节点创建xml文件animation1:

    <?xml version="1.0" encoding="utf-8"?> <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false"> <item android:drawable="@drawable/yuyin1" android:duration="300"></item> <item android:drawable="@drawable/yuyin2" android:duration="300"></item> <item android:drawable="@drawable/yuyin3" android:duration="300"></item> </animation-list>

    其中oneshot表示是否只播放一次,item依播放次序添加,duration表示每一帧的播放时间。

    3. 在布局文件中把animation1作为资源文件进行引用:

    <ImageView android:id="@+id/imageview" android:layout_width="wrap_content" android:layout_height="0dp" android:layout_weight="1" android:layout_gravity="center" android:src="@drawable/animation1"/>

    4. 获取AnimationDrawable并进行播放:

    AnimationDrawable animationDrawable= (AnimationDrawable) mImageView.getDrawable(); animationDrawable.start();

    AnimationDrawable的常用方法:

    void start() - 开始播放动画void stop() - 停止播放动画addFrame(Drawable frame, int duration) - 添加一帧,并设置该帧显示的持续时间void setOneShoe(boolean flag) - false为循环播放,true为仅播放一次boolean isRunning() - 是否正在播放

    start()方法不能在onCreate()函数中调用。因为AnimationDrawable并未完全关联到Window,在onCreate()方法中,View并未完成显示

    2. 用java代码

    用java代码实现主要是利用AnimationDrawable的addFrame()方法自己构建AnimationDrawable实例,示例如下:

    AnimationDrawable animationDrawable = new AnimationDrawable(); for (int i = 1; i <= 3; i++) { int id = getResources().getIdentifier("yuyin" + i, "drawable", getPackageName()); Drawable drawable = getResources().getDrawable(id); animationDrawable.addFrame(drawable, 200); } animationDrawable.setOneShot(false); mImageView.setImageDrawable(animationDrawable);

    最终效果:

    3. animated-selector

    animated-selector是Lollipop版本中的新特性,使用它可以实现控件状态改变时的过渡动画,但是他只能在Lollipop以上的版本中使用,所以还需要适配低版本的设备。

    1. 再新建一个以animation-list为根节点创建xml文件animation2,实现倒放的动画效果:

    <?xml version="1.0" encoding="utf-8"?> <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false"> <item android:drawable="@drawable/yuyin3" android:duration="300"></item> <item android:drawable="@drawable/yuyin2" android:duration="300"></item> <item android:drawable="@drawable/yuyin1" android:duration="300"></item> </animation-list>

    2. 在drawable-v21中新建以animated-selector为根节点的资源文件selector.xml:

    <?xml version="1.0" encoding="utf-8"?> <animated-selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/unselect" android:state_selected="false"> <bitmap android:src="@drawable/yuyin1"/> </item> <item android:id="@+id/select" android:state_selected="true"> <bitmap android:src="@drawable/yuyin3"/> </item> <transition android:fromId="@+id/unselect" android:toId="@+id/select" android:drawable="@drawable/animation1"> </transition> <transition android:fromId="@id/select" android:toId="@id/unselect" android:drawable="@drawable/animation2"> </transition> </animated-selector>

    与普通的selector资源不同的是,animated-selector的item中加了一个id来标识状态,并在transition中引用animation1和animation2来实现两个状态的转换动画。上面的例子中实现了在selected状态改变时播放的动画。

    3. 在drawable中新建同名的selector文件,实现在低版本中的状态转换效果:

    <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_selected="false"> <bitmap android:src="@drawable/yuyin1"/> </item> <item android:state_selected="true"> <bitmap android:src="@drawable/yuyin3"/> </item> </selector>

    4. 在imageview中引用selector,并在java代码中控制其状态:

    <ImageView android:id="@+id/imageview" android:layout_width="wrap_content" android:layout_height="0dp" android:layout_weight="1" android:layout_gravity="center" android:src="@drawable/selector"/> mImageView= (ImageView) findViewById(R.id.imageview); start = (Button) findViewById(R.id.start); start.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mImageView.setSelected(true); } }); stop = (Button) findViewById(R.id.stop); stop.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mImageView.setSelected(false); } });

    效果:

    相关文章:

    http://blog.csdn.net/zqiang_55/article/details/8142785

    http://www.open-open.com/lib/view/open1435888684200.html

    转载请注明原文地址: https://ju.6miu.com/read-969838.html

    最新回复(0)