在我的Android應用程序中,我需要實現一個涉及其中一個元素的高程(z-index)更改的場景轉換。正如您在左側開始場景中的下圖所示,藍色弧線顯示在狗的圖像下方。在右側顯示的最終轉場中,狗的圖像顯示在藍色弧線的下方。我的願望是先讓圖像的changeBounds轉換先開始,然後再稍微做一次arcButtonBounds轉換。在過渡的大約一半處,圖像的底部應該位於弧的上方。在這個中途點,我想要改變圖像的高程/ z-index,以便狗圖像顯示在藍色弧線下面。 如何將高程變化動畫化爲場景更改動畫/轉換的一部分?
我目前的主題是我的應用程序配置爲使用以下transitionSet進行此場景更改。
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"
android:transitionOrdering="together"
android:duration="2000">
<changeBounds
android:startDelay="0"
android:duration="1000"
android:resizeClip="false"
>
<targets>
<target android:targetId="@id/charlie"/>
</targets>
</changeBounds>
<transition class="com.motb.transitiontest.ElevationTransition">
android:startDelay="0"
android:duration="1000"
<targets>
<target android:targetId="@id/charlie"/>
<target android:targetId="@id/arc1"/>
</targets>
</transition>
<changeBounds
android:startDelay="300"
android:duration="1000"
>
<targets>
<target android:targetId="@id/arc1"/>
<target android:targetId="@id/helloText" />
</targets>
</changeBounds>
</transitionSet>
我試圖在使用這種定製「ElevationTransition」的高程變化如下圖所示:
public class ElevationTransition extends Transition {
public static final String TAG = "ElevationTransition" ;
public ElevationTransition(Context context, AttributeSet attributes) {
super(context, attributes);
}
private static final String PROPNAME_TRANS_Z = "com.motb:transition:transz";
@Override
public void captureStartValues(TransitionValues transitionValues) {
float translationZ = transitionValues.view.getTranslationZ() ;
transitionValues.values.put(PROPNAME_TRANS_Z + "_start" , translationZ);
}
@Override
public void captureEndValues(TransitionValues transitionValues) {
float translationZ = transitionValues.view.getTranslationZ() ;
transitionValues.values.put(PROPNAME_TRANS_Z + "_end", translationZ);
}
@Override
public Animator createAnimator(ViewGroup sceneRoot, TransitionValues startValues,
TransitionValues endValues) {
if (startValues == null || endValues == null) {
return null;
}
final View view = endValues.view;
float startElevation = (Float) startValues.values.get(PROPNAME_TRANS_Z + "_start");
float endElevation = (Float) endValues.values.get(PROPNAME_TRANS_Z + "_end");
if (startElevation != endElevation) {
view.setTranslationZ(startElevation);
return ObjectAnimator.ofFloat(view, View.TRANSLATION_Z,
startElevation, endElevation);
}
return null;
}
}
主要活動只是用下面的佈局顯示空白分配圖:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.motb.transitiontest.MainActivity"
android:id="@+id/main"
android:onClick="onClick"
android:background="@drawable/treasuremap"
>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="250dp"
android:id="@+id/fragmentContainer"
android:layout_alignParentBottom="true"
/>
</RelativeLayout>
點擊地圖用一個片段dis替換上面的FrameLayout播放時使用以下佈局底部的「名片」:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="250dp"
tools:context="com.motb.transitiontest.MainActivity"
android:id="@+id/main"
android:background="@android:color/transparent"
>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="160dp"
android:background="@drawable/arc_bg"
android:backgroundTint="#ff0000ff"
android:layout_alignParentBottom="true"
android:transitionName="rv1"
android:id="@+id/arc1"
android:translationZ="20dp"
>
<TextView
android:id="@+id/helloText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World Transition Test"
android:layout_marginStart="165dp"
android:layout_marginTop="27dp"
android:textSize="40dp"
android:gravity="left"
android:transitionName="tv1"
android:textColor="#ffffffff"
/>
</RelativeLayout>
<ImageView
android:layout_width="300px"
android:layout_height="300px"
android:layout_alignParentTop="true"
android:layout_marginTop="80dp"
android:layout_marginStart="20dp"
android:transitionName="iv1"
android:src="@drawable/charlie"
android:id="@+id/charlie"
android:translationZ="30dp"
android:stateListAnimator="@null"
/>
</RelativeLayout>
在片段的點擊,開始與狗的大圖使用下面的XML的第二個活動:
`
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.motb.transitiontest.Activity2"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.motb.transitiontest.Activity2"
android:layout_marginTop="200dp"
android:background="@drawable/arc_bg"
android:layout_alignParentBottom="true"
android:transitionName="rv1"
android:id="@+id/arc1"
android:backgroundTint="#ff0000ff"
android:translationZ="40dp"
>
<TextView
android:id="@+id/helloText"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:layout_marginLeft="50dp"
android:layout_marginRight="50dp"
android:text="Hello World Transition Test"
android:textSize="40dp"
android:textAlignment="center"
android:transitionName="tv1"
android:textColor="#ffffffff"
/>
</RelativeLayout>
<ImageView
android:id="@+id/charlie"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:src="@drawable/charlie"
android:transitionName="iv1"
android:scaleType="centerCrop"
android:translationZ="0dp"
android:stateListAnimator="@null"
/>
</RelativeLayout>`
目前,我看到的是,在轉換開始時立面會立即改變,導致狗圖像被弧遮擋。
更優雅和高效的解決方案將是寫一個你自定義的類來繪製漸進Z指數的圖像,你可以使用valueAnimator給平滑到動畫 – sumit
@sumit請提供關於爲什麼你認爲一個更詳細信息在這種情況下,valueAnimator比ObjectAnimator更好。是什麼讓它更優雅和高效? – John
你也可以發佈視圖層次嗎? – azizbekian