9

ImageViewAndroid 5.0 でのアクティビティ間の遷移に関する奇妙な問題/バグが発生しています。

Fragment Aサムネイル画像を (in) から(in )Activity Aのヘッダー画像に移行しようとしています。ほとんどの場合はうまく機能しますが、時々、わずかに混乱することがあります。Fragment BActivity B

ぐちゃぐちゃになった時の画像はこんな感じです。

なんて混乱... :-)

当然、エリア全体を埋めることになっています。両方の ImageViews が に設定されているScaleType.CENTER_CROPため、それが問題であるとは想像できません。

興味深いのは、スクロールするとすぐに問題が修正されることです (スクロール時にパディングを変更Activity Bするサブクラスにすべてが含まれています)。ScrollViewImageView

起動するためのコードActivity Bは非常に単純です。

ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(
    activity, thumbImageView, "cover"); // "cover" is the shared element name for both ImageViews
ActivityCompat.startActivity(activity, intent, options.toBundle());

ScrollView監視可能なリスナーのコードは次のとおりです。

scrollview.setOnScrollChangedListener(new OnScrollChangedListener() {
    @Override
    public void onScrollChanged(ScrollView who, int l, int t, int oldl, int oldt) {
        // Such parallax, much wow
        headerImageView.setPadding(0, (int) (t / 1.5), 0, 0);
    }
});

また、ここに私のテーマスタイルの一部があります:

<item name="android:windowContentTransitions">true</item>
<item name="android:windowAllowEnterTransitionOverlap">true</item>
<item name="android:windowAllowReturnTransitionOverlap">true</item>
<item name="android:windowSharedElementEnterTransition">@android:transition/move</item>
<item name="android:windowSharedElementExitTransition">@android:transition/move</item>

何か案は?

4

1 に答える 1

4

FragmentB のonCreateView()メソッドに次のコードを追加してみてください。

getActivity().postponeEnterTransition(); 
scrollView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { 
    public boolean onPreDraw() { 
        scrollView.getViewTreeObserver().removeOnPreDrawListener(this);
        getActivity().startPostponedEnterTransition();
        return true;
    }
});

このコードが存在する場合でも問題は発生しますか? これにより、フラグメントのレイアウトが完了したにのみトランジションが開始されるようになります。

これよりも後で呼び出す必要があるかもしれませんstartPostponedEnterTransition()...たとえば、2 番目のアクティビティで高解像度の画像を読み込んでいる場合はstartPostponedEnterTransition、画像が読み込まれた後に呼び出してみてください (つまり、onPreDrawリスナーをImageViewウィンドウの装飾ビューではなく に設定します)。 )。

于 2014-11-03T19:11:12.820 に答える