第十六天·动画
帧动画
通俗的讲帧动画就是把每个图片连载一起播放,播放出来的效果就好比GIF的图片一样。
静态方式的帧动画,
1、在xml布局文件中把动画列出来,把所有的照片放到drawable的frame的文件中
2、< animation-list >根节点 < item>每一帧的节点item节点中的两个属性
duration:设置一次的播放时间
drawable:设置每一帧的图片资源
<animation-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@mipmap/a2" android:duration="100"/>
<item android:drawable="@mipmap/a3" android:duration="100"/>
</animation-list>
3、把这个资源文件设置成控件背景
<ImageView
android:id="@+id/frame_iv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/frame"
/>
4、通过控件的getBackground()方法得到AnimationDrawable的对象
5、通过AnimationDrawable对象调用start(),停止动画stop()
6、通过AnimationDrawable的对象可以设置动画的播放属性,例如:循环播放;
private void startFrameAnim(){
//把imageview控件的背景资源获取出来,转换成animationDrawable类型
AnimationDrawable drawable= (AnimationDrawable) frameIv.getBackground();
//让动画资源开始的方法
drawable.start();
}
动态方式的帧动画,布局里写一个控件,然后就是用代码写出其样式效果。
1、创建一个AnimationDrawable的对象,使用new的方式
2、使用循环的方式把每一帧的图片资源添加到AnimationDrawable对象中
3、通过AnimationDrawable的对象调用start(),停止动画stop();
4、通过AnimationDrawable的对象可以设置动画的播放属性,例如:循环播放
注意:先给控件设置动画资源,然后再调用start()的方法
//动态方式的帧动画
private void startFrameAnim1(){
AnimationDrawable drawable=new AnimationDrawable();
//通过getResources()方法把a2--a20的18张图片加载到动画里去
for (int i=2;i<20;i++){
//getIdentifier(图片名,图片所在的文件夹,当前的包名
int id=getResources().getIdentifier("a"+i,"mipmap",getPackageName());
//根据图片id把图片转换成Drawable的对象
Drawable frame=getResources().getDrawable(id);
//把当前图片添加到AnimationDrawable的对象中,并设置时间
drawable.addFrame(frame,500);
}
//设置播放模式是否循环播放,false是循环,true是不循环
drawable.setOneShot(false);
//设置本类将要显示的这个动画
frameIv.setBackgroundDrawable(drawable);
//开始动画
drawable.start();
}
补间动画
具有平移、透明、旋转、缩放的动画效果就叫补间动画。
它的实现:
确定初始和终止位置,然后中间的过程为补间动画的动画效果
补间动画有四种:
1、TranslateAnimation(平移动画)
2、ScaleAnimation(缩放动画)
3、RotateAnimation(旋转动画)
4、AlphaAnimation(透明动画)
静态方式实现:
1、res/anim在该文件夹中创建xml资源文件
2、创建对应动画效果的节点。例如:< rotate/>旋转动画节点,同时设置该动画的属性:开始的位置、结束的位置、播放次数、播放模式
3、使用对应的动画类,通过AnimationUtils.loadAnimation(context,资源文件)
4、通过动画类的对象调用start()播放动画
5、把该动画类绑定到控件上
动态方式实现:
1、创建对应的动画类,使用new的方式。通过构造方法,把该动画的初始位置和终止位置确定出来
2、通过动画类的对象,设置该动画的属性:一次的播放时间、播放次数、播放模式
3、调用start()启动动画
4、把该动画类的对象绑定在控件上
注意:补间动画要先启动动画,再进行绑定
组合补间动画:
1、通过xml资源文件吧多个动画节点放在< set >节点中
2、在动画的节点中,只设置动画的开始终止位置和重复字数,重复模式和播放时间等属性在set节点中设置
3、使用Animation类的对象来加载组合补间动画
4、之后操作同静态补间动画一样
补间动画的应用:
activity的跳转添加动画效果
overridePendingTransition(进入动画,退出动画);
写在StartActivity和finish这两个方法的下面。
onKeyDown()监听手机按键的方法
KeyCode参数可以判断当前按下的是什么键
以下是用八副图来把补间动画的平移、透明、旋转、缩放的静态、动态的方式全都写出来了。
package com.xiaogao.user.android2lesson_16_animationapp;
import android.graphics.drawable.AnimationDrawable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.animation.RotateAnimation;
import android.view.animation.ScaleAnimation;
import android.view.animation.TranslateAnimation;
import android.widget.ImageView;
public class TweenAnimActivity extends AppCompatActivity {
private ImageView iv1, iv2, iv3, iv4,iv5,iv6,iv7,iv8;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tween_anim);
iv1 = (ImageView) findViewById(R.id.tween_iv1);
iv2 = (ImageView) findViewById(R.id.tween_iv2);
iv3 = (ImageView) findViewById(R.id.tween_iv3);
iv4 = (ImageView) findViewById(R.id.tween_iv4);
iv5 = (ImageView) findViewById(R.id.tween_iv5);
iv6 = (ImageView) findViewById(R.id.tween_iv6);
iv7 = (ImageView) findViewById(R.id.tween_iv7);
iv8 = (ImageView) findViewById(R.id.tween_iv8);
startTweenTran(iv1);
startTweenTran1(iv2);
startRotateAnim(iv3);
startAnim(iv4);
startAlphaAnim(iv5);
startAlph(iv6);
startScaleAnim(iv7);
startScale(iv8);
}
/**
* 开始一个平移动画,静态方式
* 和帧动画的区别:帧动画要先绑定控件再start(),补间动画要先启动,再绑定
*/
private void startTweenTran(ImageView iv) {
//通过引入xml文件的方式加载一个动画
TranslateAnimation animation = (TranslateAnimation) AnimationUtils.loadAnimation(this, R.anim.translate);
//让动画动起来
animation.start();
//把平移动画和控件进行绑定
iv.setAnimation(animation);
}
/**
* 动态实现平移
* TranslateAnimation(int fromXType, float fromXValue, int toXType, float toXValue, int fromYType, float fromYValue, int toYType, float toYValue)
* fromXType:x坐标起始位置的类型(1、相对自己(Animation.RELATIVE_TO_SELF),2、相对父布局,3、局对位置)
* fromXValue:x坐标起始位置的值
* toXType
*
* @param iv
*/
private void startTweenTran1(ImageView iv) {
TranslateAnimation animation = new TranslateAnimation(
Animation.RELATIVE_TO_SELF,
0f,
Animation.RELATIVE_TO_SELF,
-3f,
Animation.RELATIVE_TO_SELF,
0f,
Animation.RELATIVE_TO_SELF,
3f);
//重复次数(Animation.INFINITE无限次数)
animation.setRepeatCount(Animation.INFINITE);
//动画时间
animation.setDuration(2000);
//设置动画 执行动画的模式(Animation.REVERSE往返;Animation.RESTART重复
animation.setRepeatMode(Animation.REVERSE);
//开始动画
animation.start();
//绑定,让iv控件实现动画效果
iv.setAnimation(animation);
}
/**
* 旋转动画的静态方式,使用资源文件的方式,并启动
* @param iv
*/
private void startRotateAnim(ImageView iv){
//把旋转动画的资源文件,转换成旋转动画对象
RotateAnimation animation= (RotateAnimation) AnimationUtils.loadAnimation(this,R.anim.rotate);
animation.start();
iv.setAnimation(animation);
}
/**
* 旋转动画+平移动画
* 使用资源文件实现
*/
private void startAnim(ImageView iv){
Animation animation=AnimationUtils.loadAnimation(this,R.anim.rotate_tanslate);
animation.start();
iv.startAnimation(animation);
}
/**
* 静态方式的透明度
*/
private void startAlphaAnim(ImageView iv){
AlphaAnimation drawable= (AlphaAnimation) AnimationUtils.loadAnimation(this,R.anim.alpha);
drawable.start();
iv.setAnimation(drawable);
}
/**
* 动态方式的透明度
*/
private void startAlph(ImageView iv){
AlphaAnimation animation=new AlphaAnimation(2,0);
animation.setDuration(2000);
animation.start();
iv.setAnimation(animation);
}
/**
* 静态方式的缩放
*/
private void startScaleAnim(ImageView iv){
ScaleAnimation animation= (ScaleAnimation) AnimationUtils.loadAnimation(this,R.anim.scale);
animation.start();
iv.setAnimation(animation);
}
/**
* 动态方式的缩放
*/
private void startScale(ImageView iv){
ScaleAnimation animation=new ScaleAnimation(0f,3f,0f,3f,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
animation.setDuration(2000);
animation.setRepeatCount(Animation.INFINITE);
animation.start();
iv.setAnimation(animation);
}
}
这是用手机上的返回按钮来布置动画效果:
/**
* 响应获取手机按键的方法
* KEYCODE_BACK:手机的返回键
* @param keyCode
* @param event
* @return
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
//1、判断到当前点击的按键为返回键
//2、既然自己判断了返回键的监听事件,就要自己来实现返回的功能
if (keyCode==KeyEvent.KEYCODE_BACK){
finish();
overridePendingTransition(R.anim.tran_back_in,R.anim.tran_back_out);
}
return super.onKeyDown(keyCode, event);
}