一个月没写点东西,最近闲下来打算回顾一下android动画的知识,俗话说温故而知新,就算是简单的东西也要反复的记忆,才能够不会遗忘,废话不多说了,回顾一下常用的动画类型。
常用动画类型
- 帧动画
帧动画,顾名思义就是把一系列图片像放电影一样连续的播放,那就要求图片衔接有紧凑感,哈哈。可以跟美工“好好聊聊”了。 - 补间动画
补间动画,实现动画的效果是通过对view进行一些图形变换,如平移,旋转,缩放大小,透明度改变。view形式改变,自身的事件并未改变(此处稍后会列举实例去解释) - 属性动画
属性动画,“属性”,看到这两个字应该就能理解到view的变化对自身固有属性产生了影响,与补间动画不同的是,view形式改变,自身的事件也发生改变(如果该view添加了点击事件,那么触发点击事件的位置应该是在view变化后的最终位置)
动画实例分析
- 帧动画FrameAnimation
这里我们拿一个项目中常用的例子来演示,为了增加用户体验,通常在网络加载过程中,我们会给用户显示一个loading的动画以示友好,那好,我们就用帧动画来实现这个效果。
首先,我们准备好一组动画loading要用的图片 loading_animlist.xml
<?xml version="1.0" encoding="utf-8"?>
<!--,oneshot属性表示是否只播放一次,true表示只会播放一次,false表示一直循环播放-->
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<item
android:drawable="@drawable/loading_01"
android:duration="150"/>
<item
android:drawable="@drawable/loading_02"
android:duration="150"/>
<item
android:drawable="@drawable/loading_03"
android:duration="150"/>
<item
android:drawable="@drawable/loading_04"
android:duration="150"/>
<item
android:drawable="@drawable/loading_05"
android:duration="150"/>
<item
android:drawable="@drawable/loading_06"
android:duration="150"/>
<item
android:drawable="@drawable/loading_07"
android:duration="150"/>
</animation-list>
这里要注意的是,animation-list这个tag只有在drawable文件下的xml中才能使用,duration是该帧图片所用的时间毫秒数
其次,需要给这组图片准备一个播放的载体,我们用imageview,这里我是直接在mainactivity的xml中放了一个图片
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
tools:context="com.smart.melo.frameanimation.MainActivity">
<ImageView
android:id="@+id/iv_load"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/loading_animlist"/>
</LinearLayout>
最后,在MainActivy的onCreate()方法中启动该动画
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mImageView = (ImageView) findViewById(R.id.iv_load);
mImageView.setImageResource(R.drawable.loading_animlist);
AnimationDrawable animationDrawable = (AnimationDrawable) mImageView.getDrawable();
animationDrawable.start();
}
这样就完了么???
你会发现为什么动画不会动,而是静止的呢,如果有经验的朋友会发现,此时window还没初始化完成,那么帧动画是是没有找到该window的,(这里如果用过popupwindow的朋友会知道的),那有什么方法能够解决呢?android系统其实给我们提供了一个onWindowFocusChanged()的方法用来判断是否window初始化完成,那改代码吧,添加这个方法
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mImageView = (ImageView) findViewById(R.id.iv_load);
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
mImageView.setImageResource(R.drawable.loading_animlist);
AnimationDrawable animationDrawable = (AnimationDrawable) mImageView.getDrawable();
animationDrawable.start();
}
另外还有的常用方法
//停止动画
animationDrawable.stop();
//动画是否正在播放
animationDrawable.isRunning();
//设置是否循环播放
animationDrawable.setOneShot(true);
//添加一张图片,并设置持续时间
animationDrawable.addFrame(getResources().getDrawable(R.drawable.loading_01),200);
//获取某一帧图片
animationDrawable.getFrame(0);
注意
帧动画适用图片比较少的情况,如果图片数量庞大,很容易会oom,不但如此,ui会很卡,体验不好,所以帧动画既简单实用,又需要注意细节。