3

共有された 2 つのアクティビティ間で共有要素遷移アニメーションを作成しようとしていますImageView

最初のものにはRecyclerViewアイテムクリックリスナーがあり、クリック後、トランジションで他のアクティビティを開始する必要があります。

開始されたアクティビティを閉じるとアニメーションは正常に機能しますが、開始すると機能しません。

のアイテムをタップした後RecyclerView、少し拡大し、少しフリーズしてから、空白の黒い「ウィンドウ」と別の ImageView が表示されますが、スムーズにアニメーション化されません。

これは、他のアクティビティを開くコードです。

private void openActivity(WallpapersAdapter.WallsHolder wallsHolder, int index, final HashMap<String, String> data) {

    Toast.makeText(this,data.get(WallpapersActivity.WALL),Toast.LENGTH_SHORT).show();

    final Intent intent = new Intent(wallsActivity, ViewerActivity.class);
    intent.putExtra("wallUrl", data.get(WallpapersActivity.WALL));
    intent.putExtra("wallName", data.get(WallpapersActivity.NAME));

    String indextext = Integer.toString(index);
    intent.putExtra("indexText", indextext);

    String transName = "view_" + indextext;
    ViewCompat.setTransitionName(wallsHolder.view, transName);
    ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(
            wallsActivity, wallsHolder.view, transName);

    startActivity(intent, options.toBundle());

}

編集: これは、初期ビューのレイアウトのコードです:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:foreground="?selectableItemBackground">

    <ProgressBar
        android:id="@+id/progress"
        style="?progressBarStyle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginBottom="24dp" />

    <jahirfiquitiva.project.views.SquareImageView
        android:id="@+id/wall"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="centerCrop"
        tools:ignore="ContentDescription,UnusedAttribute" />

    <LinearLayout
        android:id="@+id/titlebg"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        style="@style/AboutContent"
        android:alpha="0.3"
        android:background="#000000"
        tools:ignore="UnusedAttribute">

        <TextView
            android:id="@+id/name"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom"
            android:gravity="center"
            android:textColor="#ffffffff"
            android:textSize="@dimen/abc_text_size_medium_material"
            tools:text="Title" />

    </LinearLayout>

</FrameLayout>

前もって感謝します。

編集 2: これは、どのように見えるかを示すビデオです: https://drive.google.com/file/d/0Bw52d3_ZiSb9YWc2Z1Z4MnkwNm8/view?usp=sharing

4

1 に答える 1

1

わかりました、これを実験するためにこの短いプログラムを書きました...私はtextViewsをsharedElementsとしてアニメーション化しています...そしてそれは機能しています...これが私がしたことです:

RecyclerView アダプターの内部

@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
    ViewCompat.setTransitionName(((RecyclerViewHolder) holder).mTextView,"myTransition"+position);
    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(final View v) {
            mEventListener.clicked((RecyclerViewHolder) holder);
        }
    });
}

他のアクティビティを開始している場所からの MainActivity のクリック イベント

@Override
public void clicked(final MyAdapter.RecyclerViewHolder holder) {
    final Intent intent = new Intent(this, AnotherActivity.class);

    intent.putExtra("TRANSITION_KEY", ViewCompat.getTransitionName(holder.mTextView));

    ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(
            this, holder.mTextView, ViewCompat.getTransitionName(holder.mTextView));

    startActivity(intent, options.toBundle());
}

他のアクティビティの onCreate

@Override
protected void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_another);
    TextView textView = (TextView) findViewById(R.id.textView2);
    Intent intent = getIntent();
    ViewCompat.setTransitionName(textView, intent.getStringExtra("TRANSITION_KEY"));
}

特定の問題の解決策

前の手順に従うだけでなく、onClick 内の Toast を削除します。

transitionSet xml を res/transition/image_transition.xml に追加します。

<?xml version="1.0" encoding="utf-8"?>
<transitionSet>
  <changeImageTransform/>
  <changeBounds/>
</transitionSet>

これらを styles.xml から削除します (追加されている場合)。

<item name="android:windowAnimationStyle">@style/WindowTransitionAnimation</item>
<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>
<item name="android:windowEnterTransition">@android:transition/move</item>
<item name="android:windowExitTransition">@android:transition/move</item>
于 2015-07-03T15:01:30.027 に答える