Android中的动画,毕竟在APP中增加上一些动画,会让咱们的应用变得很炫,比方最简略的关开Activity,当然自定义控件动画必定必不可少啦。Android中的动画分为三大类,逐帧动画(Frame) 以及补间动画(Tween) ,还有Android 3.0以后引进的特点动画(Property) ,而本节给咱们带来的是第一种动画——逐帧动画的一个根本运用。
1.帧动画概念以及用法
帧动画非常容易了解,其实就是简略的由N张静态图片搜集起来,然后咱们经过操控依次显现这些图片,因为人眼”视觉残留”的原因,会让咱们形成动画的”幻觉”,跟放电影的原理相同!
当然咱们也能够在Java代码中创立逐帧动画,创立AnimationDrawable目标,然后调用addFrame(Drawable frame,int duration)向动画中增加帧,接着调用start()和stop()罢了。
下面咱们来写两个例子体会下帧动画的作用以及熟悉下用法:
2.运用示例
示例一:最简略的例子:
运转作用图:
代码完成:
首先编写咱们的动画文件,非常简略,先在res下创立一个anim目录,接着开端撸咱们的动画文件:miao_gif.xml:这里的android:oneshot是设置动画是否只是播映一次,true只播映一次,false循环播映!
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<item
android:drawable="@mipmap/img_miao1"
android:duration="80" />
<item
android:drawable="@mipmap/img_miao2"
android:duration="80" />
<item
android:drawable="@mipmap/img_miao3"
android:duration="80" />
<!--限于篇幅,省略其他item,自己补上-->
...
</animation-list>
动画文件有了,接着到咱们的布局文件:activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/btn_start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="开端" />
<Button
android:id="@+id/btn_stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="停止" />
<ImageView
android:id="@+id/img_show"
android:layout_width="120dp"
android:layout_height="120dp"
android:layout_gravity="center"
android:background="@anim/miao_gif" />
</LinearLayout>
最终是咱们的MainActivity.java,这里在这里操控动画的开端以及暂停
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button btn_start;
private Button btn_stop;
private ImageView img_show;
private AnimationDrawable anim;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bindViews();
anim = (AnimationDrawable) img_show.getBackground();
}
private void bindViews() {
btn_start = (Button) findViewById(R.id.btn_start);
btn_stop = (Button) findViewById(R.id.btn_stop);
img_show = (ImageView) findViewById(R.id.img_show);
btn_start.setOnClickListener(this);
btn_stop.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_start:
anim.start();
break;
case R.id.btn_stop:
anim.stop();
break;
}
}
}
示例二:在指定当地播映帧动画
运转作用图:
代码完成:
依旧是先上咱们的动画文件:anim_zhuan.xml:
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="true">
<item
android:drawable="@mipmap/img_zhuan1"
android:duration="80" />
<item
android:drawable="@mipmap/img_zhuan2"
android:duration="80" />
<item
android:drawable="@mipmap/img_zhuan3"
android:duration="80" />
<!--限于篇幅,省略其他item,自己补上-->
...
</animation-list>
接着咱们来写一个自定义的ImageView:FrameView.java,这里经过反射获得当前播映的帧,然后是否为最终一帧,是的话躲藏控件!
/**
* Created by Jay on 2015/11/15 0015.
*/
public class FrameView extends ImageView {
private AnimationDrawable anim;
public FrameView(Context context) {
super(context);
}
public FrameView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public FrameView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public void setAnim(AnimationDrawable anim){
this.anim = anim;
}
public void setLocation(int top,int left){
this.setFrame(left,top,left + 200,top + 200);
}
@Override
protected void onDraw(Canvas canvas) {
try{
//反射调用AnimationDrawable里的mCurFrame值
Field field = AnimationDrawable.class
.getDeclaredField("mCurFrame");
field.setAccessible(true);
int curFrame = field.getInt(anim);// 获取anim动画的当前帧
if (curFrame == anim.getNumberOfFrames() - 1)// 假如现已到了最终一帧
{
//让该View躲藏
setVisibility(View.INVISIBLE);
}
}catch (Exception e){e.printStackTrace();}
super.onDraw(canvas);
}
}
最终是咱们的MainActivity.java,创立一个FrameLayout,增加View,对触摸事情中按下的事情做处理,显现控件以及敞开动画。
public class MainActivity extends AppCompatActivity {
private FrameView fView;
private AnimationDrawable anim = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FrameLayout fly = new FrameLayout(this);
setContentView(fly);
fView = new FrameView(this);
fView.setBackgroundResource(R.anim.anim_zhuan);
fView.setVisibility(View.INVISIBLE);
anim = (AnimationDrawable) fView.getBackground();
fView.setAnim(anim);
fly.addView(fView);
fly.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
//设置按下时才发生动画作用
if(event.getAction() == MotionEvent.ACTION_DOWN){
anim.stop();
float x = event.getX();
float y = event.getY();
fView.setLocation((int) y - 40,(int)x-20); //View显现的位置
fView.setVisibility(View.VISIBLE);
anim.start(); //敞开动画
}
return false;
}
});
}
}
3.本节示例代码和Gif帧提取东西下载
AnimationDemo1.zip
AnimationDemo2.zip
Gif帧提取东西