我有一个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的颜色时,它起作用了。不过,画点仍会使surfaceview变黑。