在SurfaceView上绘图时出现问题

时间:2010-12-19 03:06:46

标签: android surfaceview android-sdk-2.1

我正在尝试使用Android中的SurfaceView,我正在尝试创建一个简单的绘图类型应用程序,您可以通过触摸来“绘制”它。我有一个线程运行来处理画布上的绘图,但我遇到了一些性能问题。我在http://developer.android.com/guide/topics/graphics/index.html上读到你需要重新绘制整个表面,所以我尝试将所有触摸点存储在浮点数组mPoints中,然后每次重绘它们。问题是,当积累很多积分时,它变得非常缓慢。这是代码:

    @Override
    public void run() { 

        while(mIsRunning) {
            Canvas c = null;
            try {                   
                c = mSurface.lockCanvas(null);
                synchronized(mSurface) {
                    int size = mPoints.getSize();
                    for(int i = 0; i < size; i += 2) {
                        c.drawCircle(mPoints.get(i), mPoints.get(i + 1), 3, mPaint);                            
                    }   
                }                                   
            }
            finally {
                if (c != null)
                    mSurface.unlockCanvasAndPost(c);
            }       

        }   
    }

然而,当我更新它以便清除浮点数组并且只绘制新触摸点时会导致大量闪烁。据我所知,这是因为Android使用双缓冲。我不知道如何解决这些问题。

2 个答案:

答案 0 :(得分:1)

尝试写入位图,然后每次重绘位图。您可以记录最后10点或其他内容以允许撤消等。

答案 1 :(得分:1)

基于Adil的回答,这就是我提出的并且似乎有效。如果您尝试绘制连续的点数,那么它似乎并没有完全找到每一点,因此需要进一步优化,但它确实完成了工作:

    @Override
    public void run() {
        mDrawing = Bitmap.createBitmap(mWidth, mHeight, Bitmap.Config.ARGB_8888);       
        Canvas tempCanvas = new Canvas();
        tempCanvas.setBitmap(mDrawing);

        Canvas c = null;
        while(mIsRunning) {
            int size = mPoints.getSize();
            for(int i = 0; i < size; i += 2) {
                tempCanvas.drawCircle(mPoints.get(i), mPoints.get(i + 1), 3, mPaint);                           
            }    

            mPoints.empty();

            try {                   
                c = mSurface.lockCanvas(null);
                synchronized(mSurface) {
                    c.drawBitmap(mDrawing, 0, 0, mPaint);
                }                                   
            }
            finally {
                if (c != null)
                    mSurface.unlockCanvasAndPost(c);
            }       

        }   
    }