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 ответ
Просто заставил это работать.
Две проблемы, которые влияют:
- Мне нужно использовать изменение кода Java вместо изменений XML (не знаю почему, наверное, что-то не так в моем Android SDK для анализа изменений XML)
- Мне нужно добавить window.requestFeature(Window.FEATURE_ACTIVITY_TRANSITIONS), чтобы это работало, эта функция НЕ упоминается на сайте разработчиков Android, но кто-то упомянул об этом в каком-то вопросе, связанном с поставками.