Android 补间动画

一、补间动画的种类

       分为四种:

      1. 灰度动画 AlphaAnimation

      2. 平移动画 TranslateAnimation

      3 缩放动画  ScaleAnimation

      4 旋转动画  RotateAnimation

     四种动画都是源于共同的动画类Animation 。因此 用于Animation的属性与方法。常用的用法有:

      1。 setFillAfter:设置是否维持结束画面,true表示动画结束后停留在结束画面,false表示动画结束后恢复到开始画面

      2.   setRepeatMode:设置重播模式。Animation.RESTATR表示从头开始,Animation.REVERSE表示倒过来开始。默认为Animation.RESTATR

      3    setRepeateCount:设置重播次数。默认为0表示只播放一次

      4    setDuration: 设置动画的停留时间,单位毫秒

      5    setInterpolator:设置动画的插值器

      6  setAnimationListener:设置动画事件的监听器,需实现接口AnimationListener的3个方法

          onAnimationStart:在动画开始时触发

          onAnimationEnd:在动画结束时触发

          onAnimationRepeat:在动画重播时触发


   与帧动画一样补间动画也需要一个宿主视图,对宿主视图施展动画效果,不同的是,帧动画的宿主视图是ImageView相关的图像视图,而补间动画的宿主视图可以是任意视图,只要派生自View类就行。给补间动画指定宿主视图的方法很简单,调用宿主对象的startAnimation方法即可命令宿主视图开始动画,调用宿主对象的clearAnimation方法即可要求宿主视图清除动画。


  

Animation类的坐标类型说明
ABSOLUTE绝对位置
RELATIVE_TO_SELF相对自身位置
RELATIVE_TO_PARENT相对上级位置

ctivity_main.xml

<LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:gravity="right" android:text="补间动画类型:" android:textColor="@color/black" android:textSize="17sp" /> <Spinner android:id="@+id/sp_tween" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:spinnerMode="dialog" /></LinearLayout><RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="0dp" android:layout_marginLeft="0dp" android:id="@+id/frameAnim" /> <ImageView android:id="@+id/iv_tween_anim" android:layout_width="match_parent" android:layout_height="300dp" android:scaleType="fitCenter" android:src="@drawable/oval" /></RelativeLayout>


MainActivity.java

public class MainActivity extends AppCompatActivity implements Animation.AnimationListener{

    private Animation alphaAnim, translateAnim, scaleAnim, roateAnim;
    private ImageView iv_tween_anim;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        createMjAnimation();
    }

    private void showFrameAnimation() {
        ImageView frameAnim = findViewById(R.id.frameAnim);
        frameAnim.setImageResource(R.drawable.frame_anim);
        AnimationDrawable ad_frame = (AnimationDrawable) frameAnim.getDrawable();
        ad_frame.start();
    }

    private void showGifAnimation() {
        ImageView iv_gif = findViewById(R.id.frameAnim);
        InputStream is = getResources().openRawResource(R.raw.loading);
        GifImage gifImage = new GifImage();
        int code = gifImage.read(is);
        if (code == GifImage.STATUS_OK) {
            GifImage.GifFrame[] frameList = gifImage.getFrames();
            AnimationDrawable ad_gif = new AnimationDrawable();
            for (int i = 0; i < frameList.length; i++) {
                //BitmapDrawable用于把Bitmap格式转换为Drawable格式
                BitmapDrawable bitmapDrawable = new BitmapDrawable(getResources(), frameList[i].image);
                ad_gif.addFrame(bitmapDrawable, frameList[i].delay);
            }
            ad_gif.setOneShot(false);
            iv_gif.setImageDrawable(ad_gif);
            ad_gif.start();
        } else if (code == GifImage.STATUS_FORMAT_ERROR) {
            Toast.makeText(this, "该图片不是gif格式", Toast.LENGTH_LONG).show();
        } else {
            Toast.makeText(this, "gif图片读取失败:" + code, Toast.LENGTH_LONG).show();
        }

    }

    private void showFadeAnimation() {
        Drawable[] drawableArray = {
                getResources().getDrawable(R.drawable.fade_begin),
                getResources().getDrawable(R.drawable.fade_end),
        };
        TransitionDrawable td_fade = new TransitionDrawable(drawableArray);
        ImageView image = findViewById(R.id.frameAnim);
        image.setImageDrawable(td_fade);
        td_fade.startTransition(3300);
    }

    private void createMjAnimation() {
        iv_tween_anim = (ImageView) findViewById(R.id.iv_tween_anim);
        initanim();
        initTweenSpinner();
    }

    private void initanim() {
        //从完全透明变为即将不透明
        alphaAnim = new AlphaAnimation(1.0f, 0.1f);
        alphaAnim.setDuration(3000);
        alphaAnim.setFillAfter(true);

        //向左平移200
        translateAnim = new TranslateAnimation(1.0f, -200f, 1.0f, 1.0f);
        translateAnim.setDuration(3000);
        translateAnim.setFillAfter(true);

        //宽度不变,高度变为原来的二分之一
        scaleAnim = new ScaleAnimation(1.0f, 1.0f, 1.0f, 0.5f);
        scaleAnim.setDuration(3000);
        scaleAnim.setFillAfter(true);

        //围绕着圆心顺时针旋转360度
        roateAnim = new RotateAnimation(0f, 360f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
        roateAnim.setDuration(3000);
        roateAnim.setFillAfter(true);


    }
    private void initTweenSpinner() {

        ArrayAdapter<String> tweenAdapter = new ArrayAdapter<String>(this,
                R.layout.item_select, tweenArray);
        Spinner sp_tween = (Spinner) findViewById(R.id.sp_tween);
        sp_tween.setPrompt("请选择补间动画类型");
        sp_tween.setAdapter(tweenAdapter);
        sp_tween.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
                if (arg2 == 0) {
                    iv_tween_anim.startAnimation(alphaAnim);
                    alphaAnim.setAnimationListener(MainActivity.this);
                } else if (arg2 == 1) {
                    iv_tween_anim.startAnimation(translateAnim);
                    translateAnim.setAnimationListener(MainActivity.this);
                } else if (arg2 == 2) {
                    iv_tween_anim.startAnimation(scaleAnim);
                    scaleAnim.setAnimationListener(MainActivity.this);
                } else if (arg2 == 3) {
                    iv_tween_anim.startAnimation(roateAnim);
                    roateAnim.setAnimationListener(MainActivity.this);
                }
            }
            @Override
            public void onNothingSelected(AdapterView<?> parent) {
                // Another interface callback
            }
        });
        sp_tween.setSelection(0);
    }
    private String[] tweenArray={"灰度动画", "平移动画", "缩放动画", "旋转动画"};

    @Override
    public void onAnimationStart(Animation animation) {
    }
    @Override
    public void onAnimationEnd(Animation animation) {
        if (animation.equals(alphaAnim)) {
            Animation alphaAnim2 = new AlphaAnimation(0.1f, 1.0f);
            alphaAnim2.setDuration(3000);
            alphaAnim2.setFillAfter(true);
            iv_tween_anim.startAnimation(alphaAnim2);
        } else if (animation.equals(translateAnim)) {
            Animation translateAnim2 = new TranslateAnimation(-200f, 1.0f, 1.0f, 1.0f);
            translateAnim2.setDuration(3000);
            translateAnim2.setFillAfter(true);
            iv_tween_anim.startAnimation(translateAnim2);
        } else if (animation.equals(scaleAnim)) {
            Animation scaleAnim2 = new ScaleAnimation(1.0f, 1.0f, 0.5f, 1.0f);
            scaleAnim2.setDuration(3000);
            scaleAnim2.setFillAfter(true);
            iv_tween_anim.startAnimation(scaleAnim2);
        } else if (animation.equals(roateAnim)) {
            Animation rotateAnim2 = new RotateAnimation(0f, -360f,
                    Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
            rotateAnim2.setDuration(3000);
            rotateAnim2.setFillAfter(true);
            iv_tween_anim.startAnimation(rotateAnim2);
        }
    }
    @Override
    public void onAnimationRepeat(Animation animation) {
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值