2017-06-01 79 views
0

我上了懸停聽我的USB鼠標(使用Android開發板)。我想使用懸停偵聽器在畫布上創建一個虛擬鼠標光標,通過繪製一個形狀(讓我們說一個圓圈)並刷新它的位置,同時將鼠標懸停在畫布上。 我的問題是,當我移動鼠標時,舊的圓形圖仍然保留在畫布上,所以我得到了一個圈,而不是一個單一的移動圓。我現在使用的代碼顯然是愚蠢的(試圖用計時器延遲畫布刪除,導致性能很低)。誰能幫我這部分代碼(在上觸摸事件是工作的罰款和其他做一些事情。我只是需要hoverlistener部分)Android:在畫布上繪製「鼠標光標」。 onHoverListener

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; 
    } 
}; 

回答

1

緩存您的鼠標光標的位置在一個成員變量。然後調用invalidate()並讓onDraw()完成繪圖。

+0

是的,但是,我的父窗口有一個透明的視圖就是一個相機預覽窗口(camera2 API)。當我將鼠標懸停在您建議的代碼上時,預覽的幀率會下降。這是軟件還是硬件問題? – David

+0

啓用硬件加速..修復了我認爲的問題 – David