2016-09-06 2 views
0

Ich habe ein Fragment innerhalb einer Aktivität, die eine TextView und einen Button enthält. Wenn ich auf den Button klicke, wird ein anderes Fragment geladen und der Text des TextView im ersten Fragment ist nun der Titel der Toolbar. Ich möchte diese Änderung mit dem Transition Framework und etwas wie changeBounds animieren, aber ich weiß nicht, wie man einen Übergang für die Toolbar einstellt. Kann mir jemand eine Lösung vorschlagen?Übergang von TextView innerhalb Fragment zu Titel der Symbolleiste

Antwort

0

Sie können einen benutzerdefinierten Übergang erstellen, die eine Textgröße Textview ist beseelt wie folgen:

public class TextSizeTransition extends Transition { 
    private static final String PROPNAME_TEXT_SIZE = "lychmanit:transition:textsize"; 
    private static final String[] TRANSITION_PROPERTIES = { PROPNAME_TEXT_SIZE }; 

private static final Property<TextView, Float> TEXT_SIZE_PROPERTY = 
     new Property<TextView, Float>(Float.class, "textSize") { 
      @Override 
      public Float get(TextView textView) { 
       return textView.getTextSize(); 
      } 

      @Override 
      public void set(TextView textView, Float textSizePixels) { 
       textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSizePixels); 
      } 
     }; 

public TextSizeTransition() { 
} 

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

@Override 
public String[] getTransitionProperties() { 
    return TRANSITION_PROPERTIES; 
} 

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

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

private void captureValues(TransitionValues transitionValues) { 
    if (transitionValues.view instanceof TextView) { 
     TextView textView = (TextView) transitionValues.view; 
     transitionValues.values.put(PROPNAME_TEXT_SIZE, textView.getTextSize()); 
    } 
} 

@Override 
public Animator createAnimator(ViewGroup sceneRoot, TransitionValues startValues, 
           TransitionValues endValues) { 
    if (startValues == null || endValues == null) { 
     return null; 
    } 

    Float startSize = (Float) startValues.values.get(PROPNAME_TEXT_SIZE); 
    Float endSize = (Float) endValues.values.get(PROPNAME_TEXT_SIZE); 
    if (startSize == null || endSize == null || 
     startSize.floatValue() == endSize.floatValue()) { 
     return null; 
    } 

    TextView view = (TextView) endValues.view; 
    view.setTextSize(TypedValue.COMPLEX_UNIT_PX, startSize); 
    return ObjectAnimator.ofFloat(view, TEXT_SIZE_PROPERTY, startSize, endSize); 
} 

}

Da die TextView's Textgröße zu ändern bewirkt, dass seine Layoutgrenzen im Verlauf der Animation ändern Um den Übergang richtig funktionieren zu lassen, braucht man etwas mehr Aufwand, als einfach einen ChangeBounds Übergang in denselben TransitionSet zu werfen. Stattdessen müssen Sie die Ansicht in ihrem Endstatus in einer SharedElementCallback manuell messen/planen.

Verwandte Themen