2016-08-03 16 views
2

Ich habe 2 Aktivitäten, funktioniert der Übergang von Shared Element gut. ChangeBounds ist der einzige angewendete Übergang.Warum Fade Übergang funktioniert nicht auf Shared Element

Ich möchte eine Fade-Übergang anwenden, während das gemeinsame Element bewegt, so dass die Reihenfolge ist ORDERING_TOGETHER.

public class TransitionUtils { 

    public static Transition makeSharedElementEnterTransition(final Context context, final long duration) { 
     TransitionSet set = new TransitionSet(); 
     set.setOrdering(TransitionSet.ORDERING_TOGETHER); 
     set.setDuration(duration); 

     Transition changeBounds = new ChangeBounds(); 
     changeBounds.addTarget(context.getString(R.string.transition_name_search_text)); 
     set.addTransition(changeBounds); 

     Transition fade = new Fade(Fade.OUT); 
     fade.addTarget(context.getString(R.string.transition_name_search_text)); 
     set.addTransition(fade); 

     return set; 
    } 

} 

Die startActivityActivityOptions.makeSceneTransitionAnimation ruft

Im EndActivity, der gemeinsame Eingabe Elementübergang eingestellt

public class EndActivity extends Activity{ 
    @Override 
    protected void onCreate(final Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.blabla); 
     getWindow().setSharedElementEnterTransition(TransitionUtils.makeSharedElementEnterTransition(this,2000)); 
    } 
} 

Anmerkungen: I aufgefallen, dass

  • Fade() wird oft auf getWindow() angewendet. SetEnterTransition()
  • Einstellung einer Dauer auf TransitionSet gilt für alle enthaltenen Transitionen außer Fade.

Wie wendet man einen Fade-Übergang auf ein sharedElement an? Was mache ich falsch?

Antwort

2

android.transition.Fade verwendet TransitionAlpha, die in meiner IDE nicht gelöst werden können. android.transition.Fade funktioniert für den Übergang zwischen Aktivitäten eingeben und beenden.

Also habe ich mein eigenes Fade erstellt, um Alpha zu verwenden. Die Opazität einer Android-Ansicht wird durch Alpha festgelegt. Und das gemeinsam genutzte Element verwendet View.

Sie nennen es wie folgt aus:

Transition fadeOut = new FadeTransition(1f, 0f, new LinearInterpolator()); 
fadeOut.addTarget(transitionName); 

Der vollständige Code ist hier

@TargetApi(21) 
public class FadeTransition extends Transition { 

    private static final String PROPNAME_BACKGROUND = "android:faderay:background"; 
    private static final String PROPNAME_TEXT_COLOR = "android:faderay:textColor"; 
    private static final String PROPNAME_ALPHA = "android:faderay:alpha"; 

    private float startAlpha; 
    private float endAlpha; 
    private TimeInterpolator timeInterpolator; 

    public FadeTransition(final float startAlpha, final float endAlpha, final TimeInterpolator timeInterpolator) { 
     this.startAlpha = startAlpha; 
     this.endAlpha = endAlpha; 
     this.timeInterpolator = timeInterpolator; 
    } 

    public FadeTransition(final Context context, final AttributeSet attrs) { 
     super(context, attrs); 
    } 

    private void captureValues(final TransitionValues transitionValues) { 
     transitionValues.values.put(PROPNAME_BACKGROUND, transitionValues.view.getBackground()); 
     transitionValues.values.put(PROPNAME_ALPHA, transitionValues.view.getAlpha()); 
     if (transitionValues.view instanceof TextView) { 
      transitionValues.values.put(PROPNAME_TEXT_COLOR, ((TextView) transitionValues.view).getCurrentTextColor()); 
     } 
    } 

    @Override 
    public void captureStartValues(final TransitionValues transitionValues) { 
     captureValues(transitionValues); 
    } 

    @Override 
    public void captureEndValues(final TransitionValues transitionValues) { 
     captureValues(transitionValues); 
    } 

    @SuppressLint("NewApi") 
    @Override 
    public Animator createAnimator(final ViewGroup sceneRoot, final TransitionValues startValues, 
      final TransitionValues endValues) { 

     TextView textView = (TextView) endValues.view; 

     if (startAlpha != endAlpha) { 
      textView.setAlpha(endAlpha); 
     } 

     ObjectAnimator fade = ObjectAnimator.ofFloat(textView, View.ALPHA, startAlpha, endAlpha); 
     fade.setInterpolator(timeInterpolator); 
     return fade; 
    } 
}