Android Shared Element Animation не работает для меня

Я следую инструкции на https://developer.android.com/training/material/animations.html и пытаюсь реализовать анимацию с общим элементом между действиями, но у меня это не работает, я много искал, но мог не найти ответ, есть ли кто-нибудь, кто может помочь взглянуть? Спасибо вам большое!

Мои шаги:

1, создайте каталог "transition" в моем каталоге "res", а затем создайте файл list_to_details.xml там:

<?xml version="1.0" encoding="utf-8"?>
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
    <changeImageTransform/>
</transitionSet>

2, создайте каталог "values-v21" в моем "res" каталоге, а затем создайте там файл styles.xml (установив переход, определенный выше в шаге 1):

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="AppTheme" parent="android:Theme.Material">
        <!-- enable window content transitions -->
        <item name="android:windowContentTransitions">true</item>

        <!-- specify enter and exit transitions -->
        <item name="android:windowSharedElementEnterTransition">@transition/list_to_detail</item>
        <item name="android:windowSharedElementExitTransition">@transition/list_to_detail</item>
    </style>
</resources>

3, установите тему приложения на "AppTheme", которая определена в новом файле стилей

<application
        android:name="com.myapp.MyApplication"
        android:allowBackup="false"
        android:icon="@drawable/icon"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >

4. Добавьте transitionName к общему элементу в действиях A и B: A: B:

5, добавьте код для начала действия B в упражнении A:

expandedImageView.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View v) {
    ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(DetailDemoActivity.this, v, "todetail");
    Intent intent = new Intent(DetailDemoActivity.this, AnotherDetailDemoActivity.class);
    intent.putExtra("original_url", originalUrl);
    ActivityCompat.startActivity(DetailDemoActivity.this, intent, options.toBundle());
  }
});

6, попробуйте приложение, но оно не воспроизводит анимацию, возможно, причина в том, что у меня есть асинхронная задача в Деятельности B для загрузки изображения, но она все еще не работает после того, как я попробовал postponeEnterTransition, я также попробовал getSharedElementEnterTransition, но отладчик показал, что это был ноль, см. мой код:

@Override
protected void onCreate(Bundle savedInstanceState) {
  postponeEnterTransition();

  Intent intent = this.getIntent();
  originalUrl = intent.getStringExtra("original_url");

  GetBigImageAsyncTask  getBigImageTask = new GetBigImageAsyncTask();
  getBigImageTask.execute();

  super.onCreate(savedInstanceState);
  setContentView(R.layout.another_detail_demo);
  // I have also tried setTransitionName() here but it doesn't work too
}

private void scheduleStartPostponedTransition(final View sharedElement) {
  sharedElement.getViewTreeObserver().addOnPreDrawListener(
      new ViewTreeObserver.OnPreDrawListener() {
        @Override
        public boolean onPreDraw() {
          sharedElement.getViewTreeObserver().removeOnPreDrawListener(this);
          startPostponedEnterTransition();
          return true;
        }
      });
}

private class GetBigImageAsyncTask extends AsyncTask<Object, Void, Bitmap> {
  @Override
  protected Bitmap doInBackground(Object... urls) {
    InputStream input = null;
    HttpURLConnection connection = null;
    try {
      URL url = new URL(originalUrl);
      connection = (HttpURLConnection) url.openConnection();
      connection.setDoInput(true);
      connection.connect();
      input = connection.getInputStream();
      Bitmap myBitmap = BitmapFactory.decodeStream(input);
      return myBitmap;
    } catch (Exception e) {
      return null;
    } finally {
      if (connection != null) {
        connection.disconnect();
      }

      if (input != null) {
        try {
          input.close();
        } catch (Exception e) {

        }
      }
    }
  }

  @Override
  protected void onPostExecute(Bitmap result) {
    ImageView expandedImageView =
        (ImageView) findViewById(R.id.another_demo_expanded_image);
    expandedImageView.setImageDrawable(new BitmapDrawable(result));
    scheduleStartPostponedTransition(expandedImageView);

    final Transition transition = AnotherDetailDemoActivity.this.getWindow().getSharedElementEnterTransition();

    // In fact here the object transition is null 
    if (transition != null) {
      // There is an entering shared element transition so add a listener to it
      transition.addListener(new Transition.TransitionListener() {
        @Override
        public void onTransitionEnd(Transition transition) {
          transition.removeListener(this);
        }

        @Override
        public void onTransitionStart(Transition transition) {
        }

        @Override
        public void onTransitionCancel(Transition transition) {
          // Make sure we remove ourselves as a listener
          transition.removeListener(this);
        }

        @Override
        public void onTransitionPause(Transition transition) {
          // No-op
        }

        @Override
        public void onTransitionResume(Transition transition) {
          // No-op
        }
      });
    }
  }
}

Что-то не так или пропущено в моих шагах? Любая помощь высоко ценится!

1 ответ

Просто заставил это работать.

Две проблемы, которые влияют:

  1. Мне нужно использовать изменение кода Java вместо изменений XML (не знаю почему, наверное, что-то не так в моем Android SDK для анализа изменений XML)
  2. Мне нужно добавить window.requestFeature(Window.FEATURE_ACTIVITY_TRANSITIONS), чтобы это работало, эта функция НЕ упоминается на сайте разработчиков Android, но кто-то упомянул об этом в каком-то вопросе, связанном с поставками.