Android 在SurfaceView中绘制画布

Android 在SurfaceView中绘制画布,android,android-canvas,surfaceview,Android,Android Canvas,Surfaceview,我只想在SurfaceView上绘制,并修改了 如果我直接在循环中绘制,它会工作,但是当我调用draw方法时,它就不工作了。你知道问题出在哪里吗? 但这是我在其他教程中看到的,所以它应该可以工作。 我当然可以用draw1。但我想知道为什么onDraw不在这里工作 public class TestSurefaceView extends Activity { MySurfaceView mySurfaceView; @Override public void onCreate(Bundle sa

我只想在SurfaceView上绘制,并修改了

如果我直接在循环中绘制,它会工作,但是当我调用draw方法时,它就不工作了。你知道问题出在哪里吗? 但这是我在其他教程中看到的,所以它应该可以工作。 我当然可以用draw1。但我想知道为什么onDraw不在这里工作

public class TestSurefaceView extends Activity {
MySurfaceView mySurfaceView;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mySurfaceView = new MySurfaceView(this);
    setContentView(mySurfaceView);
}
class MySurfaceView extends SurfaceView implements Runnable{
    Thread thread = null;
    SurfaceHolder surfaceHolder;
    volatile boolean running = false;
    private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
    Random random;
    public MySurfaceView(Context context) {
        super(context);
        surfaceHolder = getHolder();
        random = new Random();
    }
    @Override
    public void run() {
        while(running){
            if(surfaceHolder.getSurface().isValid()){
                Canvas canvas = surfaceHolder.lockCanvas();
                //draw(canvas); // does not work
                draw1(canvas); // works
                surfaceHolder.unlockCanvasAndPost(canvas);
            }
        }
    }
    private void draw1(Canvas canvas){
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(3);
        int w = canvas.getWidth();int h = canvas.getHeight();
        int x = random.nextInt(w-1);
        int y = random.nextInt(h-1);
        int r = random.nextInt(255);
        int g = random.nextInt(255);
        int b = random.nextInt(255);
        paint.setColor(0xff000000 + (r << 16) + (g << 8) + b);
        canvas.drawPoint(x, y, paint);
    }
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        draw1(canvas);
    }
}
}
公共类TestSurefaceView扩展活动{
MySurfaceView MySurfaceView;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
mySurfaceView=新的mySurfaceView(此);
setContentView(mySurfaceView);
}
类MySurfaceView扩展了SurfaceView实现了Runnable{
线程=空;
浮雕浮雕;
volatile boolean running=false;
私有油漆=新油漆(油漆.防油漆别名标志);
随机;
公共MySurfaceView(上下文){
超级(上下文);
surfaceHolder=getHolder();
随机=新随机();
}
@凌驾
公开募捐{
(跑步时){
if(surfaceHolder.getSurface().isValid()){
Canvas Canvas=surfaceHolder.lockCanvas();
//绘制(画布);//不起作用
draw1(画布);//作品
surfaceHolder.unlockCanvasAndPost(画布);
}
}
}
私有void draw1(画布){
绘制.设置样式(绘制.样式.笔划);
油漆。设置行程宽度(3);
int w=canvas.getWidth();int h=canvas.getHeight();
int x=随机的nextInt(w-1);
int y=随机的nextInt(h-1);
int r=random.nextInt(255);
int g=random.nextInt(255);
int b=随机的.nextInt(255);

paint.setColor(0xff000000+(rSurfaceView有两部分,表面和视图。
onDraw()
用于在视图上绘制。表面的要点是它是视图UI层下方的一个单独的层,因此您可以在其上绘制,而不会干扰通常的视图无效/重画循环

当你没有解释什么是没有发生的时候,很难说为什么它“不起作用”。定义
onDraw()时的一个常见问题
方法是,如果视图UI获得invalidate,它将调用该方法在视图上绘制。由于视图位于曲面顶部,因此在视图上绘制的任何内容都会遮挡曲面,例如不透明背景将阻止曲面上发生的任何内容可见


我通常建议您不要将SurfaceView子类化,因为这样做没有任何价值,良好的OOP实践鼓励组合而不是继承。

您缺少了
setWillNotDraw(false);
调用某处。。。。