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>
...全文
768 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不正常工作了。 谁能解释一下这个原因吗?

80,349

社区成员

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

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