11

Я работаю над доказательством концепции, где у меня есть несколько пользовательских представлений в TableLayout. Когда щелкнуто одно из просмотров, я хочу оживить представление, расширяющееся в новое действие. Эффект, который я хочу достичь, похож на то, что видно here.Использование SharedElement Переходы активности с пользовательским представлением

Из моих исследований, похоже, это можно сделать с помощью shared element Transitions. Однако я не могу заставить его работать правильно, и мне интересно, не потому ли, что я использую собственный собственный вид.

В частности, происходят затухания, но масштабирование и переводческие движения не являются. Проверьте GIF ниже, чтобы увидеть, где я. В этом примере я нажимаю верхний левый круг, который я хочу преобразовать в полный круг в новом действии. Проблема также может быть видна при нажатии кнопки «Назад».

enter image description here

Я считаю, что это неправильно, потому что представление должно быть нарисовано, но есть способ настроить мой взгляд дальше, чтобы сделать эту работу? Все примеры, которые я нашел в этом типе перехода, состояли из 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> 

ответ

3

Просто попробуйте 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; 
      } 
     }); 
} 
0

Я не думаю, что ваша проблема в том, что у вас есть собственный взгляд ... Я всегда делаю эти переходы с моими пользовательскими представлениями, и они работают нормально.

Я могу видеть, что этот код:

ActivityOptions options = ActivityOptions 
         .makeSceneTransitionAnimation(MainActivity.this, view1, "profile"); 
       // start the new activity 
       startActivity(intent, options.toBundle()); 

does't делать то, что вы хотите.

Вот что вам нужно сделать:

Первый, создать 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"> 

Secon d, когда вы начинаете свою вторую деятельность, сделать это следующим образом:

 ActivityOptions activityOptions = ActivityOptions.makeSceneTransitionAnimation(
    this, new Pair<>(findViewById(R.id.someId), getString(R.string.someTransition)) 

startActivity(intent, activityOptions.toBundle()); 

Вы забыли добавить пару с видом и именем перехода. Добавьте это, и ваш переход будет работать нормально. Тот факт, что ваш просмотр является настраиваемым, не изменяет анимацию.

Счастливое кодирование!