Использование SharedElement Переходы активности с пользовательским представлением
Я работаю над доказательством концепции, где у меня есть несколько пользовательских представлений в TableLayout. Когда щелкнуто одно из просмотров, я хочу оживить представление, расширяющееся в новое действие. Эффект, который я хочу достичь, похож на то, что видно здесь.
Из моих исследований кажется, что это можно сделать с помощью общих элементов Переходы. Однако я не могу заставить его работать правильно, и мне интересно, не потому ли, что я использую собственный собственный вид.
В частности, происходят затухания, но масштабирование и переводческие движения не являются. Проверьте GIF ниже, чтобы увидеть, где я. В этом примере я нажимаю верхний левый круг, который я хочу преобразовать в полный круг в новом действии. Проблема также может быть видна при нажатии кнопки "Назад".
![введите описание изображения здесь]()
Я считаю, что это неверно, потому что View должен быть нарисован, но есть ли способ настроить мой просмотр далее, чтобы сделать эту работу? Все примеры, которые я нашел в этом типе перехода, состояли из ImageViews, Buttons и TextViews.
Ниже приведен соответствующий источник. Мой пользовательский вид большой и не содержит специального кода, просто переопределяет onDraw() и onMeasure().
MainActivity.java
package com.rscottcarson.circleschedulertest;
import android.app.Activity;
import android.app.ActivityOptions;
import android.content.Intent;
import android.support.v4.app.ActivityOptionsCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.widget.Toast;
public class MainActivity extends Activity {
private View view1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
view1 = findViewById(R.id.circle1);
view1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this, DetailActivity.class);
// create the transition animation - the images in the layouts
// of both activities are defined with android:transitionName="profile"
ActivityOptions options = ActivityOptions
.makeSceneTransitionAnimation(MainActivity.this, view1, "profile");
// start the new activity
startActivity(intent, options.toBundle());
}
});
}
}
DetailActivity.java
package com.rscottcarson.circleschedulertest;
import android.app.Activity;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
public class DetailActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail);
}
}
change_image_trans.xml
<?xml version="1.0" encoding="utf-8"?>
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
<changeTransform />
</transitionSet>
styles.xml
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="android:Theme.Material.Light.DarkActionBar">
<item name="android:windowActivityTransitions">true</item>
<item name="android:windowContentTransitions">true</item>
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<!-- specify shared element transitions -->
<item name="android:windowSharedElementEnterTransition">
@transition/change_image_trans</item>
<!-- specify shared element transitions -->
<item name="android:windowSharedElementExitTransition">
@transition/change_image_trans</item>
</style>
</resources>
Ответы
Ответ 1
Просто попробуйте postponeEnterTransition()
и startPostponedEnterTransition()
в DetailActivity
postponeEnterTransition()
используется для временной задержки перехода до тех пор, пока общие элементы не будут правильно измерены и выложены.
startPostponedEnterTransition()
Запланирует переход общего элемента, который должен быть запущен сразу же после того, как общий элемент был измерен и выложен в иерархии вида деятельности.
DetailActivity.java
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail);
postponeEnterTransition();
}
private void scheduleStartPostponedTransition(final View sharedElement) {
sharedElement.getViewTreeObserver().addOnPreDrawListener(
new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
sharedElement.getViewTreeObserver().removeOnPreDrawListener(this);
startPostponedEnterTransition();
return true;
}
});
}
Ответ 2
Я не думаю, что ваша проблема в том, что у вас есть пользовательское представление... Я всегда делаю эти переходы с моими пользовательскими представлениями, и они работают нормально.
Я вижу, что этот код:
ActivityOptions options = ActivityOptions
.makeSceneTransitionAnimation(MainActivity.this, view1, "profile");
// start the new activity
startActivity(intent, options.toBundle());
Делает то, что вы хотите.
Вот что вам нужно сделать:
Сначала, создайте свой xml с помощью перехода:
Первая активность
<YouCustomView
android:id="@+id/someId"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:transitionName="@string/someTransition">
Вторая активность:
<YouCustomView
android:id="@+id/someOtherId"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:transitionName="@string/someTransition">
Второй, когда вы начнете свою вторую деятельность, сделайте следующее:
ActivityOptions activityOptions = ActivityOptions.makeSceneTransitionAnimation(
this, new Pair<>(findViewById(R.id.someId), getString(R.string.someTransition))
startActivity(intent, activityOptions.toBundle());
Вы забыли добавить пар с представлением и именем перехода. Добавьте это, и ваш переход будет работать нормально. Тот факт, что ваш просмотр является настраиваемым, не изменяет анимацию.
Счастливое кодирование!