作者fish0112 (鱼)
看板AndroidDev
标题[问题] SurfaceView保留底图问题
时间Thu Jul 16 02:15:53 2015
需求大概是
User这边用一个个的指令
去画出Surfaceview上面的图&文字
当然前面的指令画出来的後面不能够消失
因为跟时间没啥关系,所以我是想不要用Thread来做
我自己测试成功的测试小程式
主要的function是:
Canvas canvas;
public void draw()
{
synchronized (myholder) {
canvas = myholder.lockCanvas(new Rect(0, 0,
sizeMetrics.widthPixels,
sizeMetrics.heightPixels));
canvas.drawCircle(x, y, 30, paint);
myholder.unlockCanvasAndPost(canvas);
myholder.lockCanvas(new Rect(0, 0, 0, 0));
myholder.unlockCanvasAndPost(canvas);
myholder.lockCanvas(new Rect(0, 0, 0, 0));
myholder.unlockCanvasAndPost(canvas);
}
}
----
下面那个lock unlock
我猜测是因为double buff的关系
加入了以後 画圆形才会正常显示
这段code跑出来的结果很正常(在模拟器上)
就是透过修改x y+Onclicklistener,让它有点分身的效果(旧的圆存在)
----
测试成功之後,
我尝试把它的逻辑套用到工作上要用的code里
那段code长这样:
Canvas canvas;
public void draw(){
synchronized (myholder) {
canvas = myholder.lockCanvas(new Rect(0, 0,
sizeMetrics.widthPixels,
sizeMetrics.heightPixels));
switch (operator) {
case 0:
canvas.scale(scale, scale);
canvas.drawText(strClass.psString,
strClass.x, strClass.y, paint);
break;
case 1:
......
}
myholder.unlockCanvasAndPost(canvas);
myholder.lockCanvas(new Rect(0, 0, 0, 0));
myholder.unlockCanvasAndPost(canvas);
myholder.lockCanvas(new Rect(0, 0, 0, 0));
myholder.unlockCanvasAndPost(canvas);
myholder.lockCanvas(new Rect(0, 0, 0, 0));
myholder.unlockCanvasAndPost(canvas);
}
}
----
...... 是其他还没处理的功能先跳过
测试之後发现, (在手机上面测试)
以前画出来的文字,在上述的code下,
只会保留3次
输入第四次指令的时候
前3行文字就消失了 QQ
如果我把下面的lock/unlock加多 会变多次没错
但是这样治标不治本
而且我也不知道会叠到多少次指令aaa
----
想请问一下
我想要用指令而不是定时去对SurfaceView作画的动作
以上这样的method问题出在哪里呢?
还是说 是实体机器跟模拟器的差异造成的?
如果是用Thread有办法做到指令修改吗?
(也不是onclick
就是别的thread送过来的一串string而已..)
希望有大神看得懂这篇问题Q___Q
恳求解答
谢谢m(__.__)m
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 1.160.12.249
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/AndroidDev/M.1436984158.A.60C.html
※ 编辑: fish0112 (1.160.12.249), 07/16/2015 02:17:16
1F:→ cha122977: 先说thread的问题...可以用Looper+Handler传值 07/16 02:50
2F:→ cha122977: lock有给dirty rect的话 其它地方不会被洗掉 07/16 02:52
3F:→ cha122977: 所以看能不能只将要画的地方给lock就好… 07/16 02:52
4F:→ cha122977: 另外Canvas在用的时候应该和double buffering无关 07/16 02:53
5F:→ cha122977: 所以第一段是蛮诡异的…我没碰过这个问题 07/16 02:54
6F:→ cha122977: 若你是改在View.onDraw()内的话 要用invalidate()重画 07/16 03:01
7F:→ fish0112: onDraw的invalidate之前试过 每次都是清空重画 07/17 00:21
8F:→ fish0112: 只将要画的地方lock..drawText好难呀.......QQ 07/17 00:22
如果我想要在draw()这个function里面
一开始对一个bitmap作读取
canvas.draw...blabla 之後
最後在把画面存进去bitmap
请问这样子有可能实现吗?
先不管效能,这样的想法我也google了一段时间
没有找到什麽真的可以用(or自己看得懂|||)的片段code
有一个对岸文章标题写得很棒
http://blog.csdn.net/u010840444/article/details/43869697
结果实作下去完全画不出东西...窘
※ 编辑: fish0112 (1.163.40.125), 07/17/2015 00:32:56
9F:→ fish0112: 对了,使用thread就没有底图青空的问题了吗? 07/17 00:36
10F:→ fish0112: 如果是,我大概又要继续寻找目标了.. 07/17 00:36
11F:→ cha122977: 可以 每次画都开新Bitmap 然後用drawBitmap画上旧的 07/17 12:35
12F:→ cha122977: 再画上你想追加的东西 07/17 12:36