Android动画学习(一)之动画概述和帧动画实现
来源:互联网 发布:电脑怎么用手机淘宝 编辑:程序博客网 时间:2024/05/16 15:20
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。谨慎使用!一般不推荐使用。此篇文章到此结束。请继续关注下篇博客。
写博客是为了帮助开发者学习使用技术,同时巩固自己所学技术。如果此篇博客有助于您的学习,那是我的荣幸!如果此篇博客有任何瑕疵,请多多指教!在此感谢您的学习和指教!
- Android动画学习(一)之动画概述和帧动画实现
- Android动画详解之Android 动画属性和实现方法之帧动画(二)
- Android动画学习之View动画一
- android学习之动画(一)旋转动画demo
- android 动画实现(一)Tween动画
- Android动画之帧动画(一)
- Android动画学习(二)之补间动画实现
- Android动画详解之Android动画属性和实现方法(一)
- Android动画学习-视图动画&属性动画(一)
- Android动画之帧动画实现方式
- Android动画学习之帧动画二
- Android---动画机制(一)---View动画和帧动画
- android动画基础(一) View动画和属性动画
- Android学习之动画(一)
- Android自助餐之动画(一)帧动画
- Android动画详解之Android 动画属性和实现方法之属性动画(三)
- android动画解析 之补间动画和帧动画
- Android动画学习(五)之属性动画实现Tween的效果和高级属性示例
- 从原理角度解析Android (Java) http 文件上传
- 搭建 Python 开发环境
- Socket加入多线程通信实现简单的CS聊天室
- CSDN 人工智能发展动态在线学习笔记
- Java———反射机制
- Android动画学习(一)之动画概述和帧动画实现
- 带权并查集:CF-2015 ACM Arabella Collegiate Programming Contest(F题)
- Android Media(多媒体)播放Module raw下的音乐
- POJ 2431 Expedition
- C++ Socket编程步骤
- 新手上路 js 之 this关键字 代码笔记
- Linux系统安装MySQL
- springmvc上传文件的三种方式
- 搭建ssm项目环境