1

我有大量的共享元素,我通過ActivityOptions.makeSceneTransitionAnimation在兩個活動之間轉換。當我進入第二項活動時,我想確定ImageView的最終目標尺寸是什麼,以便我可以設置ImageView的適當寬度。我相信這樣做會讓對象(也是共享元素)的權利順利過渡。確定動畫後ImageView共享元素的最終大小

ImageView是一個fitStart scaleType具有固定的高度和wrap_content寬度。圖像將被動態加載並從第一個活動縮減到第二個,所以我不知道最終的寬度。在轉換開始之前,我想將寬度設置爲ImageViewLayoutParams以匹配轉換結束後的最終寬度。

目前,ImageViewwrap_content屬性導致其右側的元素無法知道其最終放置位置,因此它在屏幕右側返回並着陸之前在右側地點。

這是動畫的gif。第一個元素是ImageView,正確的動畫,和第二個元素是按鈕,ImageView的權利:

enter image description here

注意,當第二個活動可以追溯到第一個活動,第二個元素平滑地過渡回到屏幕的左側,因爲結束位置是已知的。

當我請ImageView特定寬度等100dp代替wrap_content(然後在過渡結束後更改回wrap_content),第二元件移動更順暢到其最後的安息的地方,但由於ImageView將是動態加載並縮放後,我不會事先知道XML中圖像的真實寬度,因此在轉換後將其更改爲wrap_content時,總是會出現第二個元素的抖動。

enter image description here

所以我想確定ImageView的目標寬度和設置程序的過渡在第二活動開始,這樣第二個元素知道如何靠左它需要去之前。我試過玩ViewTreeObserverTransitionValues,但我錯過了如何獲得ImageView過渡到的最終寬度。

有什麼我可以調用onCreate的第二個活動來確定什麼寬度的ImageView最終將在過渡後?


編輯

我試着在this answer解決方案,但它報告回的ImageView開始的寬度,而不是它的轉換到最終寬度。作爲參考,這些是我要切換的兩個活動的佈局: enter image description here

請注意,我正在移動並縮小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能否告訴我共享元素定位的最終大小,那真是太好了。

+0

這張圖片的原型來自哪裏?如果它是您的後端,並且您可以控制它,那麼我建議您將圖像的大小與圖像url一起傳遞。在這個信息中,您可以定義您的ImageView需要的寬高比,因此它將具有固定的寬度和高度。 – rom4ek

回答

1

以下是這種情況:如果您將第二次活動中的資源從@drawable/first_element更改爲@drawable/first_element_thumb,您將不會遇到該行爲。不足之處在於,每次啓動轉換時都會出現一個小故障,這是因爲在轉換開始之前,drawable會從高分辨率轉換爲低分辨率。

下面是用300ms的動畫時間:

enter image description here

這裏與5000毫秒的動畫時間:

enter image description here

如果你想轉變是沒有是毛刺,不是解決的辦法是從高分辨率drawable開始轉換,並在轉換視圖時將drawable替換爲低分辨率。你可以在他的"Animatable" talk中看到Nick Butcher的功能。您最終會編寫您的自定義轉換課程,如this one

+0

謝謝。我仍然有一個問題。編輯我的問題。 – annie

+0

如果你在github上發佈了一個簡單的項目,我會看看。 – azizbekian

+0

這裏有一個簡單的例子:https://github.com/annie-l/TransitionSample 當我創建這個項目時我意識到,爲了顯示更好的版本,我還在轉換結束後爲縮略圖圖像替換了大圖像圖片。如果我不這樣做,並將圖像設置回wrap_content,它實際上保持爲較大的圖像的全寬,即使在轉換後。所以也許我不應該把它設置回wrap_content。但問題仍然是,我正在經歷一些痛苦,重新構建最終寬度將會是什麼(包括較小圖像的右邊緣)。 – annie

相關問題