surfaceView类一直不执行surfaceCreated(),lockCanvas返回nul

anabiosispe 2014-10-17 05:43:01
我继承了surfaceView类,实现了一个绘图子类,也实现了SurfaceHolder.Callback接口。
用view.addView(surfaceView)的方式把surfaceView的实例加载到Activity的容器控件中,但是发现这个surfaceView子类,怎么都不执行surfaceCreated()方法。
我手动调用surfaceView.surfaceCreated()方法,然后SurfaceHolder.lockCanvas()锁定画布时,返回的还是null。
其他说明:
SurfaceView这个View的宽高我是在activity代码中new了一个surfaceView对象后,用setFixedSize(width,height)设定的,再addView加到容器中,宽高值都大于一个屏幕,容器是一个ScrollView控件。
调用SurfaceView的绘图是在button的click事件中,应该不存在没时间让SurfaceView初始化Create。
应该怎么分析这个问题?

SurfaceView子类代码

public class ReviewView extends SurfaceView implements SurfaceHolder.Callback
{
public SurfaceHolder surfaceHolder;
Context context;

public ReviewView(Context context)
{
super(context);
this.context=context;
this.surfaceHolder=this.getHolder();
this.surfaceHolder.addCallback(this);
}
...

public void surfaceCreated(SurfaceHolder holder)
{
}

public void Draw()
{
Canvas canvas=this.surfaceHolder.lockCanvas();
canvas.drawColor(Color.GREEN);
this.surfaceHolder.unlockCanvasAndPost(canvas);
}
}


2.Activity中对SurfaceView的初始化代码
int height=2000;
int width =2000;
this.reviewView=new ReviewView(this);
this.reviewView.getHolder().setFixedSize(width, height);
scrollView.addView(reviewView);

3.Activity中调用SurfaceView的绘图函数代码如下

public void test_onClick(View view)
{
try
{
reviewView.Draw();
}
catch(Exception e)
{
}
}​


4.Activity的xml布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="test_onClick"
android:text="测试"
/>
<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<HorizontalScrollView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/ReviewActivity_HScrollView"
>
</HorizontalScrollView>
</ScrollView>
</LinearLayout>
...全文
1179 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
AAMINI1 2015-07-30
  • 打赏
  • 举报
回复
我也遇到了,刚才恍然大悟,虽然离你发帖这么久了但还是说一下吧 class GameView extends SurfaceView implements SurfaceHolder.Callback { public GameView(Context context) { super(context); holder = this.getHolder(); holder.addCallback(this); } .......................... }
anabiosispe 2014-10-17
  • 打赏
  • 举报
回复
现在倒是要请教一个其他的解决方法了: 比如我需要画一个4000×4000大小的图显示出来 原本是想创建一个4000×4000大小的SurfaceView,在SurfaceView一次性画出来,通过ScrollView,HScrollView嵌套来水平垂直滚动显示出来,不过看来可能不能这么做了。 那有别的什么好办法来实现吗?
anabiosispe 2014-10-17
  • 打赏
  • 举报
回复
我自己测试了一下,发现原来是因为用SurfaceView.getHolder().setFixedSize(width,height);设定的宽高值过大了就会造成SurfaceView的问题:不调用surfaceCreated(),我手动调用surfaceCreated()后,lockCanvas()还是返回null。 我试过,width=2000,height=2000时程序是正常工作的,但是width=3993,height=2000时就不出现上述问题,SurfaceView不正常工作了。 谁能解释一下这个原因吗?
内容概要:本文针对风电功率随机波动对电网频率稳定性的不利影响,提出一种基于灰狼优化算法(GWO)与改进的自适应噪声完备集合经验模态分解(ICEEMDAN)相结合的混合储能功率平抑策略。通过GWO优化ICEEMDAN的关键参数(如噪声幅值、分解层数),以样本熵为适应度函数提升风电功率信号分解精度,有效抑制模态混叠问题;进而构建四阶段协同调控框架:参数优化—自适应分解—互信息熵初级功率分层—模糊控制动态修正中频功率分配,实现低频、中频、高频波动功率的合理分配。该策略结合储能系统中蓄电池与超级电容的特性,利用模糊控制器根据两者实时荷电状态(SOC)动态调整中频功率分配比例,避免过充过放,延长设备寿命。基于实测风电数据的仿真结果表明,该方法显著降低了并网功率波动率,提升了储能运行安全性与系统整体平抑效果。; 适合人群:具备一定电力系统、新能源并网、储能控制背景,熟悉Matlab/Simulink仿真工具,从事相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①解决风电功率波动导致的电网频率不稳定问题;②优化混合储能系统(蓄电池+超级电容)的功率分配策略;③提升风电并网电能质量与储能系统运行寿命;④为基于智能算法的新能源功率平滑控制提供可复现的技术方案。; 阅读建议:建议结合Matlab代码与Simulink仿真模型进行实践,重点关注GWO参数寻优流程、ICEEMDAN分解效果对比、互信息熵判据应用及模糊规则设计等核心模块,深入理解信号分解与储能状态协同控制的闭环机制。

80,488

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧