Android设置按钮在设置为alpha 0之后被禁用

问题描述:

可能是另一个修辞问题。Android设置按钮在设置为alpha 0之后被禁用

在iOS中,当我们将视图的任何UIView子类(如UIButton)alpha设置为0时,默认情况下iOS会禁用该视图上的所有用户交互。

我得到了一个Android应用程序在那里我动画淡出由视图:

ObjectAnimator fadeOut = ObjectAnimator.ofFloat(buttonSelectionContainer, "alpha", 1, 0); 
fadeOut.setDuration(500); 
fadeOut.start(); 

然而,我注意到,当我点击屏幕,动画重新开始,导致我相信,在Android中,即使按钮alpha设置为0,它仍然可以点击,这是真的吗?

有一种方法来全局告诉的Android禁用对一个视图用户交互(及其所有子视图)时将其alpha被设置为0,无论是明确地通过使用

view.setAlpha(0.0f); 

或通过ObjectAnimator像上面的代码块我使用?

临时工作围绕我的问题很可能会安排此代码后500毫秒运行:

// psuedocode: after 500ms 
dispatch_doSomethingAfter(500) 
{ 
    myButton.setEnabled(false); 
} 

不是理想的解决方案,但在那里有可能是我唯一的解决办法,除非是一些明亮的Android开发更好的解决方案?

在您的ObjectAnimator上使用addListener来控制动画完成后发生的情况。

fadeOut.addListener(new Animator.AnimatorListener() { 
      @Override 
      public void onAnimationStart(Animator animation) { 

      } 

      @Override 
      public void onAnimationEnd(Animator animation) { 
       button.setEnabled(false); 
      } 

      @Override 
      public void onAnimationCancel(Animator animation) { 

      } 

      @Override 
      public void onAnimationRepeat(Animator animation) { 

      } 
}); 
+0

:(我不知道,如果这是一个理想的解决办法不是这意味着我需要。手动告诉它我想禁用哪个按钮 – Zhang

+0

是的,它比在一段时间后运行一个线程来禁用按钮更好,因为你不知道动画是否已经实际完成 – siriscac

+1

只是另一个痛点 - 如果你有一个10个按钮在一个conta中例如视图一个'LinearLayout',设置布局'setEnable(false)'不会阻止子视图(你的10个按钮中的每一个)都不可点击。人们需要手动将所有这10个按钮设置为禁用。这也意味着如果我决定将布局容器设置为启用,我还需要手动告诉所有我的子视图启用。也许在设置子视图时将'duplicateParentState'设置为true,提供一些救赎? – Zhang

您可以创建一个Animator.AnimatorListener自动禁用目标View当动画结束。

声明定制DisableViewOnEndAnimatorListener类:

public class DisableViewOnEndAnimatorListener extends AnimatorListenerAdapter { 
    @Override 
    public void onAnimationEnd(Animator animation) { 
     if (animation instanceof ObjectAnimator) { 
      final Object target = ((ObjectAnimator) animation).getTarget(); 
      if (target instanceof View) { 
       ((View) target).setEnabled(false); 
      } 
     } 
    } 
} 

然后,在你的代码:

DisableViewOnEndAnimatorListener endAnimatorListener = new DisableViewOnEndAnimatorListener(); 

ObjectAnimator button1FadeOut = ObjectAnimator.ofFloat(button1, "alpha", 1, 0); 
button1FadeOut.setDuration(500); 
button1FadeOut.addListener(endAnimatorListener); 
button1FadeOut.start(); 

ObjectAnimator button2FadeOut = ObjectAnimator.ofFloat(button2, "alpha", 1, 0); 
button2FadeOut.setDuration(500); 
button2FadeOut.addListener(endAnimatorListener); 
button2FadeOut.start();