Android 收缩和缩放时,在imageview上保持拖放视图位置

Android 收缩和缩放时,在imageview上保持拖放视图位置,android,Android,我使用一个非常标准的拖放实现来拖动一个图钉并将其放置在图像视图的顶部,以指向图像的特定部分: @Override public boolean onDrag(View v, DragEvent event) { int action = event.getAction(); switch (event.getAction()) { case DragEvent.ACTION_DRAG_STARTED:

我使用一个非常标准的拖放实现来拖动一个图钉并将其放置在图像视图的顶部,以指向图像的特定部分:

@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%比例,则所有坐标都会正常工作,并且标记位置正确。但是,如果我放大图像,将标记放置在特定点上以进行更精细的控制,同时在缩小时获得正确的坐标,则标记不会保持在相对于图像的相同位置。仅仅是父母的。请让我知道你想看什么代码(没有其他的),或者我是否需要重新解释


谢谢

我开发了一个应用程序,用户可以触摸移动视图,也可以缩放

在我的例子中,包含多个视图的所有视图组(RelativeLayout)作为一个整体是可缩放的

我使用onTouch而不是onDrag,在内部我将尺寸保存在dp中,并将dp转换为像素I乘以(屏幕密度*缩放因子)

这里是我从onTouch ACTION_MOVE调用的一个方法,xPxInitial、dpLeftInitial、yPxInitial、dpTopInitial的值先前是在ACTION_DOWN中设置的

 @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);
    }
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
protectedvoid setDimsFromDps(){
RelativeLayout.LayoutParams layPar=新的RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_内容,
RelativeLayout.LayoutParams.WRAP_内容);
//避免左上方<0
layPar.setMargins(数学最大值(dpToPixels(dpLeft),0),数学最大值(dpToPixels(dpTop),0),0);
layPar.width=dpToPixels(dpWidth);
layPar.height=dpToPixels(dpHeight);
设置布局参数(layPar);
}
希望能有所帮助

我开发了一个应用程序,用户可以触摸移动视图,也可以缩放

在我的例子中,包含多个视图的所有视图组(RelativeLayout)作为一个整体是可缩放的

我使用onTouch而不是onDrag,在内部我将尺寸保存在dp中,并将dp转换为像素I乘以(屏幕密度*缩放因子)

这里是我从onTouch ACTION_MOVE调用的一个方法,xPxInitial、dpLeftInitial、yPxInitial、dpTopInitial的值先前是在ACTION_DOWN中设置的

 @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);
    }
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
protectedvoid setDimsFromDps(){
RelativeLayout.LayoutParams layPar=新的RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_内容,
RelativeLayout.LayoutParams.WRAP_内容);
//避免左上方<0
layPar.setMargins(数学最大值(dpToPixels(dpLeft),0),数学最大值(dpToPixels(dpTop),0),0);
layPar.width=dpToPixels(dpWidth);
layPar.height=dpToPixels(dpHeight);
设置布局参数(layPar);
}
希望能有所帮助

Hi,我也有同样的问题,与图像上的矩形区域有关。我可以分享整个代码,但它很长吗?您只需使用标记管理矩形区域的代码。我用了
TouchListener
。所以,你在图像上放置一个pin,然后放大。缩放后,pin保持不变,不会随图像移动。这就是问题所在,还是缩放后放置pin的问题?如果是前者,您是否编写了在缩放视图中移动pin的代码?您好,我遇到了与图像上矩形区域相关的相同问题。我可以分享整个代码,但它很长吗?您只需使用标记管理矩形区域的代码。我用了
TouchListener
。所以,你在图像上放置一个pin,然后放大。缩放后,pin保持不变,不会随图像移动。这就是问题所在,还是缩放后放置pin的问题?如果是前者,您是否编写了在缩放视图中移动pin的代码?