Android:在画布上画一个“鼠标光标”。onHoverListener

Android:在画布上画一个“鼠标光标”。onHoverListener,android,canvas,hover,cursor,draw,Android,Canvas,Hover,Cursor,Draw,我用安卓开发板听我的usb鼠标。我想使用鼠标悬停监听器在画布上创建一个人工鼠标光标,当我在画布上悬停鼠标时,通过绘制一个形状(比如一个圆圈)并刷新它的位置。 我的问题是,当我移动鼠标时,旧的圆圈图形仍保留在画布上,因此我得到了一条圆圈的轨迹,而不是一个移动的圆圈。我现在使用的代码显然是愚蠢的,试图用计时器延迟画布删除,导致性能非常低。有人能帮我把这部分代码写下来吗?触控事件运行良好,正在做其他事情。我只需要一部分 protected void onDraw(Canvas canvas) {

我用安卓开发板听我的usb鼠标。我想使用鼠标悬停监听器在画布上创建一个人工鼠标光标,当我在画布上悬停鼠标时,通过绘制一个形状(比如一个圆圈)并刷新它的位置。 我的问题是,当我移动鼠标时,旧的圆圈图形仍保留在画布上,因此我得到了一条圆圈的轨迹,而不是一个移动的圆圈。我现在使用的代码显然是愚蠢的,试图用计时器延迟画布删除,导致性能非常低。有人能帮我把这部分代码写下来吗?触控事件运行良好,正在做其他事情。我只需要一部分

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进行绘图。

是的,这是可行的,但是,我的父窗口上有透明视图,它是一个相机预览窗口camera2 API。当我将鼠标悬停在您建议的代码上时,预览的帧率会下降。这是软件还是硬件问题?启用硬件加速。。我想解决了这个问题