【问题标题】:Android - How to make Button text flash/blink?Android - 如何使按钮文本闪烁/闪烁?
【发布时间】:2018-01-30 14:47:42
【问题描述】:

我有一个类似于this 的问题,但我只想让按钮上的文本闪烁。我不希望按钮背景也闪烁。

这是我的 R.anim.blink.xml 文件:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <alpha android:fromAlpha="0.0"
           android:toAlpha="1.0"
           android:interpolator="@android:anim/accelerate_interpolator"
           android:duration="500"
           android:startOffset="20"
           android:repeatMode="reverse"
           android:repeatCount="infinite"/>
</set>

但是这段代码...

Animation blinkingAnimation = AnimationUtils.loadAnimation(this, R.anim.blink);
myButton.setAnimation(blinkingAnimation);

...使整个按钮闪烁。那么如何让文本闪烁(所以按钮背景一直显示)?

【问题讨论】:

    标签: android android-animation android-button android-textattributes


    【解决方案1】:

    在Activity的oncreate方法中试试这段代码

        final Animation animation = new AlphaAnimation(1, 0); // Change alpha from fully visible to invisible
        animation.setDuration(500); // duration - half a second
        animation.setInterpolator(new LinearInterpolator()); // do not alter animation rate
        animation.setRepeatCount(Animation.INFINITE); // Repeat animation infinitely
        animation.setRepeatMode(Animation.REVERSE); // Reverse animation at the end so the button will fade back in
        final Button btn = (Button) findViewById(R.id.your_btn);
        btn.startAnimation(animation);
        btn.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(final View view) {
                view.clearAnimation();
                //also your extra work here
            }
        });
    

    【讨论】:

    • 谢谢,但这会使整个按钮闪烁。我只想让文本闪烁。
    【解决方案2】:

    我建议你改用FrameLayout。

    <FrameLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:background="any color" >
    
        <TextView
            android:id="@+id/bn1"
            android:layout_width="wrap_content"
            style="@style/Widget.AppCompat.Button.Borderless"
            android:layout_height="wrap_content"
            android:text="some_txt"/>
    
    </FrameLayout>
    

    现在应用TextView的眨眼动画

    【讨论】:

    【解决方案3】:

    blink_effect.xml

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android">
        <alpha android:fromAlpha="0.0"
            android:toAlpha="1.0"
            android:interpolator="@android:anim/accelerate_interpolator"
            android:duration="600"
            android:repeatMode="reverse"
            android:repeatCount="infinite"/>
    </set>
    

    MainActivity.java

     Animation animation1 = AnimationUtils.loadAnimation(getApplicationContext(),
                            R.anim.blink_effect);
     yourWidget.startAnimation(animation1);
    

    【讨论】:

      【解决方案4】:

      简单的方法:

       @Override
       protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
      
          final Button btn = (Button) findViewById(R.id.btn);
          final ObjectAnimator colorAnim = ObjectAnimator.ofInt(btn, "textColor", Color.BLACK, Color.TRANSPARENT); //you can change colors
          colorAnim.setDuration(500); //duration of flash
          colorAnim.setEvaluator(new ArgbEvaluator());
          colorAnim.setRepeatCount(ValueAnimator.INFINITE);
          colorAnim.setRepeatMode(ValueAnimator.REVERSE);
          colorAnim.start();
      
      
          btn.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(final View view) {
                  colorAnim.end();
                  colorAnim.cancel();
              }
          });
      }
      

      按下后闪烁结束。

      编辑:

      您可以在 xml 中定义您的动画(使用 objectAnimator):

      <?xml version="1.0" encoding="utf-8"?>
      <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
          android:propertyName="textColor"
          android:duration="500"
          android:valueFrom="#000000"
          android:valueTo="@android:color/transparent"
          android:repeatMode="reverse"
          android:repeatCount="infinite"
          android:interpolator="@android:anim/accelerate_interpolator" />
      

      并在您的代码中使用它:

         @Override
          protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
      
      
          final ObjectAnimator animator = (ObjectAnimator) AnimatorInflater.loadAnimator(this, R.animator.blink);
          final Button btn = (Button) findViewById(R.id.btn);
          animator.setTarget(btn);
          animator.start();
      
          btn.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(final View view) {
                  animator.end();
                  animator.cancel();
              }
          });
      }
      

      XML 必须在“animator”文件夹中。

      【讨论】:

      • 谢谢。是否可以将我的 R.anim.blink.xml 与 ObjectAnimator 一起使用?
      • @ban-geoengineering,是的,当然。检查编辑的答案。
      • 谢谢,但您的新答案使整个按钮闪烁。我只需要让文本闪烁...
      • @ban-geoengineering 在我的情况下只有文本闪烁。您确定您的 xml 和代码与我的一致吗?您使用的是什么 api 级别?
      • 我的代码和你的一样。您也可以发布您的 R.animator.blink.xml 文件,以便我确保它是相同的吗?
      【解决方案5】:

      在 kotlin 中我们可以做到这一点。 闪烁元素 res\animator\blink.xml

      <?xml version="1.0" encoding="utf-8"?>
      <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
          android:propertyName="alpha"
          android:duration="1000"
          android:valueFrom="1.0"
          android:valueTo="0.1"
          android:repeatMode="reverse"
          android:repeatCount="infinite"
          android:interpolator="@android:anim/accelerate_interpolator" /> 
      

      在activity.kt中

        lateinit var animator : ObjectAnimator
      

      onCreate

      animator = AnimatorInflater.loadAnimator(this, R.animator.blink) as ObjectAnimator
      animator.target = targetElement
      animator.start()
      

      停止和取消

      animator.end()
      animator.cancel()
      targetElement?.alpha = 1.0f
      

      ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ↓↓↓↓↓↓↓↓

      只闪烁文字

      val valueAnimator = ValueAnimator.ofFloat(0.0f, 1.0f)
      valueAnimator.duration = 1000
      valueAnimator.repeatCount = ValueAnimator.INFINITE
      valueAnimator.repeatMode = ValueAnimator.REVERSE
          valueAnimator.addUpdateListener { it ->
          val fractionAnim = it.animatedValue as Float
          targetElement?.setTextColor(
              ColorUtils.blendARGB(Color.parseColor("#00cc00"),
              resources.getColor(R.color.transparent), fractionAnim))
          }
      valueAnimator.start()
      
      targetElement?.setOnClickListener{
          valueAnimator.cancel()
          targetElement?.setTextColor(Color.parseColor("#00cc00"))
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-02
        • 2017-03-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多