您的位置:首页 > 其它

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)

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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: