在文本化动画期间将文本保持在文本视图中心

时间:2018-03-29 05:11:13

标签: android textview

我正在尝试为TextView中的文本设置动画,以便从黑色变为绿色。颜色变化完美,文本大小在正确的大小之间动画,但文本的大小从左上角开始增加。我希望文本从中心增加。我尝试过使用.setGravity(Gravity.Center).setPivotY().setPivotX()以及其他一些解决方案,但似乎没有任何效果。也试过用。 TranslateY但似乎移动了整个TextView而不仅仅是内部的文本,并且之后重置文本位置变得混乱。

    Textview tv_CurrentWord = (TextView) findViewById(R.id.tv_currentWord);
    final float defaultTextSize = tv_CurrentWord.getTextSize();
        final float finalTextSize = defualtTextSize* 1.2f;
        final float g = 155;
        if (mValueAnimator.isRunning()){
            mValueAnimator.cancel();
            tv_CurrentWord.setTextSize(TypedValue.COMPLEX_UNIT_PX, defaultTextSize);
            tv_CurrentWord.setTextColor(Color.BLACK);
        }
        mValueAnimator.removeAllUpdateListeners();
        mValueAnimator.setDuration(200);
        mValueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator valueAnimator) {
                float animatedValue = (float) valueAnimator.getAnimatedValue();
                tv_CurrentWord.setTextSize(TypedValue.COMPLEX_UNIT_PX, (finalTextSize-defaultTextSize)*animatedValue+defaultTextSize);
                int color = Color.rgb(
                        0,
                        (int) (g*animatedValue)
                        ,0);
                tv_CurrentWord.setTextColor(color);

            }
        });
        mValueAnimator.addListener(new AnimatorListenerAdapter()
        {
            @Override
            public void onAnimationEnd(Animator animation)
            {
                mCurrentWord = "";
                tv_CurrentWord.setTextSize(TypedValue.COMPLEX_UNIT_PX, 
                defaultTextSize);
                tv_CurrentWord.setTextColor(Color.BLACK);
                tv_CurrentWord.setText(mCurrentWord);
            }
        });
        mValueAnimator.start();

和XML。 LinearLayout容器是最近尝试保持文本居中的新增功能,但我不确定是否需要它。

<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="@dimen/current_word_height"
        android:layout_below="@+id/rl_players_and_scores"
        android:id="@+id/ll_current_word_container">
        <TextView
            android:id="@+id/tv_currentWord"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="center"
            android:ellipsize="start"
            android:gravity="center"
            android:singleLine="true"
            android:textSize="40sp"
            android:textStyle="bold" />
     </LinearLayout>

1 个答案:

答案 0 :(得分:0)

我最终搞清楚了。在此处发布可能有相同问题的其他人。我使用了.setTranslationY.setY。围绕TextView的XML LinearLayout包装器非常重要,因为它允许TextView移动而不会丢弃父布局中位于其外的其他元素。 .setTranslationY用于抵消TextView中不断增加的文本大小。由于.setTextSize(px).setTranslationY(px)都取像素,因此Y平移只需要是文本大小变化的一半。 .setY()用于动画结束,或者在重新启动动画时将TextView重置为原始位置。不需要.setTranslationX因为文本在动画期间实际上保持水平居中。

    Textview tv_CurrentWord = (TextView) findViewById(R.id.tv_currentWord);
    float currentWordYPosition = tv_CurrentWord.getY();
    final float defaultTextSize = tv_CurrentWord.getTextSize();
    final float finalTextSize = defualtTextSize* 1.2f;
    final float g = 155;
    if (mValueAnimator.isRunning()){
        mValueAnimator.cancel();
        tv_CurrentWord.setTextSize(TypedValue.COMPLEX_UNIT_PX, 
          defaultTextSize);
        tv_CurrentWord.setTextColor(Color.BLACK);
        tv_CurrentWord.setY(currentWordYPosition);
    }
    mValueAnimator.removeAllUpdateListeners();
    mValueAnimator.setDuration(200);
    mValueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator valueAnimator) {
            float animatedValue = (float) valueAnimator.getAnimatedValue();
            tv_CurrentWord.setTextSize(TypedValue.COMPLEX_UNIT_PX, 
             (finalTextSize-defaultTextSize)*animatedValue+defaultTextSize);

            tv_CurrentWord.setTranslationY(-1*(finalTextSize- 
              defaultTextSize)*animatedValue/2);
            int color = Color.rgb(
                    0,
                    (int) (g*animatedValue)
                    ,0);
            tv_CurrentWord.setTextColor(color);

        }
    });
    mValueAnimator.addListener(new AnimatorListenerAdapter()
    {
        @Override
        public void onAnimationEnd(Animator animation)
        {
            mCurrentWord = "";
            tv_CurrentWord.setTextSize(TypedValue.COMPLEX_UNIT_PX, 
            defaultTextSize);
            tv_CurrentWord.setTextColor(Color.BLACK);
            tv_CurrentWord.setText(mCurrentWord);
            tv_CurrentWord.setY(currentWordYPosition);
        }
    });
    mValueAnimator.start();