问题描述
您好!我有,我想,以填补了的OnDraw()调用图像的水平滚动型内surfaceView。然而,什么也不绘制。我有一类,其中该图是从螺纹CanvasThread完成。
HI! I have a surfaceView inside a horizontal scrollview that I want to fill with images with a onDraw() call. However, nothing is drawn.I have a class in which the drawing is done from the thread CanvasThread.
public class PanelChart extends SurfaceView implements SurfaceHolder.Callback {
private CanvasThread canvasthread ;
public PanelChart(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
getHolder().addCallback(this);
canvasthread = new CanvasThread(getHolder(), this);
setFocusable(true);
我试图改变
`synchronized (_surfaceHolder) {
_panel.postInvalidate();
}`
要同步(_surfaceHolder){ _panel.postInvalidate(); }
tosynchronized (_surfaceHolder) { _panel.postInvalidate(); }
我也尝试添加通话setWillNotDraw(假)没有运气:
I have also tried to add the call setWillNotDraw(false) without luck:
@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
canvasthread.setRunning(true);
canvasthread.start();
setWillNotDraw(false);
这似乎是一个常见的问题,但没有我所遇到的解决方案,为我工作过。
This seems to be a common issue, but none of the solutions I have come across have worked for me.
谢谢!
推荐答案
postInvalidate不会叫的OnDraw与surfaceView。你需要解锁画布上,画的东西,然后锁定画布。这里是一个线程surfaceView的例子:
postInvalidate will not call onDraw with surfaceView. You need to unlock canvas, draw things and then lock canvas. Here is an example of a thread for surfaceView:
class CanvasThread extends Thread {
private SurfaceHolder surfaceHolder;
private PanelChart panel;
private boolean run = false;
public CanvasThread(SurfaceHolder surfaceHolder, PanelChart panel) {
this.surfaceHolder = surfaceHolder;
this.panel = panel;
}
public void setRunning(boolean run) {
this.run = run;
}
public SurfaceHolder getSurfaceHolder() {
return surfaceHolder;
}
@Override
public void run() {
Canvas c;
while (run) {
c = null;
//limit the frame rate to maximum 60 frames per second (16 miliseconds)
timeNow = System.currentTimeMillis();
timeDelta = timeNow - timePrevFrame;
if ( timeDelta < 16){
try{
Thread.sleep(16 - timeDelta);
}catch(InterruptedException e){
}
}
timePrevFrame = System.currentTimeMillis();
try {
c = surfaceHolder.lockCanvas(null);
synchronized (surfaceHolder) {
panel.onDraw(c); //draw canvas
computePhysics(); //calculate next frame
}
} finally {
if (c != null) {
surfaceHolder.unlockCanvasAndPost(c); //show canvas
}
}//try finally
} //while
}//run
}//thread
这篇关于的OnDraw()不解雇,没有什么是画在surfaceView - 机器人的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!