我有大量的共享元素,我通過ActivityOptions.makeSceneTransitionAnimation
在兩個活動之間轉換。當我進入第二項活動時,我想確定ImageView
的最終目標尺寸是什麼,以便我可以設置ImageView
的適當寬度。我相信這樣做會讓對象(也是共享元素)的權利順利過渡。確定動畫後ImageView共享元素的最終大小
該ImageView
是一個fitStart
scaleType具有固定的高度和wrap_content
寬度。圖像將被動態加載並從第一個活動縮減到第二個,所以我不知道最終的寬度。在轉換開始之前,我想將寬度設置爲ImageView
的LayoutParams
以匹配轉換結束後的最終寬度。
目前,ImageView
的wrap_content
屬性導致其右側的元素無法知道其最終放置位置,因此它在屏幕右側返回並着陸之前在右側地點。
這是動畫的gif。第一個元素是ImageView
,正確的動畫,和第二個元素是按鈕,ImageView
的權利:
注意,當第二個活動可以追溯到第一個活動,第二個元素平滑地過渡回到屏幕的左側,因爲結束位置是已知的。
當我請ImageView
特定寬度等100dp
代替wrap_content
(然後在過渡結束後更改回wrap_content
),第二元件移動更順暢到其最後的安息的地方,但由於ImageView
將是動態加載並縮放後,我不會事先知道XML中圖像的真實寬度,因此在轉換後將其更改爲wrap_content
時,總是會出現第二個元素的抖動。
所以我想確定ImageView
的目標寬度和設置程序的過渡在第二活動開始,這樣第二個元素知道如何靠左它需要去之前。我試過玩ViewTreeObserver
和TransitionValues
,但我錯過了如何獲得ImageView過渡到的最終寬度。
有什麼我可以調用onCreate
的第二個活動來確定什麼寬度的ImageView最終將在過渡後?
編輯
我試着在this answer解決方案,但它報告回的ImageView開始的寬度,而不是它的轉換到最終寬度。作爲參考,這些是我要切換的兩個活動的佈局:
請注意,我正在移動並縮小ImageView。
我調整了,因爲我沒有使用支持庫,不得不搬到imageView.getViewTreeObserver()
在onPreDraw()
呼籲避免了答案的代碼IllegalStateException
:
postponeEnterTransition();
final ImageView imageView = (ImageView) findViewById(R.id.image_view);
final ViewGroup.LayoutParams imageViewLayoutParams = imageView.getLayoutParams();
final ViewTreeObserver viewTreeObserver = imageView.getViewTreeObserver();
viewTreeObserver.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override public boolean onPreDraw() {
imageView.getViewTreeObserver().removeOnPreDrawListener(this);
// You can acquire the width here
logoLayoutParams.width = imageView.getWidth();
Log.i(TAG, "width is " + imageViewLayoutParams.width);
imageView.setLayoutParams(imageViewLayoutParams);
// `imageView` has been laid out, but not yet been drawn
startPostponedEnterTransition();
return true;
}
});
的日誌報告的998的寬度,這是活動1中的imageView的較大尺寸(其在轉換之前的開始尺寸)。所以第二元素仍然飛離屏幕。
現在我已經有了這個代碼,我可以使用較大圖像的寬高比信息來計算出較小圖像的最終寬度,因爲我知道最終高度,但這是保證與fitStart
scaleType?
如果知道Android能否告訴我共享元素定位的最終大小,那真是太好了。
這張圖片的原型來自哪裏?如果它是您的後端,並且您可以控制它,那麼我建議您將圖像的大小與圖像url一起傳遞。在這個信息中,您可以定義您的ImageView需要的寬高比,因此它將具有固定的寬度和高度。 – rom4ek