首页 > 代码库 > 用开源项目ActivityOptionsICS让ActivityOptions的动画实现兼容
用开源项目ActivityOptionsICS让ActivityOptions的动画实现兼容
我之前写过一篇文章是讲解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()); }
用开源项目ActivityOptionsICS让ActivityOptions的动画实现兼容