视图在 View.VISIBLE 之后忽略了 alpha 值

11

我有一个按钮,透明度设置为0.5,在布局中它的可见性被隐藏了。

 <Button
     android:id="@+id/Button"
     android:layout_width="match_parent"
     android:layout_height="50dp"
     android:background="@color/black_color" 
     android:alpha="0.5"
     android:visibility="gone"/>

在某个时刻,我想把它显示出来(Button.setVisibility(View.VISIBLE);),但是当我这样做时,它不是半透明的(0.5)。看起来alpha值被设置为1。


我已经尝试了您发布的代码,在我的端上似乎运行良好,您可以发一些活动代码吗? - Dennis van Opstal
3个回答

23

这个问题通常是因为父视图中有android:animateLayoutChanges="true"。原因是设置可见性时的布局动画也会改变视图的透明度,覆盖了setAlpha所做的更改。

要解决此问题,您可以从父级中移除android:animateLayoutChanges="true"或创建一个自定义视图,在onVisibilityChanged中设置可见性,像这样:

public class AlphaView extends View {

    private static final String TAG = AlphaView.class.getSimpleName();

    public AlphaView(Context context) {
        super(context);
    }

    public AlphaView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public AlphaView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public AlphaView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

    @Override
    protected void onVisibilityChanged(@NonNull View changedView, int visibility) {
        super.onVisibilityChanged(changedView, visibility);

        if (visibility == VISIBLE) {
            setAlpha(0.5f);
        }
    }
}

3
我为自己所做的是将 android:animateLayoutChanges="true" 删除,因为它不知何故会将透明度设置为1。 - P Fuster
对我来说,“android:animateLayoutChanges =“ true””也是罪魁祸首。听起来这应该是被接受的答案。 - jmar777
1
这应该是一个被接受的答案。谢谢兄弟。救了一天。 - M Shaban Ali

1

我也遇到了这个问题。似乎这是Android本身的一个bug。我的解决方法是避免设置visibility,只调整alpha值。我的视图在XML中具有'visible'可见性,并且开始时XML alpha标记值设置为0.0。然后,当我想要它可见时,我通过编程方式调整alpha值:

        dimmerView.setAlpha(.15f);

我通过再次将alpha设置为零来使其消失。理论上,您可能需要使用bringToFront在z轴上调整各种视图的位置(对于按钮,当alpha设置为零时,您可能需要删除其侦听器),但在我的实现中似乎不必要。


0

ButtonGone 属性设置为 Visible 后,增加 Button 的 Alpha 值。

例如:

buttonObject.setAlpha(.5f);

尝试过那个,它看起来半透明了大约半秒钟,然后又变成黑色(alpha 1)。 - BVtp
有没有办法让它在代码的另一部分更新? - Sayem
那很好。问题还存在吗?你可以发布你的文本观察器以便更好地理解。 - Sayem
问题仍然存在,即使删除了文本监视器,因此与文本监视器无关。 - BVtp
另一种方法是删除您的 alpha 代码并添加带有透明度的颜色,例如黑色的 50% 是“#7f000000”。或者您需要发布您的代码以了解更多信息。 - Sayem
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接