2017-06-16 75 views
1

我使用非常標準的拖放實現來拖動一個圖釘並將其放置在圖像視圖的頂部以指向圖像的特定部分:在捏和縮放時保持在imageview上的拖放視圖位置

@Override 
    public boolean onDrag(View v, DragEvent event) { 
     int action = event.getAction(); 
     switch (event.getAction()) { 
      case DragEvent.ACTION_DRAG_STARTED: 
       break; 
      case DragEvent.ACTION_DRAG_ENTERED: 
       break; 
      case DragEvent.ACTION_DRAG_EXITED: 
       break; 
      case DragEvent.ACTION_DROP: 
       View view = (View) event.getLocalState(); 
       ViewGroup owner = (ViewGroup) view.getParent(); 
       owner.removeView(view); 
       FrameLayout container = (FrameLayout) v; 
       container.addView(view); 
       FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT); 

       int a = Math.round((event.getX() - (view.getWidth()/2))); 
       int b = Math.round((event.getY() - (view.getHeight()/2))); 

       lp.setMargins(a,b,0,0); 
       view.setLayoutParams(lp); 
       view.setVisibility(View.VISIBLE); 

       //Gets actual pixel location on image - currently unused 
       float[] point = new float[] {event.getX(), event.getY()}; 
       Matrix inverse = new Matrix(); 
       iv.getImageMatrix().invert(inverse); 
       inverse.mapPoints(point); 
       float density = getResources().getDisplayMetrics().density; 
       point[0] /= density; 
       point[1] /= density; 
       break; 
      case DragEvent.ACTION_DRAG_ENDED: 
       break; 
      default: 
       break; 
     } 

的ImageView的是可縮放的圖像視圖(chrisbanes/PhotoView中),如果圖像保持在它的通常的100%比例的座標的所有工作,因爲他們應該並且將標記物放置正確。但是,如果我放大圖像,將標記放在特定點上進行更好的控制,同時在縮小標記時獲得正確的座標並不會保留在與圖像相同的位置。簡單說就是父母。請讓我知道你想什麼代碼,看看(有沒有多少人),或者如果我需要重新解釋

感謝

+0

您好,我有相關的矩形區域上的圖像相同的問題。我可以分享整個代碼,但它很長嗎?您只需使用Marker的代碼管理矩形區域的代碼。我用'TouchListener'代替。 – Tauqir

+0

因此,您在圖像上放置一個圖釘,然後放大圖像。縮放後,圖釘保持放置狀態,不隨圖像移動。這是問題,還是放大後放置引腳的問題?如果前者,你是否編寫了任何代碼來移動縮放視圖中的引腳? – Cheticamp

回答

0

我做了一個應用程序,用戶可以觸摸移動意見也可以放大。

在我的情況下,包含幾個視圖的所有ViewGroup(RelativeLayout)作爲一個整體是可縮放的。

我使用onTouch代替ondrag當在內部我保存的尺寸在DP並從DP像素轉換我通過乘以(屏幕密度*一個zoomfactor)

這裏的方法,我來自onTouch ACTION_MOVE的調用,先前在ACTION_DOWN中設置了xPxInitial,dpLeftInitial,yPxInitial,dpTopInitial的值。

@Override 
    public boolean moveControl(float xPx, float yPx) { 

     int newDpLeft, newDpTop; 

     newDpLeft = pixelsToDp((int) (xPx - xPxInitial)) + dpLeftInitial; 
     newDpTop = pixelsToDp((int) (yPx - yPxInitial)) + dpTopInitial; 

     // Limit for left & top 
     if (newDpLeft < 0) newDpLeft = 0; 
     if (newDpTop < 0) newDpTop = 0;   


     int oldDpLeft = dpLeft; 
     int oldDpTop = dpTop; 

     dpLeft = newDpLeft; 
     dpTop = newDpTop; 
     setDimsFromDps(); 

     // return true is the view is really moved 
     return (dpLeft != oldDpLeft || dpTop != oldDpTop); 
    } 

pixelsToDp

/// Pixels to DP's .... 
    public int pixelsToDp(int pixs) { 
     return (int) (pixs/(scrDensity * zoomFactor)); 
    } 

setDimsFromDps

protected void setDimsFromDps() { 
     RelativeLayout.LayoutParams layPar = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, 
       RelativeLayout.LayoutParams.WRAP_CONTENT); 

     // avoid left & top < 0 

     layPar.setMargins(Math.max(dpToPixels(dpLeft), 0), Math.max(dpToPixels(dpTop), 0), 0, 0); 
     layPar.width = dpToPixels(dpWidth); 
     layPar.height = dpToPixels(dpHeight); 


     setLayoutParams(layPar); 

    } 

Hope it will help