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。谨慎使用!一般不推荐使用。此篇文章到此结束。请继续关注下篇博客。
写博客是为了帮助开发者学习使用技术,同时巩固自己所学技术。如果此篇博客有助于您的学习,那是我的荣幸!如果此篇博客有任何瑕疵,请多多指教!在此感谢您的学习和指教!