Java 如何在画布上画另一条线?
我一直在开发应用程序,我需要在另一个线程中执行drawingg。现在我的代码是:Java 如何在画布上画另一条线?,java,android,Java,Android,我一直在开发应用程序,我需要在另一个线程中执行drawingg。现在我的代码是: public class PainterView extends View implements DrawingListener { //private GestureDetector detector; private Context context; private Painter painter; private Bitmap background; private
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和其他元素进行绘图?我需要对代码进行尽可能少的更改。您只能在主UI线程中绘制。您应该使用SurfaceView,因为它专门用于支持从辅助线程绘制 此类的目的之一是提供一个曲面,其中 次线程可以渲染到屏幕中。如果你打算使用 通过这种方式,您需要了解一些线程语义
另请参见此视频:这是Android版的吗?为了更快地获得更好的帮助,发布一个(它将显示导入)。如果您只是删除
pool.submit,会发生什么(新建Runnable
,以便直接在onDraw
中绘制?不,我需要在另一个线程中绘制。但是,如果我不使用submit,那么它在另一个线程中将不起作用。因此,如果我使用SurfaceView,它将在另一个线程中执行,或者我将获得哪些好处?如果使用surface view,您可以从中获取画布并在其上绘制。)从第二个线程(您的executorservice)。观看视频,这里有一些示例非常感谢您。我将尝试一下。值得注意的是,SurfaceView的设计意图是用户只能看到一个实例。对于一些可能会破坏交易的项目。几乎忘了引用我的来源: