Android设置View的背景透明

直接在layout中设置LinearLayout透明后,会导致LinearLayout里的组件一起跟着透明,只想让背景透明,不想让LinearLayout里的组件一起透明,怎么办。

=================================================

以下为转载

1. 前言

有些需求会改变布局颜色透明度,比如根据滑动距离,改变title颜色,设置控件如View,Button等的透明度,有3种方法。

2.使用方法

(1)java代码实现:

text = (TextView) findViewById(R.id.text);
text.getBackground().setAlpha(12);
  • 1
  • 2

setAlpha()的括号中可以填0–255之间的数字。数字越大,越不透明。

注意点:在5.0以上系统时,有些机型会出现莫名其妙的颜色值不起作用,变成透明了,也就是用此方法会导致其他共用一个资源的布局(例如:@color/white)透明度也跟着改变。 
比如text用上述方法设置成透明后,项目中,其他用到text颜色值的控件,都变成透明了。 
原因:在布局中多个控件同时使用一个资源的时候,这些控件会共用一个状态,例如ColorState,如果你改变了一个控件的状态,其他的控件都会接收到相同的通知。这时我们可以使用mutate()方法使该控件状态不定,这样不定状态的控件就不会共享自己的状态了。

text.getBackground().mutate().setAlpha(12);
  • 1

(2)在xml布局中进行设置

  <TextView
        android:id="@+id/text"
        android:text="Hello World!"
        android:background="#987654"
        android:layout_width="match_parent"
        android:alpha="0.5"
        android:layout_height="100dp" />
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

android:alpha的值为0~1之间的数。数字越大,越不透明。1表示完全不透明,0表示完全透明。

(3)在xml布局中通过android:background设置

<TextView
        android:id="@+id/text"
        android:text="Hello World!"
        android:background="#80987654"
        android:layout_width="match_parent"
        android:layout_height="100dp" />
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

颜色和不透明度 (alpha) 值以十六进制表示法表示。任何一种颜色的值范围都是 0 到 255(00 到 ff)。对于 alpha,00 表示完全透明,ff 表示完全不透明。android:background的值的格式为”#AARRGGBB”。AA即透明度,R、G、B是红绿蓝三色。每一位均为0–F的十六位数。其中透明度的数值越大,越不透明。因此这里如果想设置透明度为50%的白色的话,可以如上设置。


Android 自定义 View 的开发中,设置透明背景是一个常见的需求,尤其在实现悬浮窗、半透明遮罩、卡片阴影等视觉效果时。可以通过多种方式实现透明背景,并结合引用内容中的相关方法进行优化和扩展。 ### 设置透明背景的方法 #### 1. 使用 `setBackgroundColor()` 设置透明颜色 可以通过 `setBackgroundColor()` 方法将背景设置为完全透明或半透明的颜色。透明颜色通常使用 ARGB 值表示,其中 A 表示 Alpha 通道(0 表示完全透明,255 表示完全不透明)。 ```java public class TransparentView extends View { public TransparentView(Context context) { super(context); setBackgroundColor(Color.parseColor("#00000000")); // 完全透明 } } ``` 也可以使用系统常量 `Color.TRANSPARENT`,它等价于 `#00000000`。 ```java setBackgroundColor(Color.TRANSPARENT); ``` #### 2. 在 XML 中设置背景透明 在布局文件中通过 `android:background` 属性设置透明背景,可以使用颜色值或系统常量。 ```xml <com.example.TransparentView android:layout_width="match_parent" android:layout_height="100dp" android:background="@android:color/transparent" /> ``` 或者使用 ARGB 值: ```xml android:background="#00FFFFFF" <!-- 半透明白色 --> ``` #### 3. 使用 `setAlpha()` 设置透明度 可以通过 `setAlpha(float alpha)` 方法设置整个 View透明度,其中 `alpha` 的取值范围为 0.0f(完全透明)到 1.0f(完全不透明)。 ```java view.setAlpha(0.5f); // 设置为 50% 透明度 ``` 需要注意的是,该方法会影响整个 View 的绘制,包括其子元素(如果有的话)。 #### 4. 自定义 `onDraw()` 实现透明背景绘制 在自定义 `onDraw()` 方法中,可以使用 `Paint` 对象并设置其颜色为透明,从而实现更灵活的透明背景绘制。 ```java @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); Paint paint = new Paint(); paint.setColor(Color.parseColor("#00FFFFFF")); // 半透明白色 canvas.drawRect(0, 0, getWidth(), getHeight(), paint); } ``` 该方法适用于需要结合其他图形绘制(如阴影、渐变等)的场景,如引用中提到的阴影实现思路,可以在绘制背景后叠加阴影效果[^1]。 #### 5. 自定义 `onSetAlpha()` 支持透明度控制 对于需要动态控制透明度的 View,可以通过继承并覆盖 `onSetAlpha()` 方法实现更细粒度的控制,如引用中提到的 `AlphaTextView` 示例[^3]。 ```java public class AlphaCustomView extends View { public AlphaCustomView(Context context) { super(context); } @Override public boolean onSetAlpha(int alpha) { getPaint().setAlpha(alpha); invalidate(); return true; } } ``` ### 注意事项 - 使用 `setBackgroundColor()` 和 `setAlpha()` 时需注意两者之间的叠加效果,`setAlpha()` 会影响整个 View透明度。 - 若需实现局部透明效果,建议在 `onDraw()` 中使用具有透明度的 `Paint` 进行绘制。 - 在 XML 中设置透明背景时,避免使用不支持透明通道的颜色值,否则可能导致背景透明。 ### 示例代码 ```java public class TransparentView extends View { public TransparentView(Context context) { this(context, null); } public TransparentView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public TransparentView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { setBackgroundColor(Color.parseColor("#00000000")); // 完全透明 } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); Paint paint = new Paint(); paint.setColor(Color.parseColor("#88FFFFFF")); // 半透明白色 canvas.drawRect(0, 0, getWidth(), getHeight(), paint); } } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值