在疾病中逐渐显示字母

时间:2019-02-09 14:56:34

标签: java android

有没有办法在xml中做到这一点?是否有具有此模式的实现?

示例(渐变,不是二进制):

  1. H__LO__O_L _
  2. HEL_O_WO_LD
  3. HELLO_WORLD

_ =空

我发现的唯一方法是为每个字母创建一个文本,并为每个字母添加一个动画,但这并不实际。

1 个答案:

答案 0 :(得分:2)

  

有没有办法在xml中做到这一点?有没有一个实现   这种模式?

我不确定XML的实现,但是与使用Spannable的for循环相比,您可以轻松实现所需的效果。

您可以使用SpannableString并将字母的颜色设置为与背景相同,以使其透明。

然后通过将textColor更改为最后一个为它们设置动画。

您可以使用以下功能:

private void showTextAnimated(final int[] positions){
        final SpannableString myText = new SpannableString(mTextView.getText());
        for(int i = 0; i< positions.length; i++){
            myText.setSpan(new ForegroundColorSpan(Color.TRANSPARENT),positions[i] ,positions[i]+1 , Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
        mTextView.setText(myText);

    ValueAnimator anim = ObjectAnimator.ofArgb(Color.BLACK);
    anim.setRepeatCount(positions.length);
    anim.setDuration(1000);
    anim.addListener(new Animator.AnimatorListener() {
        int counter = 0;
        @Override
        public void onAnimationStart(Animator animation) {
            //no-op
        }

        @Override
        public void onAnimationEnd(Animator animation) {
            //no-op
        }

        @Override
        public void onAnimationCancel(Animator animation) {
            //no-op
        }
        @Override
        public void onAnimationRepeat(Animator animation) {
            myText.setSpan(new ForegroundColorSpan(Color.BLACK),positions[counter] ,positions[counter]+1 , Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
            mTextView.setText(myText);
            counter++;
        }
    });
    anim.start();
}

您可以这样称呼它:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    int[] lettersToAnimate = new int[] {2,9,8,3};
    mTextView = findViewById(R.id.myTextView);
    showTextAnimated(lettersToAnimate);

}

您还可以查看HTextView,该库的衰落插件使字母随机渐入:

  

动画效果是文本效果,不是真正的textview