转场动画overridePendingTransition,ActivityOptionsCompat
一:overridePendingTransition
1:和补间动画一样,设置动画进出的xml文件
transition_first:
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="0%" 百分比是相对自身而言的百分比,若是“0%p”则是相对于父容器的百分比
android:toXDelta="-100%"
android:duration="500"
/>
transition_first_enter:
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="0"
android:toXDelta="100%"
android:duration="500"
/>
2:overridePendingTransition用于在页面跳转之后
startActivity之后:
startActivity(Intent(this,MainActivity2::class.java))
overridePendingTransition(R.anim.transition_first,R.anim.transition_first)
finish之后:
finishAfterTransition() //表示在动画之后在跳转,若是直接用finish()则是将该页面直接删掉,那么就
不会有动画效果
overridePendingTransition(R.anim.transiton_first_enter,
R.anim.transiton_first_enter) //第一个参数表示进入屏幕的动画,第二个参数表示出屏幕的动画
二:ActivityOptionsCompat
ActivityOptionsCompat.makeCustomAnimation(this,R.anim.transition_first,
R.anim.transition_first) 和overridePendingTransition的效果作用是一样的,
第一参数传一个上下文,第二个参数是进入屏幕的动画,第三个参数是出屏幕的动画
启动:startActivity(Intent(this,MainActivity2::class.java),tran1.toBundle())
val tran2 = ActivityOptionsCompat.makeScaleUpAnimation(image,image.height/2,image.width/2,
0,0)
第一个参数:你要拉伸的图片的id
第二,三个参数:第二个参数是拉伸的x位置,第三个参数是拉伸的y位置,合起来是从哪个位置拉伸
第四,第五:则是拉伸到第二个界面的时候,从哪个位置拉伸
启动:startActivity(Intent(this,MainActivity2::class.java),tran2.toBundle())
val trans3 = ActivityOptionsCompat.makeThumbnailScaleUpAnimation(secend,BitmapFactory.decodeResource(resources,
R.drawable.a),0,0)
第一个参数是以哪个控件为参考点,
第二个参数是读取出的图片
第三第四个参数是以第一个参数为参考点的坐标点
启动:startActivity(Intent(this,MainActivity2::class.java),trans3.toBundle())
val trans4 = ActivityOptionsCompat.makeClipRevealAnimation(image,image.height/2,
image.width/2,0,0)
第一个参数:你要裁剪的图片的id
第二,三个参数:第二个参数是裁剪的x位置,第三个参数是裁剪的y位置,合起来是从哪个位置裁剪
第四,第五:则是裁剪到第二个界面的时候,从哪个位置裁剪
启动:startActivity(Intent(this,MainActivity2::class.java),trans4.toBundle())
val trans5 = ActivityOptionsCompat.makeSceneTransitionAnimation(this,image as View,
"image")
这个方法是两个activity之间协同过度动画
第一个参数:传个activity
第二个参数是传一个View,要过度的图片的id
第三个是,图片的transitionName
在用这个方法之前:
(1):将自己要过度的动画设置id值
(2):将两个页面中过渡的动画设置一样的transitionName
启动:startActivity(Intent(this,MainActivity2::class.java),trans6.toBundle())
过渡多个动画:设置id值,与transition的值的步骤与一个时一样
第一个界面的xml中
<ImageView
android:transitionName="image"
android:id="@+id/image"
android:layout_width="150dp"
android:layout_height="150dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/first"
android:background="@color/white"/>
<ImageView
android:transitionName="image2"
android:id="@+id/imageView"
android:layout_width="150dp"
android:layout_height="150dp"
app:layout_constraintBottom_toTopOf="@+id/first"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:background="@color/black" />
第二个界面的xml中:
<ImageView
android:transitionName="image"
android:id="@+id/image2"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginBottom="10dp"
android:background="@color/white"
app:layout_constraintBottom_toTopOf="@+id/secend"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:transitionName="image2"
android:id="@+id/imageView2"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginTop="10dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/secend"
android:background="@color/black" />
val imag1Pair =Pair<View,String>(image,"image")
val image2Pair = Pair<View,String>(imageView,"image2")
注意:
Pair()是在import androidx.core.util.Pair该类中的方法,可能需要手动导入该类,自动导入时会导入其他类中的pair()方法
val trans6 = ActivityOptionsCompat.makeSceneTransitionAnimation(this,imag1Pair,image2Pair)
启动:startActivity(Intent(this,MainActivity2::class.java),trans6.toBundle())