动画

第十六天·动画

帧动画

通俗的讲帧动画就是把每个图片连载一起播放,播放出来的效果就好比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);
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值