Android:在canvas上画一个"Mouse Cursor"。 onHoverListener
Android: Draw A "Mouse Cursor" on a canvas. onHoverListener
我开始悬停听我的 usb 鼠标(使用 android 开发板)。我想使用悬停侦听器在 canvas 上创建一个人工鼠标光标,方法是在我将鼠标悬停在 canvas 上时绘制一个形状(比如说一个圆圈)并刷新它的位置。
我的问题是,当我移动鼠标时,旧的圆图仍然留在 canvas 上,所以我得到了一圈圆的轨迹,而不是一个移动的圆。我现在使用的代码显然是愚蠢的(试图用定时器延迟 canvas 删除,导致性能非常低)。谁能帮我编写这部分代码(触摸事件工作正常并做其他事情。我只需要 hoverlistener 部分)
protected void onDraw(Canvas canvas) {
canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint);
canvas.drawPath(drawPath, drawPaint);
}
//respond to touch interaction
@Override
public boolean onTouchEvent(MotionEvent event) {
float touchX = event.getX();
float touchY = event.getY();
//respond to down, move and up events
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
drawPath.moveTo(touchX, touchY);
break;
case MotionEvent.ACTION_MOVE:
drawPath.lineTo(touchX, touchY);
break;
case MotionEvent.ACTION_UP:
drawPath.lineTo(touchX, touchY);
drawCanvas.drawPath(drawPath, drawPaint);
new Timer().schedule(new TimerTask() {
@Override
public void run() {
// this code will be executed after 2 seconds
drawCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
}
}, 2000);
drawPath.reset();
break;
default:
return false;
}
//redraw
invalidate();
return true;
}
private OnHoverListener ohl = new OnHoverListener() {
@Override
public boolean onHover( View v, MotionEvent ev ) {
// Log.i( TAG, ev.toString() );
arrow = BitmapFactory.decodeResource(getResources(),R.drawable.cross);
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
// path.moveTo(eventX, eventY);
return true;
case MotionEvent.ACTION_HOVER_MOVE:
//Log.i(TAG,"hover move");
//drawCanvas.drawColor(Color.RED);
drawCanvas.drawBitmap(arrow,ev.getX(),ev.getY(),drawPaint);
new Timer().schedule(new TimerTask() {
@Override
public void run() {
// this code will be executed after 2 seconds
drawCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
}
}, 10);
return true;
case MotionEvent.ACTION_UP:
// nothing to do
return true;
}
return true;
}
};
在成员变量中缓存鼠标光标位置。然后调用 invalidate() 并让 onDraw() 进行绘制。
我开始悬停听我的 usb 鼠标(使用 android 开发板)。我想使用悬停侦听器在 canvas 上创建一个人工鼠标光标,方法是在我将鼠标悬停在 canvas 上时绘制一个形状(比如说一个圆圈)并刷新它的位置。 我的问题是,当我移动鼠标时,旧的圆图仍然留在 canvas 上,所以我得到了一圈圆的轨迹,而不是一个移动的圆。我现在使用的代码显然是愚蠢的(试图用定时器延迟 canvas 删除,导致性能非常低)。谁能帮我编写这部分代码(触摸事件工作正常并做其他事情。我只需要 hoverlistener 部分)
protected void onDraw(Canvas canvas) {
canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint);
canvas.drawPath(drawPath, drawPaint);
}
//respond to touch interaction
@Override
public boolean onTouchEvent(MotionEvent event) {
float touchX = event.getX();
float touchY = event.getY();
//respond to down, move and up events
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
drawPath.moveTo(touchX, touchY);
break;
case MotionEvent.ACTION_MOVE:
drawPath.lineTo(touchX, touchY);
break;
case MotionEvent.ACTION_UP:
drawPath.lineTo(touchX, touchY);
drawCanvas.drawPath(drawPath, drawPaint);
new Timer().schedule(new TimerTask() {
@Override
public void run() {
// this code will be executed after 2 seconds
drawCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
}
}, 2000);
drawPath.reset();
break;
default:
return false;
}
//redraw
invalidate();
return true;
}
private OnHoverListener ohl = new OnHoverListener() {
@Override
public boolean onHover( View v, MotionEvent ev ) {
// Log.i( TAG, ev.toString() );
arrow = BitmapFactory.decodeResource(getResources(),R.drawable.cross);
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
// path.moveTo(eventX, eventY);
return true;
case MotionEvent.ACTION_HOVER_MOVE:
//Log.i(TAG,"hover move");
//drawCanvas.drawColor(Color.RED);
drawCanvas.drawBitmap(arrow,ev.getX(),ev.getY(),drawPaint);
new Timer().schedule(new TimerTask() {
@Override
public void run() {
// this code will be executed after 2 seconds
drawCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
}
}, 10);
return true;
case MotionEvent.ACTION_UP:
// nothing to do
return true;
}
return true;
}
};
在成员变量中缓存鼠标光标位置。然后调用 invalidate() 并让 onDraw() 进行绘制。