3

私はアプリケーションを開発してきましたが、drawinggを別のスレッドで実行する必要があります。今私のコードは次のとおりです。

public class PainterView extends View implements DrawingListener {

    //private GestureDetector detector;
    private Context context;
    private Painter painter;
    private Bitmap background;
    private Bitmap bitmap;
    private Paint bitmapPaint;
    private Path path;
    private Paint paint;

    private float x;
    private float y;

    private boolean isErasing=false;
    private boolean isTextDrawing=false;

    private ExecutorService pool;

    public PainterView(Context context, Painter painter) {

        super(context);
        this.context = context;
        this.painter = painter;
        pool=Executors.newFixedThreadPool(3);
        //detector = new GestureDetector(context, new GestureListener());
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
    }

    @Override
    protected void onDraw(final Canvas canvas) {
        if (bitmap != null) {
            pool.submit(new Runnable() {

                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    synchronized (PainterView.this) {
                        canvas.drawBitmap(background, 0, 0, bitmapPaint);
                        canvas.drawBitmap(bitmap, 0, 0, bitmapPaint);
                        canvas.drawPath(path, paint);
                    }
                }

            });

        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        //detector.onTouchEvent(event);
        x = event.getX();
        y = event.getY();
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                painter.touchStart(x, y);
                break;
            case MotionEvent.ACTION_MOVE:
                painter.touchMove(x, y);
                break;
            case MotionEvent.ACTION_UP:
                painter.touchUp();
                break;
        }
        return true;
    }

    @Override
    public void onPictureUpdate(Bitmap background, Bitmap bitmap, Paint bitmapPaint, Path path, Paint paint) {
        this.background=background;
        this.bitmap = bitmap;
        this.bitmapPaint = bitmapPaint;
        this.path = path;
        this.paint = paint;
        invalidate();
    }

    public void setPainter(Painter painter) {
        this.painter = painter;
    }
}

ExecutorServiceを使用すると、アプリケーションは別のスレッドで描画できると思いましたが、機能しません。描画すると、デバイスの画面が点滅します。では、SurfaceHolderやその他の要素を使用して描画するためにマルチスレッドを使用するにはどうすればよいですか?コードに加える変更をできるだけ少なくする必要があります。

4

1 に答える 1

1

メインUIスレッドでのみ描画できます。SurfaceViewは、セカンダリスレッドからの描画をサポートするために特別に作成されたものであるため、使用する必要があります。

このクラスの目的の1つは、セカンダリスレッドが画面にレンダリングできるサーフェスを提供することです。このように使用する場合は、いくつかのスレッドセマンティクスに注意する必要があります。

ソース

このビデオも参照してください:Androidチュートリアル1.28-SurfaceViewの概要を学ぶ

于 2012-06-29T08:36:35.157 に答える