2016-02-13 71 views
2

我有一个捕捉touchEvents的surfaceview,然后在画布上绘制一个点。但是当我触摸时,SurfaceView会从红色变成黑色,而不是绘制一个点。请看看我的代码: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()更改surfaceview的颜色时,它可以工作。然而,绘制点仍然会将表面视图变为黑色。

+0

检查这个答案:http://stackoverflow.com/questions/21311573/surfaceview-shows-black-screen-android/42304462#42304462 –

回答

0

当您覆盖onTouch()时,您需要致电super.onTouch()。可能是问题。

+0

onTouch()不需要超级,它只需要返回true或false 。 onTouchEvent()然而,确实需要super.onTouchEvent()。 –

+0

http://stackoverflow.com/questions/28979683/android-surfaceview-not-responding-to-touch-events – speirs23

+0

我看过那篇文章,它解决了我之前遇到的问题,但我的方法正在工作:它打印如预期的那样。但是,当我第一次触摸表面视图时,它会变黑,并保持黑色。 –

0

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

+0

嗯,不。表层是双缓冲或三缓冲。您需要更新脏区域内的每个像素;如果在锁定曲面时未指定脏区域,则必须重绘所有内容。屏幕“重置”为黑色,因为您已翻转到从未绘制过的缓冲区。 – fadden