web-dev-qa-db-ja.com

Android-Recyclerview共有要素遷移アイテムの位置

この問題について私を助けていただければ幸いです。 2つのフラグメントがあります。最初のフラグメントは複数の画像を含むrecyclerviewであり、2番目のフラグメントはこの画像の詳細ビューです。ユーザーが画像をクリックすると、アプリはフラグメントトランザクションを実行し、詳細が表示されます。

フラグメント間の共有要素遷移を正常に実装しました。最初のフラグメントの小さな画像をクリックすると、画像が大きくなり、詳細ビューの最終位置に移動します。

それでは、ここに問題があります。画像の初期位置が予期されていません。画像をクリックすると、元の位置から数ピクセル移動し始め、画像が少し右下にジャンプします。

なんでこんなことが起こっているの?気に障る!

遷移xml:

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

Recyclerviewの外にあるボタンに対して同じことを行うと、完全に機能します。これはrecyclerviewのある種のバグですか?

14
Istigar

RecyclerViewアイテムは、共有ビューに一意の遷移名を設定する必要があります。 RecyclerViewのレンダリングされたレイアウト階層を想像すると、同じ遷移名を持つ多くのアイテム(ビュー)が含まれています。このように、実際の共有要素がどの遷移であるかは不明確です。たとえば、ビューのトランジション名に位置を追加できます。 transition1、transition2など。ここで、詳細フラグメントを開始するときに、遷移名をそれに渡し、この名前を詳細フラグメントの共有ビューに設定する必要があります。 onViewCreated()で。

15
Sebastian Engel

これは、リサイクラービューから正しいビューが取得されていない場合に発生する可能性があります。ルートビューではなく、(位置に基づく)正確なビューを使用するようにしてください。例:以下のスニペットでは、View v(onClick()で受け取る)を使用する必要があります。

mAdapter.setOnItemClickListener(

                new MyAdapter.OnItemClickListener() {

                    @Override
                    public void onClick(View v, int position) {

                        ImageView heroView;
                        heroView = (ImageView) v.findViewById(R.id.category_icon);
                        ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(
                                getActivity(), heroView, heroView.getTransitionName());
                        ActivityCompat.startActivity(getActivity(), intent, options.toBundle());
5

共有要素がImageViewsの場合は、ChangeImageTransformトランジションも使用する必要があります。トランジションセットに<changeImageTransform />を追加してみてください。

2
Alex Lockwood

私はこの記事共有要素の遷移-パート4:RecyclerViewに従ってこの問題を解決しました。 。

Android:transitionName共有要素の間は同じである必要があり、またビュー階層で一意になります。

RecyclerViewからFragmentについては、XMLでtransitionNameを設定すると、ギャラリー内のすべてのImageViewが同じものになります。つまり、ギャラリーに戻ったときにフレームワークは、画像をどこに移動するかわかりません。

アイテムの位置は一意であるため、ここで位置を使用してonBindViewHolderにtransitionNameを設定することをお勧めします。

1
li2

これらの問題を抱えている他の人のために、同じ画像変換が両方の共有要素に適用されていることを確認することで問題を解決しました。私の場合、fragment2に変換を適用せず、fragment1にCenter Cropを適用したため、視覚的なバグが発生しました。

0
Ebrahim Malek