简体   繁体   中英

Transition from TextView inside Fragment to title of Toolbar

I got a fragment inside of an Activity which contains a TextView and a Button. If I click the Button another Fragment loads and the text of the TextView in the first Fragment is now the title of the Toolbar. I want to animate this change with the Transition Framework and something like changeBounds but I don't know how to set a transition for the Toolbar. Could someone point me towards a solution?

You can create a custom transition that animates a TextView's text size as follows:

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);
}

}

Since changing the TextView's text size will cause its layout bounds to change during the course of the animation, getting the transition to work properly will take a little more effort than simply throwing a ChangeBounds transition into the same TransitionSet . What you will need to do instead is manually measure/layout the view in its end state in a SharedElementCallback .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM