第六例:Activity的切换动画

来源:互联网 发布:天赐系统安装软件 编辑:程序博客网 时间:2024/06/05 19:48

在Android开发过程中,经常会碰到Activity之间的切换效果的问题 ,从Android2.0开始在Activity增加了一个方法:

public void overridePendingTransition (int enterAnim, int exitAnim)

其中:

enterAnim 定义Activity进入屏幕时的动画

exitAnim 定义Activity退出屏幕时的动画

overridePendingTransition 方法必须在startActivity()或者 finish()方法的后面。


但是这种老旧、生硬的方式怎么能适合我们的MD风格的App呢!好在google在新的sdk中给我们提供了另外一种Activity的过度动画—ActivityOptions。并且提供了兼容包——ActivityOptionsCompat。这篇博客我们就是来了解下这个新的activity过度机制。

ActivityOptionsCompat是一个静态类,提供了为数不多的几个方法,下面我们来罗列一下:

1.
ActivityOptionsCompat.makeCustomAnimation(Context context, int enterResId, int exitResId)

2.
ActivityOptionsCompat.makeScaleUpAnimation(View source,int startX, int startY, int startWidth, int startHeight)

3.
ActivityOptionsCompat.makeThumbnailScaleUpAnimation(View source,Bitmap thumbnail, int startX, int startY)

4.
ActivityOptionsCompat.makeSceneTransitionAnimation(Activity activity, View sharedElement, String sharedElementName)

5.
ActivityOptionsCompat.makeSceneTransitionAnimation(Activity activity,Pair<View, String>… sharedElements)


package demo.my.com.myapidemo.app.ui;import android.app.Activity;import android.app.ActivityOptions;import android.content.Intent;import android.graphics.Bitmap;import android.graphics.Canvas;import android.os.Bundle;import android.view.View;import android.widget.Button;import demo.my.com.myapidemo.R;/** * Created by Hack on 2015/10/21. */public class Animation extends Activity {    private static final String TAG = "apidemo";    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_animation);        // 获取点击按钮        Button button = (Button)findViewById(R.id.fade_animation);        button.setOnClickListener(mFadeListener);        button = (Button)findViewById(R.id.zoom_animation);        button.setOnClickListener(mZoomListener);        // SDK的版本判断  android.os.Build.VERSION_CODES.JELLY_BEAN:4.2及以上版本        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) {            button = (Button)findViewById(R.id.modern_fade_animation);            button.setOnClickListener(mModernFadeListener);            button = (Button)findViewById(R.id.modern_zoom_animation);            button.setOnClickListener(mModernZoomListener);            button = (Button)findViewById(R.id.scale_up_animation);            button.setOnClickListener(mScaleUpListener);            button = (Button)findViewById(R.id.zoom_thumbnail_animation);            button.setOnClickListener(mZoomThumbnailListener);        } else {            findViewById(R.id.modern_fade_animation).setEnabled(false);            findViewById(R.id.modern_zoom_animation).setEnabled(false);            findViewById(R.id.scale_up_animation).setEnabled(false);            findViewById(R.id.zoom_thumbnail_animation).setEnabled(false);        }    }    //淡入淡出效果 旧式overridePendingTransition    private View.OnClickListener mFadeListener = new View.OnClickListener() {        public void onClick(View v) {            startActivity(new Intent(Animation.this, HelloWorld.class));            overridePendingTransition(R.anim.fade, R.anim.hold);        }    };    //缩放效果 旧式    private View.OnClickListener mZoomListener = new View.OnClickListener() {        public void onClick(View v) {            startActivity(new Intent(Animation.this, HelloWorld.class));            overridePendingTransition(R.anim.zoom_enter, R.anim.zoom_exit);        }    };    //淡入淡出效果 新式,使用ActivityOptions    private View.OnClickListener mModernFadeListener = new View.OnClickListener() {        public void onClick(View v) {            ActivityOptions opts = ActivityOptions.makeCustomAnimation(Animation.this,                    R.anim.fade, R.anim.hold);            startActivity(new Intent(Animation.this, HelloWorld.class), opts.toBundle());        }    };    private View.OnClickListener mModernZoomListener = new View.OnClickListener() {        public void onClick(View v) {            ActivityOptions opts = ActivityOptions.makeCustomAnimation(Animation.this,                    R.anim.zoom_enter, R.anim.zoom_enter);            startActivity(new Intent(Animation.this, HelloWorld.class), opts.toBundle());        }    };    private View.OnClickListener mScaleUpListener = new View.OnClickListener() {        public void onClick(View v) {            ActivityOptions opts = ActivityOptions.makeScaleUpAnimation(                    v, 0, 0, v.getWidth(), v.getHeight());            startActivity(new Intent(Animation.this, HelloWorld.class), opts.toBundle());        }    };    private View.OnClickListener mZoomThumbnailListener = new View.OnClickListener() {        public void onClick(View v) {            v.setDrawingCacheEnabled(true);            v.setPressed(false);            v.refreshDrawableState();            Bitmap bm = v.getDrawingCache();            ActivityOptions opts = ActivityOptions.makeThumbnailScaleUpAnimation(                    v, bm, 0, 0);            startActivity(new Intent(Animation.this, HelloWorld.class), opts.toBundle());            v.setDrawingCacheEnabled(false);        }    };}

xml文件:

zoom_enter.xml

<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android"        android:interpolator="@android:anim/decelerate_interpolator">    <scale android:fromXScale="2.0" android:toXScale="1.0"           android:fromYScale="2.0" android:toYScale="1.0"           android:pivotX="50%p" android:pivotY="50%p"           android:duration="@android:integer/config_mediumAnimTime" /></set>

fade.xml

fromAlpha起始动画透明度

toAlpha结束动画透明度

取值:0.0~1.0之间的浮点型数值

0:完全透明1:不透明

<?xml version="1.0" encoding="utf-8"?><alpha xmlns:android="http://schemas.android.com/apk/res/android"       android:interpolator="@android:anim/accelerate_interpolator"       android:fromAlpha="0.0" android:toAlpha="1.0"       android:duration="@android:integer/config_longAnimTime" />
hold.xml

            整型值:  
                fromXDelta 属性为动画起始时 X坐标上的位置  
                toXDelta   属性为动画结束时 X坐标上的位置  
                fromYDelta 属性为动画起始时 Y坐标上的位置  
                toYDelta   属性为动画结束时 Y坐标上的位置  
                注意:  
                         没有指定,  
                         默认是以自己为相对参照物  
            长整型值:  
                duration  属性为动画持续时间  

                说明:   时间以毫秒为单位  

在这些属性里面还可以加上%和p,例如:

android:toXDelta="100%",表示自身的100%,也就是从View自己的位置开始。

android:toXDelta="80%p",表示父层View的80%,是以它父层View为参照的。

<?xml version="1.0" encoding="utf-8"?><translate xmlns:android="http://schemas.android.com/apk/res/android"       android:interpolator="@android:anim/accelerate_interpolator"       android:fromXDelta="0" android:toXDelta="0"       android:duration="@android:integer/config_longAnimTime" />


参考文章:

http://blog.csdn.net/menxu_work/article/details/10258787

http://www.bkjia.com/Androidjc/1049811.html

1 0
原创粉丝点击