11

Pracuję nad proof-of-concept, w którym mam kilka niestandardowych widoków w TableLayout. Po kliknięciu jednego z widoków chcę animować widok rozszerzający na nową aktywność. Efekt, który chcę osiągnąć, jest podobny do tego, co jest widoczne: here.Używanie współdzielonych operacji przejścia z niestandardowym widokiem

Z moich badań wydaje się, że sposób jest to zrobić z shared element Transitions. Jednak nie mogę go uruchomić poprawnie i zastanawiam się, czy to dlatego, że używam własnego widoku niestandardowego.

W szczególności dochodzi do zaników, ale ruchy skalujące i translacyjne nie są. Sprawdź GIF poniżej, aby zobaczyć, gdzie jestem. W tym przykładzie klikam lewy górny okrąg, który chcę przekształcić w pełne koło w nowym działaniu. Problem można również zauważyć po naciśnięciu przycisku Wstecz.

enter image description here

Uważam, że jest błędna, ponieważ widok musi być sporządzony, ale czy jest jakiś sposób, aby dostosować moim zdaniem dodatkowo do tej pracy? Wszystkie przykłady, które udało mi się znaleźć w tego rodzaju przejściu, zawierały ImageViews, Buttons i TextViews.

Poniżej znajduje się odpowiednie źródło. Mój widok niestandardowy jest duży i nie zawiera żadnego specjalnego kodu, po prostu przesłania onDraw() i 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> 

Odpowiedz

3

Tylko spróbuj postponeEnterTransition() i startPostponedEnterTransition() w swojej DetailActivity

postponeEnterTransition() stosowany tymczasowo opóźnić przejście aż wspólne elementy zostały prawidłowo zmierzone i rozplanowany.

startPostponedEnterTransition() Planuje przejście elementu współdzielonego, które zostanie uruchomione natychmiast po zmierzeniu elementu dzielonego i ułożeniu w hierarchii widoku aktywności.

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

Nie sądzę, że problemem jest to, że masz własny widok ... I zawsze te przejścia z moich poglądów własnych i działają ok.

widzę, że ten kod:

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

does't robić, co chcesz.

Oto co trzeba zrobić:

First, utworzyć xml z przejściem:

pierwszą czynnością

<YouCustomView 
    android:id="@+id/someId" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:transitionName="@string/someTransition"> 

Drugi aktywny:

<YouCustomView 
     android:id="@+id/someOtherId" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:transitionName="@string/someTransition"> 

Drugi, kiedy zaczynasz swoją drugą aktywność, zrób to tak:

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

startActivity(intent, activityOptions.toBundle()); 

Zapomniałaś dodać Pair z widokiem oraz nazwę przejścia. Dodaj to i twoje przejście będzie działało dobrze. Fakt, że widok jest niestandardowym widokiem, nie zmienia animacji.

Szczęśliwe kodowanie!