2016-03-28 9 views
2

私は簡単な画家をしようとしています。 Androidに3つの独立したキャンバスがあり、それを順番に描画できるように見えるという問題があります。SurfaceViewからCanvasに描画する方法は?

私はそれからホルダーを取り、SurfaceViewでUIを作りました。

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

次にSurfaceを取った。

@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

何が悪いのでしょうか?

完全なソースがここにあります:Surface.lockCanvasがあなたに与えCanvasこと https://github.com/tseglevskiy/canvasdemo1/blob/error/app/src/main/java/ru/jollydroid/canvasdemo1/MainActivity.java

答えて

5

が永続的ではないです。 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

関連する問題