OnDraw() 未触发,surfaceView 中未绘制任何内容 - Android

发布于 2024-11-13 05:14:52 字数 1055 浏览 3 评论 0原文

你好!我在水平滚动视图中有一个 SurfaceView,我想通过 onDraw() 调用来填充图像。然而,什么也没有绘制。 我有一个类,其中的绘图是通过线程 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(); 这

我还尝试添加调用 setWillNotDraw(false) ,但没有运气:

 @Override
public void surfaceCreated(SurfaceHolder holder) {
        // TODO Auto-generated method stub
    canvasthread.setRunning(true);
    canvasthread.start();
   setWillNotDraw(false);

似乎是一个常见问题,但我遇到的解决方案都不适合我。

谢谢!

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);

I have tried to change the

`synchronized (_surfaceHolder) {
                      _panel.postInvalidate();
                    }`

to
synchronized (_surfaceHolder) {
_panel.postInvalidate();
}

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.

Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

岁月苍老的讽刺 2024-11-20 05:14:52

postInvalidate不会用surfaceView调用onDraw。您需要解锁画布,绘制内容,然后锁定画布。以下是 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

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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文