2

次のような状況があります。

1) 画像のサムネイルを表示する GridView を持つアクティビティ A があります。

2)親のサイズと一致する PhotoView (リンク)のみを持つ別のアクティビティ B があります。

3) GridView の任意の項目をクリックすると、小さなサムネイルが現在の位置とサイズからアニメーション化し、PhotoView の画像のサイズに変更されます。

スクリーンショット

GridView を使用したアクティビティ A PhotoView を使用したアクティビティ B

私の実装

これは私が許可のために行ったことです。

<item name="android:windowContentTransitions">true</item>        
<item name="android:windowAllowEnterTransitionOverlap">true</item>
<item name="android:windowAllowReturnTransitionOverlap">true</item>

<!-- specify shared element transitions -->
<item name="android:windowSharedElementEnterTransition">
    @transition/change_image_transform</item>
<item name="android:windowSharedElementExitTransition">
    @transition/change_image_transform</item>

これが私の移行ファイルです。これが私の仕様によると正しいことを願っています。

<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
    <changeImageTransform/>
    <changeBounds/>
    <changeTransform/>
</transitionSet>

ここでビューを取得し、トランジション名を設定しています。

View photo = (View) list.getChildAt(position).findViewById(R.id.fileThumb);
                    photo.setTransitionName("photo" + position);
                    ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(getActivity(), Pair.create(photo, photo.getTransitionName()));

                    Intent intent = new Intent(getActivity(), GalleryActivity.class);
                    intent.putExtra(Config.GALLERY_EXTRA, position);
                    getActivity().startActivity(intent, options.toBundle());

私のアクティビティB(完全にPhotoViewのみ)では、

final PhotoView photoView = new PhotoView(container.getContext());
                    relativeLayout.addView(photoView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
photoView.setTransitionName("position"+pos);

問題

アニメーションは機能しますが、期待したほどではありません。まったく滑らかではなく、グリッチがあります。私は何を間違っていますか?ここのどこかで間違いを見つけて改善できることを願っています。

例 - QuickPic アプリ、Sony Album アプリ。

4

1 に答える 1

0

これは古い質問であり、おそらくすでに解決策を見つけていると思いますが、私が見る限り、異なる transitionNames (「位置」+ pos と「写真」+ pos) を使用しているようです。これはまったく機能していますか?

私の頭に浮かぶ2番目のことは、画像を画像ビューにロードするとリソースが消費されるため、アニメーションを開始する前に2番目のアクティビティが画像を適切にロードできるように、画像を非同期でロードし、suspendEnterTransitionを使用する必要があるということです。

ただし、私は Android アニメーションの初心者なので、それは単なる推測であり、私の 2 セントです。うまくいけば、私は完全に間違っているわけではなく、この答えが誰かを助けるでしょう:)

于 2017-03-24T17:15:00.230 に答える