简体   繁体   English

绘图时,SurfaceView会变黑

[英]SurfaceView turns black when drawing on it

I have a surfaceview that catches touchEvents, and then draws a point on the canvas. 我有一个可以捕获touchEvents的surfaceview,然后在画布上绘制一个点。 But when I touch, the SurfaceView changes from red to black, instead of drawing a point. 但是当我触摸时,SurfaceView会从红色变为黑色,而不是绘制一个点。 Please take a look at my code: 请看一下我的代码:

GamemodeClassic.java GamemodeClassic.java

public class GamemodeClassic extends AppCompatActivity implements Runnable, View.OnTouchListener {

private SurfaceView view;

private GameClassic game;

@Override
protected void onCreate(Bundle savedInstanceState) {
    this.requestWindowFeature(Window.FEATURE_NO_TITLE);
    super.onCreate(savedInstanceState);
    this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

    setContentView(R.layout.activity_gamemode_classic);

    init();
}

public void init() {
    view = (SurfaceView) findViewById(R.id.classic_view);
    game = new GameClassic(this);
    view.getHolder().addCallback(game);
    view.setOnTouchListener(game);
}

@Override
public void run() {

}

@Override
public boolean onTouch(View v, MotionEvent event) {
    return true;
}
}

GameClassic.java GameClassic.java

public class GameClassic extends SurfaceView implements SurfaceHolder.Callback, View.OnTouchListener {

SurfaceHolder mainHolder;

public GameClassic(Context context) {
    super(context);

    setFocusable(true);
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
    mainHolder = holder;
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    initDraw(holder);
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {

}

public void initDraw(SurfaceHolder holder) {
    Canvas canvas = mainHolder.lockCanvas();
    if(canvas == null) {
        Log.v("testlog", "GameClassic.java - Canvas not available");
    }else{
        Log.v("testlog", "GameClassic.java - Canvas found, drawing");
        canvas.drawRGB(255, 0, 0);
    }

    holder.unlockCanvasAndPost(canvas);
}

public void drawPoint(float x, float y) {
    Canvas canvas = mainHolder.lockCanvas();

    if(canvas != null) {
        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        paint.setColor(Color.BLUE);

        canvas.drawPoint(x, y, paint);

        mainHolder.unlockCanvasAndPost(canvas);
    }else{
        Log.v("testlog", canvas + "");
    }
}

@Override
public boolean onTouch(View v, MotionEvent event) {
    Log.v("testlog", event.getAction() + "sfsfsf");

    if(event.getAction() == MotionEvent.ACTION_DOWN) {
        drawPoint(event.getX(), event.getY());
        Log.v("testlog", "drawing point on (" + event.getX() + ";" + event.getY() + ")");
    }
    return true;
}
}

Thanks In Advance 提前致谢

EDIT As it turns out, I had to change the line holder.unlockCanvasAndPost(canvas) into mainHolder.unlockCanvasAndPost(canvas) . 编辑事实证明,我不得不将行holder.unlockCanvasAndPost(canvas)更改为mainHolder.unlockCanvasAndPost(canvas) There was still no improvement, but when I try to change the color of the surfaceview with canvas.drawRGB() in drawPoint, it works. 仍然没有任何改进,但是当我尝试使用drawPoint中的canvas.drawRGB()更改surfaceview的颜色时,它可以正常工作。 Drawing the point however still turns the surfaceview into black. 然而,绘制点仍然会将表面视图变为黑色。

When you override onTouch() you need to have a call to super.onTouch() . 当你重写onTouch()你需要调用super.onTouch() Might be the problem. 可能是问题所在。

Apparently, when you lock the canvas and draw on it, the whole canvas gets resetted to its default color, which is black. 显然,当您锁定画布并在其上绘制时,整个画布将重置为其默认颜色,即黑色。 When you then draw a point on top, the blue was barely visible, which lead me to thinking that the whole screen was getting turned black. 当你在顶部画一个点时,蓝色几乎看不到,这让我觉得整个屏幕都变黑了。 Redrawing the background before the point was the solution. 在该点之前重新绘制背景是解决方案。

At your GameClassic constructor set alpha to zero. 在你的GameClassic构造函数中将alpha设置为零。 Like this: 像这样:

public GameClassic (Context context) {
    super (context);

    setFocusable(true);

    setAlpha(0); // this is the secret
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM