本系列博文 最终的目的是能教会大家自己实现比较复杂的android 自定义控件。所以知识点不仅仅局促在自定义view本身上面。实际上现在github上一些做的比较出色的自定义控件 大部分都是由三个部分组成
第一:动画 第二:自定义view 第三:触摸滑动控制。所以我们这个系列也是由动画作为开篇。最终会带着大家分析几个github上比较出色的自定义控件。
Android 的frame动画是比较简单基础的内容,在以往的2.x 3.x版本很多人都会去使用这个 来作为loading 图的实现方法。但是最近实际上在做loading图效果的时候很多人已经不去使用frame了。
原因是有更简单的方法----直接播放一个gif图片更好。更方便。但是在以往10-12年这个时间段 android的机器硬件还比较一般的时候 还是避免这么做的,因为直接播放gif 图片比较消耗cpu和内存。
而用frame动画来做 效果会更好一些。废话不多说,简单介绍两种方法来实现frame动画。
首先在res下面新建一个文件夹 anim,然后在这个文件夹里面新建一个动画文件(这个文件不要放在drawable下面,有些android 版本会在这里报错 一定要放在anim下)。例如
android:oneshot="true" >
android:drawable="@drawable/aaa"
android:duration="1000"/>
android:drawable="@drawable/bbb"
android:duration="1000"/>
android:drawable="@drawable/ccc"
android:duration="1000"/>
android:drawable="@drawable/ddd"
android:duration="1000"/>
android:drawable="@drawable/eee"
android:duration="1000"/>
这就是我们要播放的动画内容 android:oneshot 这个属性是指是不是播放一次就结束 true 就是一次就结束 false就是一直播放下去 android:duration="1000" 是指每隔一千毫秒就换下一张图片。
然后在mainActivity的 xml里面引用这个文件即可
1
2 xmlns:tools="外链网址已屏蔽"
3 android:layout_width="match_parent"
4 android:layout_height="match_parent"
5 android:orientation="vertical" >
6
7
9 android:layout_width="wrap_content"
10 android:layout_height="wrap_content"
11 android:background="@anim/dance" />
12
13
之后即可看到效果,当然有的人想做的炫酷一点,比如说资源文件是从网上拉取的, 要做成动态加载动画,那么也是可以的,通过代码来控制即可
1 packagecom.example.frametest;2
3 importandroid.app.Activity;4 importandroid.graphics.drawable.AnimationDrawable;5 importandroid.graphics.drawable.Drawable;6 importandroid.os.Bundle;7 importandroid.widget.ImageView;8
9 public class MainActivity extendsActivity {10
11 privateImageView iv;12
13 private AnimationDrawable animDr = newAnimationDrawable();14
15 @Override16 protected voidonCreate(Bundle savedInstanceState) {17 super.onCreate(savedInstanceState);18 setContentView(R.layout.activity_main);19 this.iv = (ImageView) this.findViewById(R.id.im);20 //这边图省事就直接加载drawable文件夹下面的图片 如果有需要你们可以直接加载sd卡下的图片
21 Drawable drawable =getResources().getDrawable(R.drawable.aaa);22 animDr.addFrame(drawable, 1000);23 Drawable drawable2 =getResources().getDrawable(R.drawable.bbb);24 animDr.addFrame(drawable2, 1000);25 Drawable drawable3 =getResources().getDrawable(c);26 animDr.addFrame(drawable3, 1000);27 Drawable drawable4 =getResources().getDrawable(R.drawable.ddd);28 animDr.addFrame(drawable4, 1000);29
30 animDr.setOneShot(false);31 iv.setBackgroundDrawable(animDr);32 animDr.start();33
34 }35 }