SurfaceView 两个疑问?

tserpent 2012-08-17 09:01:33
1. onDraw()函数SurfaceView本来是系统不调用的,但是mGameSurfaceView.setBackgroundColor(Color.WHITE)后onDraw()就会被调用了?但是这样Canvas canvas= mSurfaceHolder.lockCanvas(null);后画的就不会显示出来了?
这是什么原因呢?

2. 我有两个例子都在线程里通过
第一次画
Canvas canvas= mSurfaceHolder.lockCanvas(null);
//这里画画,位置1
mSurfaceHolder.unlockCanvasAndPost(canvas);

第二次画画
Canvas canvas= mSurfaceHolder.lockCanvas(null);
//这里画画,位置2
mSurfaceHolder.unlockCanvasAndPost(canvas);

但是奇怪的是一个例子第二次画的会把第一次画的刷掉。

第二个线程做同样的事,不同的是一个自己电脑,一个公司电脑
但是两次画的,都会显示出来。

到底默认是,那种是正确的呢?

哥,都郁闷了。
...全文
185 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
牟蘑菇 2012-11-08
  • 打赏
  • 举报
回复
楼主有没有考虑过双缓存的问题啊?
netlib 2012-11-08
  • 打赏
  • 举报
回复
不好意思,刚才测试错误,特收回刚才的话。有测试结果再来留言。
netlib 2012-11-08
  • 打赏
  • 举报
回复
我测试的结果是连续run的话,只把最后一次画的图提供的画布上,我想你应该也是这样的问题,你希望能把每次unlockCanvasAndPost提供到画布上显示出来,我也有这样的期望,不知道是使用问题还是bug
tserpent 2012-08-18
  • 打赏
  • 举报
回复
为嘛,结果是哪个不停的话,从上到下画了一排。
不是应该,永远只画一个,后画的应该擦除前面画的呀?
tserpent 2012-08-18
  • 打赏
  • 举报
回复
package draw.test;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class GameSurfaceView extends SurfaceView
implements SurfaceHolder.Callback,Runnable
{
//定义SurfaceHolder对象
SurfaceHolder mSurfaceHolder = null;
int y = 50;

public GameSurfaceView(Context context)
{
super(context);

// 实例化SurfaceHolder
mSurfaceHolder = this.getHolder();

// 添加回调
mSurfaceHolder.addCallback(this);
this.setFocusable(true);
}


// 在surface的大小发生改变时激发
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
{

}

// 在surface创建时激发
public void surfaceCreated(SurfaceHolder holder)
{
//开启绘图线程
new Thread(this).start();
}

// 在surface销毁时激发
public void surfaceDestroyed(SurfaceHolder holder)
{
}

// 绘图循环
public void run()
{
while (true)
{
try
{
Thread.sleep(200);
}
catch (Exception e)
{

}

Draw();
}
}

// 绘图方法
public void Draw()
{
//锁定画布,得到canvas
Canvas canvas= mSurfaceHolder.lockCanvas();
// 绘图
Paint mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setColor(Color.BLUE);

canvas.drawCircle((320 - 25) / 2, y, 50, mPaint);
y=y+50;
// 绘制后解锁,绘制后必须解锁才能显示
mSurfaceHolder.unlockCanvasAndPost(canvas);
}
}
a5864131452 2012-08-17
  • 打赏
  • 举报
回复
覆盖了吧.线程睡眠了没有啊
sunqimin 2012-08-17
  • 打赏
  • 举报
回复
第二个线程做同样的事,不同的是一个自己电脑,一个公司电脑
但是两次画的,都会显示出来。
、、、、
神马意思?
同一个 地方 就是 覆盖的

80,351

社区成员

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

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