Activity转场动画
2016-09-03 10:36
405 查看
一、简介
过场动画主要有ActivityOptions和兼容包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)
二、ActivityOptionsCompat.makeCustomAnimation(Context context, int enterResId, int exitResId)
三个参数,第一个参数是context,第二个参数是进入动画和退出动画,需要注意的是我们启动activity的方式是使用ActivityCompat.startactivity,最后一个参数使用compat.toBundle()。
来看看目标Activity
在退出时调用ActivityCompat.finishAfterTransition(this)进行退出动画。
三、ActivityOptionsCompat.makeScaleUpAnimation(View source,int startX, int startY, int startWidth, int startHeight)
效果为不断方法一个view从而进行Activity的过度
第一个参数为 要操作哪个view,第二个参数和第三个参数是确定要以view的哪个点为基准开始动画,第四个参数和第五个参数是新的Activity从多大开始放大
四、ActivityOptionsCompat.makeThumbnailScaleUpAnimation(View source,Bitmap thumbnail, int startX, int startY)
该方法与上面的makeScaleUpAnimation非常类似,只不过这里是放大一张图片,最后过度到一个新的Activity。第二个参数是指哪个图片要放大,第三个和第四个参数表示要从哪开始动画。
五、单一的makeSceneTransitionAnimation
什么是scene?就是场景动画,在这里就体现在两个Activity中的某些view协同去完成过渡动画。
前两个参数不用多说,第三个参数是什么?因为要协作动画的两个view在不同的activity中,那么我们怎么指定哪两个view呢?这里android给我们提供了一个android:transitionName用来指定是哪些view来进行协作,例如:
六、多个view进行协作
既然能指定一个view来进行协作,那么也能指定多个view进行协作。
指定一个imageview和TextView来进行协作,首先是两个Activity的布局文件,第一个Activity:
很简单,我们分别给TextView和ImageView指定了transitionName,再来看看另一个activity的布局文件,肯定也是这样,分别给TextView和ImageView指定transitionName,
Activity中的代码:
首先,我们通过Pair.create创建两个对象,这里有两个泛型,分别指定为View和String类型,create方法接收两个参数,第一个是参与动画的View,第二个是该view
的transitionName。
七、指定动画
在res目录下的transition中新建xml文件,如果是change_bound,则代码这么写
并在style.xml中配置theme
在代码中设置:
并且还可以添加插补器
过场动画主要有ActivityOptions和兼容包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)
二、ActivityOptionsCompat.makeCustomAnimation(Context context, int enterResId, int exitResId)
public void click(View view) { ActivityOptionsCompat compat = ActivityOptionsCompat.makeCustomAnimation(this, R.anim.translate_in, R.anim.translate_none); ActivityCompat.startActivity(this, new Intent(this, Activity2.class), compat.toBundle()); }
三个参数,第一个参数是context,第二个参数是进入动画和退出动画,需要注意的是我们启动activity的方式是使用ActivityCompat.startactivity,最后一个参数使用compat.toBundle()。
来看看目标Activity
public class Activity2 extends AppCompatActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public void onBackPressed() { super.onBackPressed(); ActivityCompat.finishAfterTransition(this); } }
在退出时调用ActivityCompat.finishAfterTransition(this)进行退出动画。
三、ActivityOptionsCompat.makeScaleUpAnimation(View source,int startX, int startY, int startWidth, int startHeight)
效果为不断方法一个view从而进行Activity的过度
private void launch(View view) { ActivityOptionsCompat compat = ActivityOptionsCompat.makeScaleUpAnimation(view, view.getWidth() / 2, view.getHeight() / 2, 0, 0); ActivityCompat.startActivity(this, new Intent(this, Activity2.class), compat.toBundle()); }
第一个参数为 要操作哪个view,第二个参数和第三个参数是确定要以view的哪个点为基准开始动画,第四个参数和第五个参数是新的Activity从多大开始放大
四、ActivityOptionsCompat.makeThumbnailScaleUpAnimation(View source,Bitmap thumbnail, int startX, int startY)
该方法与上面的makeScaleUpAnimation非常类似,只不过这里是放大一张图片,最后过度到一个新的Activity。第二个参数是指哪个图片要放大,第三个和第四个参数表示要从哪开始动画。
五、单一的makeSceneTransitionAnimation
什么是scene?就是场景动画,在这里就体现在两个Activity中的某些view协同去完成过渡动画。
private void launch(View view) { ActivityOptionsCompat compat = ActivityOptionsCompat.makeSceneTransitionAnimation(this, view, getString(R.string.transition)); ActivityCompat.startActivity(this, new Intent(this, Activity2.class), compat.toBundle()); }
前两个参数不用多说,第三个参数是什么?因为要协作动画的两个view在不同的activity中,那么我们怎么指定哪两个view呢?这里android给我们提供了一个android:transitionName用来指定是哪些view来进行协作,例如:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <ImageView android:id="@+id/image" android:layout_width="100dp" android:layout_height="100dp" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:scaleType="fitXY" android:src="@drawable/show" android:transitionName="@string/image" /> </RelativeLayout>看ImageView的android:transitionName属性,我们指定为name是image的string,继续看看第二个activity的布局文件,肯定也有一个transitionName是name为image的string!
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <ImageView android:id="@+id/image" android:layout_width="match_parent" android:layout_height="200dp" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:scaleType="fitXY" android:src="@drawable/show" android:transitionName="@string/image" /> </RelativeLayout>
六、多个view进行协作
既然能指定一个view来进行协作,那么也能指定多个view进行协作。
指定一个imageview和TextView来进行协作,首先是两个Activity的布局文件,第一个Activity:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <TextView android:id="@+id/text" android:textSize="20sp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:text="LOADER!!" /> <ImageView android:id="@+id/image" android:layout_width="100dp" android:layout_height="100dp" android:layout_above="@id/text" android:layout_centerHorizontal="true" android:src="@drawable/show" android:transitionName="@string/name" /> </RelativeLayout>
很简单,我们分别给TextView和ImageView指定了transitionName,再来看看另一个activity的布局文件,肯定也是这样,分别给TextView和ImageView指定transitionName,
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <ImageView android:id="@+id/image" android:layout_width="wrap_content" android:layout_height="300dp" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:src="@drawable/show" android:scaleType="fitXY" android:transitionName="@string/name" /> <TextView android:id="@+id/text" android:textSize="20sp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/image" android:layout_centerHorizontal="true" android:text="LOADER!!" /> </RelativeLayout>
Activity中的代码:
private void launch() { Pair<View, String> imagePair = Pair.create(mImageView, getString(R.string.image)); Pair<View, String> textPair = Pair.create(mTextView, getString(R.string.name)); ActivityOptionsCompat compat = ActivityOptionsCompat .makeSceneTransitionAnimation(this, imagePair, textPair); ActivityCompat.startActivity(this, new Intent(this, Activity2.class), compat.toBundle()); }
首先,我们通过Pair.create创建两个对象,这里有两个泛型,分别指定为View和String类型,create方法接收两个参数,第一个是参与动画的View,第二个是该view
的transitionName。
七、指定动画
在res目录下的transition中新建xml文件,如果是change_bound,则代码这么写
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"> <changeBounds /> </transitionSet>
并在style.xml中配置theme
resources> <style name="AppTheme" parent="Theme.AppCompat.Light"> <item name="android:windowContentTransitions">true</item> <item name="android:windowAllowEnterTransitionOverlap">true</item> //进入时动画可以重叠 <item name="android:windowAllowReturnTransitionOverlap">true</item> //退出时动画可以重叠
//android预设的两个transition <item name="android:windowEnterTransition">@android:transition/slide_bottom</item> <item name="android:windowExitTransition">@android:transition/slide_bottom</item>
//自定义的两个transition <item name="android:windowSharedElementEnterTransition">@transition/change_bounds</item> <item name="android:windowSharedElementExitTransition">@transition/change_bounds</item> </style> </resources>
在代码中设置:
Slide slideTransition = new Slide(); slideTransition.setSlideEdge(Gravity.LEFT); //从哪出现 slideTransition.setDuration(getResources().getInteger(R.integer.anim_duration_long)); //时间 getWindow().setReenterTransition(slideTransition); //重返Activity getWindow().setExitTransition(slideTransition); //退出Activity
并且还可以添加插补器
transitionSet xmlns:android="http://schemas.android.com/apk/res/android"> <changeBounds android:interpolator="@android:interpolator/accelerate_decelerate" android:duration="500"/> </transitionSet>
相关文章推荐
- Android开发之Activity与界面的转场动画
- android 学习使用Activity转场动画及shareElement
- Activity转场动画效果
- Activity与Fragment的转场动画.
- Android5.0之Activity的转场动画
- Android5.0之Activity的转场动画
- Android 转场动画+Adapter启动Activity
- Activity 转场动画踩坑
- Android5.0之Activity的转场动画
- Android5.0之Activity的转场动画
- 安卓开发小技巧---如何去掉Activity的转场动画
- [转]Android Activity和Fragment的转场动画
- Android Activity转场动画
- 浅谈View动画及Activity的华丽转场
- 你所不知道的Activity转场动画——ActivityOptions,activity转场动画
- 实现Activity间的共享控件转场动画
- Android activity 转场动画ActivityOptions
- activity fragment 转场动画
- Android5.0之Activity的转场动画
- Activity转场动画无效 android:windowIsTranslucent