【问题标题】:Problems when drawing on SurfaceView在 SurfaceView 上绘图时的问题
【发布时间】:2010-12-19 03:06:45
【问题描述】:

我正在 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 使用双缓冲。我不确定如何解决这些问题。

【问题讨论】:

    标签: android surfaceview android-sdk-2.1


    【解决方案1】:

    尝试写入位图,然后每次都重新绘制位图。您可以保留最后 10 点的记录或允许撤消的内容等。

    【讨论】:

    • 你有什么例子可以说明如何做到这一点吗?
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-11
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多