【问题标题】:SurfaceView turns black when drawing on itSurfaceView 在上面绘图时变黑
【发布时间】:2016-02-13 15:54:39
【问题描述】:

我有一个捕捉 touchEvents 的表面视图,然后在画布上绘制一个点。但是当我触摸时,SurfaceView 会从红色变为黑色,而不是绘制一个点。请看我的代码:

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

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

提前致谢

编辑 事实证明,我不得不将holder.unlockCanvasAndPost(canvas)改为mainHolder.unlockCanvasAndPost(canvas)。仍然没有改善,但是当我尝试在 drawPoint 中使用 canvas.drawRGB() 更改表面视图的颜色时,它可以工作。然而,绘制点仍然会将表面视图变为黑色。

【问题讨论】:

标签: java android touch drawing surfaceview


【解决方案1】:

当您覆盖onTouch() 时,您需要调用super.onTouch()。可能是问题所在。

【讨论】:

  • onTouch() 不需要 super,它只需要返回 true 或 false。然而,onTouchEvent() 确实需要 super.onTouchEvent()。
  • 我看过那篇文章,它解决了我之前遇到的一个问题,但我的方法是有效的:它可以按预期打印出任何内容。但是当我第一次触摸surfaceview时,它会变黑并保持黑色。
  • 我分享了它,因为您似乎没有按照接受的答案中的指示进行操作。你可能有你的理由。
  • 嗯,我试过这样,但触摸不会注册。这不是这里的问题。一切都很完美,除了绘图部分
【解决方案2】:

显然,当您锁定画布并在其上绘图时,整个画布将重置为其默认颜色,即黑色。当你在上面画一个点时,蓝色几乎看不到,这让我认为整个屏幕都变黑了。解决方案是在点之前重绘背景。

【讨论】:

  • 嗯,不。表面层是双重或三重缓冲的。您需要更新脏区域内的每个像素;如果您在锁定 Surface 时没有指定脏区,那么您必须重绘所有内容。屏幕“重置”为黑色,因为您翻转到了一个从未绘制过的缓冲区。
【解决方案3】:

在您的 GameClassic 构造函数中将 alpha 设置为零。像这样:

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

    setFocusable(true);

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多