用开源项目ActivityOptionsICS让ActivityOptions的动画实现兼容

来源:互联网 发布:handpan软件 编辑:程序博客网 时间:2024/06/08 15:29

我之前写过一篇文章是讲解ActivityOption的api方法的(http://www.cnblogs.com/tianzhijiexian/p/4087917.html),当时吐槽各种动画不兼容,完全无视我们4.x或者2.x用户嘛,好在有开源库赖帮助我们实现动画。

ActivityOptionsICS

提供了和ActivityOptions、ActivityCompat基本一致的方法来实现相同的动画效果,总共有如下方法。

(1)public static ActivityOptionsCompatICS makeCustomAnimation(Context context,int enterResId, int exitResId)

参数:

enterId:进入动画的资源ID

exitId:退出动画的资源ID

设置自定义的Activity动画,出入的是动画资源的id。

这个方法和overridePendingTransition(R.anim.slide_bottom_in, android.R.anim.fade_out);十分类似,传入一个进入的动画和一个退出的动画即可

    public void customAnim() {        ActivityOptionsCompatICS options = ActivityOptionsCompatICS.makeCustomAnimation(this,                R.anim.slide_right_in, R.anim.slide_bottom_out);        ActivityCompatICS.startActivity(MainActivity.this, intent, options.toBundle());    }

 

(2)public static ActivityOptionsCompatICS makeScaleUpAnimation(View source, int startX, int startY,

int width, int height)

参数:

source:一个view对象,用户确定新activity启动的初始坐标

startX:新activity出现的初始X坐标,这个坐标是相对于source的左上角X坐标

startY:新activity出现的初始Y坐标,这个坐标相对于source的左上角Y坐标

width:新activity初始的宽度

height:新activity初始的高度

通过看源码可以很容易理解这些参数的意义

        int[] pts = new int[2];//ps = position,目的得到当前view相对于屏幕的坐标        source.getLocationOnScreen(pts);        // 设置起始坐标和起始宽高        opts.mStartX = pts[0] + startX;        opts.mStartY = pts[1] + startY;        opts.mWidth = width;        opts.mHeight = height;

实现的效果是:新的Activity从某个位置以某个大小出现,然后慢慢拉伸渐变到整个屏幕

public void scaleUpAnim(View view) {        ActivityOptionsCompatICS options = ActivityOptionsCompatICS.makeScaleUpAnimation(view,                 0, 0, //拉伸开始的坐标                 view.getMeasuredWidth(), view.getMeasuredHeight());//初始的宽高        ActivityCompatICS.startActivity(MainActivity.this, intent, options.toBundle());    }

 

(3)public static ActivityOptionsCompatICS makeThumbnailScaleUpAnimation(View source, 

Bitmap thumbnail, int startX, int startY) 

参数:

source:一个view对象,用来确定起始坐标

thumbnail:一个bitmap对象,新的activity将通过这个bitmap渐变拉伸出现,新的activity初始大小就是这个bitmap的大小

startX:新activity初始的X坐标,相对于source左上角的X来说的

startY:新的activity初始的Y坐标,相对于source左上角Y坐标来说的

效果是:一个bitmap慢慢从某个位置拉伸渐变新的activity

public void thumbNailScaleAnim(ImageView view) {        view.setDrawingCacheEnabled(true);         Bitmap bitmap = view.getDrawingCache();          ActivityOptionsCompatICS options = ActivityOptionsCompatICS.makeThumbnailScaleUpAnimation(            view, bitmap, 0, 0);          // Request the activity be started, using the custom animation options.          ActivityCompatICS.startActivity(MainActivity.this, intent, options.toBundle());          //view.setDrawingCacheEnabled(false);    }

 

(4)public static ActivityOptionsCompatICS makeSceneTransitionAnimation(Activity activity, 

final View sharedElement,int sharedElementId)

参数:

activity:当前activity的对象

sharedElement:一个view对象,用来和新的activity中的一个view对象产生动画

sharedElemetId:新的activity中的view的Id,这个view是用来和原始activity中的view产生动画的

效果是:原始activity中的一个view随着新activity的慢慢启动而移动到新的activity中,实现补间动画

public void screenTransitAnim(View v,int id) {        ActivityOptionsCompatICS options = ActivityOptionsCompatICS.                makeSceneTransitionAnimation(this, v,id);        ActivityCompatICS.startActivity(MainActivity.this, intent, options.toBundle());    }

 

 

(5)public static ActivityOptionsCompatICS makeSceneTransitionAnimation(Activity activity,

Pair<View, Integer>... sharedElements)

参数:

activity:当前的activity

sharedElements:Pair对象,上面的一个方法是实现单一view的动画,这里可以有多个view对象进行动画

screenTransitAnimByPair(                    Pair.create((View)orginalImageView, R.id.target_imageView),                    Pair.create((View)orginalTextView, R.id.target_textView),                    Pair.create((View)chromeIView, R.id.target_chrome_imageView));

 

    @SuppressWarnings("unchecked")    public void screenTransitAnimByPair(Pair<View, Integer>... views) {        ActivityOptionsCompatICS options = ActivityOptionsCompatICS.makeSceneTransitionAnimation(                MainActivity.this, views);        ActivityCompatICS.startActivity(MainActivity.this, intent, options.toBundle());    }

 

0 0