surfaceview组件的surfaceCreated()不被调用的解决方案
原文:surfaceview组件的surfaceCreated()不被调用的解决方案
有时候我们有需要在native层做在surfaceview的上下文中做渲染,这个时候只是提供了一个单独什么都不做的surfaceview。
xml文件如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.buffer.mirror2.MirrorActivity" > <com.buffer.mirror2.MirrorSurfaceView
android:id="@+id/MirrorSurfaceView"
android:layout_width="match_parent"
android:layout_height="match_parent" /> </RelativeLayout>
surfaceview文件的如下:
public class MirrorSurfaceView extends SurfaceView
implements Runnable, SurfaceHolder.Callback { public MirrorSurfaceView(Context context, AttributeSet attrs) {
super(context, attrs);
} @Override
public void run() {
while(true){
if(getHolder().getSurface().isValid()){
//Canvas canvas = getHolder().lockCanvas();
renderFrame(this.getHolder().getSurface());
//getHolder().unlockCanvasAndPost(canvas);
}
}
} @Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub } @Override
public void surfaceCreated(SurfaceHolder holder) {
initRender(this.getWidth(), this.getHeight());
new Thread(this).start();
} @Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub } private native void initRender(int render_width, int render_height); private native void renderFrame(Surface surface);
}
出现的结果是因为java层认为surfaceview什么都没有做,于是不会做任何初始化操作,也就是surfaceCreated()不会被调用。这个时候怎么解决呢?
有两个办法可以解决:
1. 在surfaceview里面手动去添加一个子控件,以触发surfaceview做懒初始化。但是这样做有时候会因为我的所有渲染逻辑是在native,有些拖泥带水不干净。
2. 在surfaceview的构造函数里面加入这句话也可以解决:
getHolder().addCallback(this);
surfaceview组件的surfaceCreated()不被调用的解决方案的更多相关文章
- Flex自定义组件、皮肤,并调用
标签:Flex 自定义组件 自定义皮肤 主应用调用模块 本程序样例学习自flex 实战教程.但因原教程代码不全,且根据个人需求有更改. 1文件列表 自定义as类Reveal.as,该类实现组件的 ...
- Python的扩展接口[2] -> 动态链接库DLL[1] -> 组件对象模型 COM 的 Python 调用
组件对象模型 COM 的 Python 调用 关于COM的基本概念,可参考组件对象模型 COM的内容,下面主要介绍两种使用 Python 调用 COM 组件的方法. 1 使用 win32com 1.1 ...
- vue 组件内 directives指令的调用方式 <base-table v-auto-height:tableHeight="{vm:this, diffHeight:ahTable.diffHeight}"
vue 组件内 directives指令的调用方式 <base-table v-auto-height:tableHeight="{vm:this, diffHeight:ahTabl ...
- vue刷新当前路由:router-view 复用组件时不刷新的3种解决方案总结
vue-router是Vue.js官方的路由插件,它和vue.js是深度集成的,适合用于构建单页面应用.vue的单页面应用是基于路由和组件的,路由用于设定访问路径,并将路径和组件映射起来.传统的页面应 ...
- atitit.线程死锁 卡住无反应 的原因in cmd调用的解决方案 v3 q39
atitit.线程死锁 卡住无反应 的原因in cmd调用的解决方案 v3 q39 1. 问题::线程死锁 卡住无反应1 1.1. 分类:: cmd调用, net io , file io ...
- 「Vue」父子组件之间的传值及调用方法
a.父组件向子组件传值data(){},props数据区别data中的数据可读可写,是自己的数据props是个数组,中的数据是父组件传递过来的,只读不能写<login :dmsg='msg'&g ...
- C#创建COM组件供VB,PB,Delphi调用
1 COM组件概述 COM是微软公司为了计算机工业的软件生产更加符合人类的行为方式开发的一种新的软件开发技术.在COM构架下,人们可以开发出各种各样的功能专一的组件,然后将它们按照需要组合起来,构成 ...
- vue 父子组件传值以及方法调用,平行组件之间传值以及方法调用大全
vue项目经常需要组件间的传值以及方法调用,具体场景就不说了,都知道.基本上所有的传值都可以用vuex状态管理来实现,只要在组件内监听vuex就好. vue常用的传值方式以及方法有: 1. 父值传子( ...
- 创建最简单的exe形式COM组件并在MFC程序调用
来新公司学习接手新项目,拿到代码打开解决方案看到里面竟然有40几个工程,有点吃惊.具体看代码也有很多之前没见过的写法,上了几天火. 有件事就没太搞明白,按照文档的说法上层很多软件都要调用IO服务器,但 ...
随机推荐
- 【t057】任务分配
Time Limit: 1 second Memory Limit: 128 MB [问题描述] 现有n个任务,要交给A和B完成.每个任务给A或给B完成,所需的时间分别为ai和bi.问他们完成所有的任 ...
- 在VS2015中用C++创建DLL并用C++调用且同一时候实现对DLL的调试
一:用C++创建DLL 依照[在VS2015中用C++编写可被其他语言调用的动态库DLL]提示创建C++编写的DLL.或參考[在VS2015中用C++创建DLL并用C#调用且同一 ...
- [Angular Directive] 2. Add Inputs to Angular 2 Directives
The @Input decorator allows you to pass values into your @Directive so that you can change the value ...
- Linux快捷键、文件管理和查询
Linux学习(1)-常用快捷键.文件管理和查询 阅读目录 有话要说 Shell应用技巧,常用快捷键 帮助命令 man (帮助命令) info (和man差不多) whatis (查询基本信息 ...
- 详解PHP设置定时任务的实现方法
详解PHP设置定时任务的实现方法 一.总结 一句话总结: 1.ignore_user_abort(true)是什么意思? 无论客户端是否关闭浏览器,下面的代码都将得到执行 2.set_time_lim ...
- 接入Erlang控制台的几种方法
在window中调试的时候我们可以通过启动多个cmd窗口运行Erlang节点,在生产环境中我们需要Erlang服务在Centos服务器上后台运行;这就需要在启动的时候添加启动参数detached来脱离 ...
- Thermal zone monitoring in an electronic device
FIELD One embodiment of the invention relates to a closed loop thermal control process in a portable ...
- const常量用extern声明定义的问题(extern变量不能在使用类里初始化)
test.h #ifndef TEST_H_ #define TEST_H //常量声明和定义采取这种方法即可 const int a = 20; //不报错,因为const变量链接属性默认是内部链 ...
- shell脚本专题之-----------全自动编译安装mysql(免安装版)
mysql的编译安装,在博客 开源服务专题之--------mysql的编译安装 中已经说明了,但是还是比较麻烦,尤其是一大堆命令,来手动执行,稍有不慎,就会出错.生产上一般都是先在本地测试环境进行自 ...
- 理解Java字符串常量池与intern()方法
String s1 = "Hello"; String s2 = "Hello"; String s3 = "Hel" + "lo ...