我有一個捕捉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的顏色時,它可以工作。然而,繪製點仍然會將表面視圖變爲黑色。
檢查這個答案:http://stackoverflow.com/questions/21311573/surfaceview-shows-black-screen-android/42304462#42304462 –