Activity设置style透明后与SurfaceView合用引发的无形命案
近期搞视频通话,SurfaceView是不可缺少的,因为启动视频要载入一些资源,比較耗时。会有1.2s黑屏的现象,为了改善用户体验,我们须要设置Activity的Theme为透明风格(QQ 也是如此),以下是我截取的日志。QQ和我们启动视频通话界面(Activity)所花费的时间:
Displayed com.xxx.xxx/.activity.voip.CallVoipVideoActivity: +491ms:接收视频邀请
Displayed com.tencent.mobileqq/com.tencent.av.ui.AVActivity: +1s977ms :发起视频邀请(QQ载入的资源很多其它,故会略微再慢点,只是区别不大)
。。
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/mainLayout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/a" > <include layout="@layout/test1_item" /> </FrameLayout>
当中,a是默认的背景图片,test1_item.xml是包括SurfaceView的子布局,例如以下:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" > <FrameLayout
android:id="@+id/testFr"
android:layout_width="match_parent"
android:layout_height="match_parent" > <SurfaceView
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout> <RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent" > <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="挂断" />
</RelativeLayout> </FrameLayout>
測试发现。在SurfaceView有内容载入进来之前。那部分一直是透明的,无论你根布局有木有设置默认背景。
关于这个问题的解释,我们须要去了解下SurfaceView及Activity的原理:可參照:http://www.2cto.com/kf/201303/196117.html(SurfaceView理解)。
http://blog.csdn.net/qinjuning/article/details/7226787(关于Activity的原理)。
当中注意下两段话:
1、用来描写叙述SurfaceView的Layer或者LayerBuffer的Z轴位置是小于用来其宿主Activity窗体的Layer的Z轴位置的。可是前者会在后者的上面挖一个“洞”出来。以便它的UI能够对用户可见。实际上,SurfaceView在其宿主Activity窗体上所挖的“洞”仅仅只是是在其宿主Activity窗体上设置了一块透明区域。
2、DecorView类 :该类是PhoneWindow类的 q=%E5%86%85%E9%83%A8%E7%B1%BB&ie=utf-8&src=se_lighten_f" style="text-decoration:none; display:inline; position:static">内部类
该类是一个FrameLayout的子类,而且是PhoneWindow的子类,该类就是对普通的FrameLayout进行功能的扩展,更确切点能够说是修饰(Decor的英文全称是Decoration。即“修饰”的意思),比方说加入TitleBar(标题栏),以及TitleBar上的滚动栏等
。
最重要的一点是,它是全部应用窗体的根View 。
解决的方法就是动态加入SurfaceView,可是前提是要保证SurfaceView已经有我们所须要的内容;第二个解决的方法能够为SurfaceView设置一个默认的背景,背景的设置能够參照:http://bbs.csdn.net/topics/380141705,我们能够分析到:surfaceview默认是黑色的背景。所以使用SurfaceView要特别注意这个问题(你所要显示的可能会被覆盖等现象),下边这三行代码是设置surfaceView控件背景透明:
this.setZOrderOnTop(true);
//this.setEGLConfigChooser(8, 8, 8, 8, 16, 0);
this.getHolder().setFormat(PixelFormat.TRANSLUCENT);
只是中间那句是OpenGl的。视情况使用,无用可凝视掉了,也能实现了透明,可是GLSurfaceView就必须使用
注意:SurfaceView加入背景后,要掉用setZOrderOnTop(true)这种方法才干把我们的内容画上,要不然我们所绘制的内容就在背景后面了,被背景覆盖。另外,在ViewPage中用到SurfaceView时,它所取到的画布是整个程序的画布,也就是在某个Activity里调用ViewPage时,ViewPage里包括SurfaceView,当ViewPage显示此SurfaceView就切换到别的Activity。那么SurfaceView所画的图会覆盖该Activity的界面。
哥们发现我的程序上述两个方法都没办法解决,仅仅能设置默认背景了。就是你启动的时候的背景,在style文件里改动:
//黑屏问题
<style name="activityVoipVideoTransparentTheme" parent="@android:style/Theme.Black.NoTitleBar">
<item name="android:windowBackground">@drawable/voip_video_default_big</item>
<item name="android:windowContentOverlay">@null</item>
</style>
这样也能达到效果啦。只是假设要不黑屏,实质上还是要分析下究竟是哪里的问题导致主线程较耗时,有些东西能够适当延后载入
Activity设置style透明后与SurfaceView合用引发的无形命案的更多相关文章
- Activity设置背景透明之开发坑
Activity设置背景透明的常规方法 方法一.在Manifest.xml中,直接在需要设置的Activity中添加主题样式: Android:theme="@android:style/T ...
- Qt编程—去掉标题栏和设置窗口透明用法
学习Qt编程,有时候我们很想做出好看又比较炫的画面,这时就常用到qt上的一些技巧. 这里我以一个小例子来展示qt的这些技巧,此qt编程写的,如图:(去掉标题栏和设置窗口透明后) 代码实现部分: .h文 ...
- android设置Activity背景色为透明的3种方
方法一:这种方法比较简单,只有一个步骤,只需要在配置文件中把需要设置为透明的activity的样式设置为 Android:theme="@android:style/Theme.Transl ...
- Qt 隐藏标题栏后实现窗口拖动、设置窗口透明
隐藏标题栏 setWindowFlags(Qt::CustomizeWindowHint); setWindowFlags(Qt::FramelessWindowHint); 两个函数都可以去掉标题栏 ...
- 给Activity设置Dialog属性,点击区域外消失;
1.在AndroidManifest.xml中给Activity设置样式: <activity android:name=".MyActivity" ...
- Android webview背景设置为透明无效 拖动时背景闪烁黑色
Adndroid 2.X的设置 webview是一个使用方便.功能强大的控件,但由于webview的背景颜色默认是白色,在一些场合下会显得很突兀(比如背景是黑色). 此时就想到了要把webview的背 ...
- table表格在设置文字垂直居中后,在表格显示相同排列的数据(比如:testtesttesttsttesttesstestse很多的test)时此表格不能换行
table设置了垂直居中后在表格显示相同排列的数据(比如:testtesttesttsttesttesstestse很多的test)时此表格不能换行, 此时会导致table会把页面撑的很宽,导致表格后 ...
- 将Activity设置成半透明的对话框
将Activity设置成半透明的对话框 在定义Activity时指定Theme.Dialog主题就可以将Activity设置成对话框风格.通过修饰Theme.Dialog主题的android:wind ...
- textarea 里设置 style="resize:none"
禁止textarea拉伸的方法是:: 设置这个 style="resize:none" 属性 例子: < ...
随机推荐
- 某考试 T1 monopoly
可以很容易的发现,如果选了最高的房子,那么就不能再选了:否则在左边选一坨合法的,在右边选一坨合法的,拼起来还是合法的. 所以我们可以处理出,每个数的控制区间[L,R] (保证这个区间是其他数都小于它的 ...
- Spring Cloud学习总结(非原创)
文章大纲 一.课程内容总结二.课程学习地址三.学习资料下载四.参考文章 一.课程内容总结 二.课程学习地址 第一天:https://www.jianshu.com/p/a086421f4bfd第二 ...
- Jenkins+ProGet+Windows Batch搭建全自动的内部包(NuGet)打包和推送及管理平台
这一篇文章是继http://www.cnblogs.com/EasonJim/p/5954155.html的升级版,由于CCNET已经过时,所以我把打包过程的CCNET工具换成Jenkins去实现,批 ...
- Mac OS X上使用Wireshark抓包
Wireshark针对UNIX Like系统的GUI发行版界面采用的是X Window(1987年更改X版本到X11).Mac OS X在Mountain Lion之后放弃X11,取而代之的是开源的X ...
- ScutSDK 0.9版本发布
ScutSDK简介: ScutSDK是和Scut游戏服务器引擎,简化客户端开发的配套SDK,她彻底打通了Scut开源游戏服务器引擎与客户端引擎(如Cocos2d-x/Quick-x/Unity3D)项 ...
- xshell登录到CentOS7上时出现“The remote SSH server rejected X11 forwarding request.
其原因是肯能对openssh版本进行了升级. 解决方法为: yum install xorg-x11-font* xorg-x11-xauth /etc/ssh/sshd ...
- 窗体皮肤实现 - 增加Toolbar的交互性
稍微改造一下,让交互性更好点.增加提示和动态效果. 控件实现内容: 1.加入Hint提示 2.加入了简易动画效果,鼠标进入和离开会有个渐变效果. 实现方案: 1.基类选用 2.Action的关联 3. ...
- U盘启动盘恢复为普通盘
U盘启动盘恢复为普通盘 此操作必须借助软件完成. 所用软件:diskgenius 下载地址: https://pan.baidu.com/s/1geDkK7L 密码: 8888 先将u盘中文件拷贝 ...
- Async Await 使用
1.简单例子 var sleep = function (time) { return new Promise(function (resolve, reject) { setTimeout(func ...
- HDOJ Oulipo 1686【KMP】
Oulipo Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...