2017-06-16 48 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