2016-03-28 2 views
2

Я пытаюсь сделать простой художник. Проблема в том, что он выглядит как Android, имеет три независимых холста и дает мне его для рисования последовательно.Как нарисовать холст из SurfaceView?

Я сделал интерфейс с SurfaceView, взял у него держатель.

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    sv = (SurfaceView) findViewById(R.id.sv); 
    holder = sv.getHolder(); 

    holder.addCallback(callback); 
} 

Затем снято Поверхность.

@Override 
    public void surfaceCreated(SurfaceHolder holder) { 
    surface = holder.getSurface(); 
} 

И по событиям от OnTouchListener() рисовать точки и линии.

private void paintStartDot(float x, float y) { 
    Canvas canvas = surface.lockCanvas(null); 

    canvas.drawPoint(x, y, drawPaint); 
    surface.unlockCanvasAndPost(canvas); 

    lastX = x; 
    lastY = y; 
} 

private void paintEndDot(float x, float y) { 
    Canvas canvas = surface.lockCanvas(null); 

    canvas.drawLine(lastX, lastY, x, y, drawPaint); 

    surface.unlockCanvasAndPost(canvas); 

    lastX = x; 
    lastY = y; 
} 

скринкаст:

https://youtu.be/NNDnzrtMLZI

Что не так?

Полный источник доступен здесь: https://github.com/tseglevskiy/canvasdemo1/blob/error/app/src/main/java/ru/jollydroid/canvasdemo1/MainActivity.java

ответ

5

Canvas что Surface.lockCanvas дает это не постоянны. В тот момент, когда вы вызываете unlockCanvasAndPost, содержимое поверхностного буфера выталкивается на экран. Каждый раз, когда вы звоните lockCanvas, вам нужно перерисовать изображение с нуля.

Если вы хотите поэтапно обновлять холст, вы должны сохранить «вне экрана» canvas backed by a Bitmap, который вы обновляете в ответ на действия пользователя. Затем нарисуйте растровое изображение на холсте Surface.

private void paintStartDot(float x, float y) { 
    if (mBitmap == null) return; // not ready yet 
    Canvas canvas = new Canvas(mBitmap); 
    canvas.drawPoint(x, y, drawPaint); 

    // draw the bitmap to surface 
    canvas = surface.lockCanvas(null); 
    canvas.drawBitmap(mBitmap, 0, 0, null); 
    surface.unlockCanvasAndPost(canvas); 
} 

@Override 
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 
    // good place to create the Bitmap 
    mBitmap = Bitmap.createBitmap(width, height, Bitmap.Config. ARGB_8888); 
    // also here we need to transform the old bitmap to new one 
} 

Я не уверен, действительно ли вам нужен SurfaceView. Вы можете просто расширить View и переопределить его метод View.onDraw. В этом случае позвоните по номеру view.invalidate(), чтобы указать, что его необходимо перерисовать.

Смотрите также: Android View.onDraw() always has a clean Canvas

+0

Более подробная информация о пользовательских просмотров: http://developer.android.com/training/custom-views/index.html – fadden

Смежные вопросы