关于SurfaceView控件设置透明

当SurfaceView位于最顶层导致其他组件无法显示时,可以利用PopupWindow或dialog的特性,它们不会被SurfaceView覆盖。PopupWindow适合灵活布局,但需避免在onCreate()中显示,而应在onWindowFocusChanged()中控制,注意防止重复显示。

setZOrderOnTop(true);  
mHolder.setFormat(PixelFormat.TRANSPARENT);//设置背景透明  

设置SurfaceView透明,但是这样会造成SurfaceView的组件会覆盖其他的组件。

此时SurfaceView组件是在最顶层的,无法通过调整层次问题来使得其他组件进行显示。

那么我们需要设置背景透明又需要显示其他控件的时候应该怎么办呢?

解决方案:

使用PopupWindow或者dialog的功能,PopupWindow或者dialog是显示在Activity之外的,测试过他们不会被SurfaceView覆盖,这种方案适用于点击实现组件的弹出,dialog的位置比较固定(屏幕正中间),而PopupWindow可以显示在屏幕所有的地方,较为灵活。

使用PopupWindow还需要注意的地方就是,不能在onCreate()等函数中显示PopupWindow,因为此时Activity的资源还未初始化完整,会导致应用的崩溃。

网上寻找到一种解决方案,这下面这条函数中调用则不会引起问题,但是需要注意每次该Activity出现在屏幕最前面时候都会调用这个函数,因此如果只想显示一次PopupWindow的话,需要设置一个flag进行控制。
@Override
public void onWindowFocusChanged(boolean hasFocus) 



SurfaceViewAndroid中用于直接绘制硬件图形内容的视图,它并不支持直接设置背景透明度或边框圆角。当它的父布局设置透明,而SurfaceView本身不具备这样的自定义属性时,会显得不协调。 通常,如果你想要让SurfaceView显示在透明背景下并且有圆角效果,你需要通过以下步骤实现: 1. **使用FrameLayout作为父布局**:FrameLayout可以作为SurfaceView的容器,并允许你在外部设置背景颜色和圆角。你可以先给FrameLayout设置透明背景,如`android:background="@android:color/transparent"`,然后设置边框和圆角样式。 ```xml <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/transparent"> <SurfaceView ...> </FrameLayout> ``` 2. **自定义Drawable作为背景**:你可以创建一个带圆角的Drawable并设置SurfaceView的背景。例如,使用Shape Drawable或NinePatchDrawable。 ```xml <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <solid android:color="#00FFFFFF" /> <!-- 设置透明背景 --> <corners android:radius="8dp" /> <!-- 设置圆角 --> </shape> <surfaceview android:background="@drawable/your_rounded_background_drawable" ...> </SurfaceView> ``` 3. **使用CardView或RelativeLayout**:如果需要更复杂的布局控制,可以考虑使用`CardView`,它内建了阴影和圆角;或者用`RelativeLayout`配合`round`库等第三方库来实现类似的效果。 尽管如此,由于SurfaceView本身的局限性,你可能需要结合其他控件或者借助一些库才能达到理想效果。对于不能直接在SurfaceView设置的特性,可以考虑将其包裹在一个适配器或者在其之上添加一层View,以便应用所需的外观设计。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值