How can I scale textviews using shared element transitions?

后端 未结 5 1279
广开言路
广开言路 2020-12-07 17:58

I am able to get TextViews to transition perfectly between two activities using ActivityOptions.makeSceneTransitionAnimation. However I want to make the text sc

5条回答
  •  失恋的感觉
    2020-12-07 18:27

    I used solution from Alex Lockwood and simplified the use (it's only for TextSize of a TextView), I hope this will help:

    public class Activity2 extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            setContentView(R.layout.activity2);
    
            EnterSharedElementTextSizeHandler handler = new EnterSharedElementTextSizeHandler(this);
    
            handler.addTextViewSizeResource((TextView) findViewById(R.id.timer),
                    R.dimen.small_text_size, R.dimen.large_text_size);
        }
    }
    

    and the class EnterSharedElementTextSizeHandler:

    public class EnterSharedElementTextSizeHandler extends SharedElementCallback {
    
        private final TransitionSet mTransitionSet;
        private final Activity mActivity;
    
        public Map> textViewList = new HashMap<>();
    
    
        public EnterSharedElementTextSizeHandler(Activity activity) {
    
            mActivity = activity;
    
            Transition transitionWindow = activity.getWindow().getSharedElementEnterTransition();
    
            if (!(transitionWindow instanceof TransitionSet)) {
                mTransitionSet = new TransitionSet();
                mTransitionSet.addTransition(transitionWindow);
            } else {
                mTransitionSet = (TransitionSet) transitionWindow;
            }
    
            activity.setEnterSharedElementCallback(this);
    
        }
    
    
        public void addTextViewSizeResource(TextView tv, int sizeBegin, int sizeEnd) {
    
            Resources res = mActivity.getResources();
            addTextView(tv,
                    res.getDimensionPixelSize(sizeBegin),
                    res.getDimensionPixelSize(sizeEnd));
        }
    
        public void addTextView(TextView tv, int sizeBegin, int sizeEnd) {
    
            Transition textSize = new TextSizeTransition();
            textSize.addTarget(tv.getId());
            textSize.addTarget(tv.getText().toString());
            mTransitionSet.addTransition(textSize);
    
            textViewList.put(tv, new Pair<>(sizeBegin, sizeEnd));
        }
    
        @Override
        public void onSharedElementStart(List sharedElementNames, List sharedElements, List sharedElementSnapshots) {
    
            for (View v : sharedElements) {
    
                if (!textViewList.containsKey(v)) {
                    continue;
                }
    
                ((TextView) v).setTextSize(TypedValue.COMPLEX_UNIT_PX, textViewList.get(v).first);
            }
        }
    
        @Override
        public void onSharedElementEnd(List sharedElementNames, List sharedElements, List sharedElementSnapshots) {
            for (View v : sharedElements) {
    
                if (!textViewList.containsKey(v)) {
                    continue;
                }
    
                TextView textView = (TextView) v;
    
                // Record the TextView's old width/height.
                int oldWidth = textView.getMeasuredWidth();
                int oldHeight = textView.getMeasuredHeight();
    
                // Setup the TextView's end values.
                textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, textViewList.get(v).second);
    
                // Re-measure the TextView (since the text size has changed).
                int widthSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
                int heightSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
                textView.measure(widthSpec, heightSpec);
    
                // Record the TextView's new width/height.
                int newWidth = textView.getMeasuredWidth();
                int newHeight = textView.getMeasuredHeight();
    
                // Layout the TextView in the center of its container, accounting for its new width/height.
                int widthDiff = newWidth - oldWidth;
                int heightDiff = newHeight - oldHeight;
                textView.layout(textView.getLeft() - widthDiff / 2, textView.getTop() - heightDiff / 2,
                        textView.getRight() + widthDiff / 2, textView.getBottom() + heightDiff / 2);
            }
        }
    }
    

提交回复
热议问题