限制imageview移动

gz5pxeao  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(354)

我得去看医生 ImageView 命名 imgForeground 它可以旋转,缩放和移动,但它可以移动到屏幕外。我怎样才能限制它的移动而不离开屏幕呢?有这个的图书馆吗?它类似于应用程序,你可以选择一个标签,移动和调整它的大小,并把它放在任何你想要的地方。

<ImageView
    android:id="@+id/imgForground"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_centerInParent="true"
    android:src="@drawable/icon" />

此代码用于缩放、移动和旋转:

@Override
public boolean onTouch(View v, MotionEvent event) {
    ImageView view = (ImageView) v;
    view.setScaleType(ImageView.ScaleType.MATRIX);
    float scale;

    // Dump touch event to log
    dumpEvent(event);

    // Handle touch events here...
    switch (event.getAction() & MotionEvent.ACTION_MASK) {
        case MotionEvent.ACTION_DOWN: //first finger down only
            savedMatrix.set(matrix);
            start.set(event.getX(), event.getY());
            Log.d(TAG, "mode=DRAG");
            mode = DRAG;
            break;

        case MotionEvent.ACTION_POINTER_DOWN:
            oldDist = spacing(event);
            if (oldDist > 10f) {
                savedMatrix.set(matrix);
                midPoint(mid, event);
                mode = ZOOM;
            }
            lastEvent = new float[4];
            lastEvent[0] = event.getX(0);
            lastEvent[1] = event.getX(1);
            lastEvent[2] = event.getY(0);
            lastEvent[3] = event.getY(1);
            d = rotation(event);
            break;

        case MotionEvent.ACTION_UP: //first finger lifted
        case MotionEvent.ACTION_POINTER_UP: //second finger lifted
            mode = NONE;
            Log.d(TAG, "mode=NONE");
            break;

        case MotionEvent.ACTION_MOVE:
            if (mode == DRAG) {
                // ...
                matrix.set(savedMatrix);
                matrix.postTranslate(event.getX() - start.x, event.getY()
                        - start.y);
            } else if (mode == ZOOM && event.getPointerCount() == 2) {
                float newDist = spacing(event);
                matrix.set(savedMatrix);
                if (newDist > 10f) {
                    scale = newDist / oldDist;
                    matrix.postScale(scale, scale, mid.x, mid.y);
                }
                if (lastEvent != null) {
                    newRot = rotation(event);
                    float r = newRot - d;
                    matrix.postRotate(r, view.getMeasuredWidth() / 2,
                            view.getMeasuredHeight() / 2);
                }
            }
            break;

    }
    // Perform the transformation
    view.setImageMatrix(matrix);

    return true; // indicate event was handled
}

private float rotation(MotionEvent event) {
    double delta_x = (event.getX(0) - event.getX(1));
    double delta_y = (event.getY(0) - event.getY(1));
    double radians = Math.atan2(delta_y, delta_x);

    return (float) Math.toDegrees(radians);
}

private float spacing(MotionEvent event) {
    float x = event.getX(0) - event.getX(1);
    float y = event.getY(0) - event.getY(1);
    return (float) Math.sqrt(x * x + y * y);

}

private void midPoint(PointF point, MotionEvent event) {
    float x = event.getX(0) + event.getX(1);
    float y = event.getY(0) + event.getY(1);
    point.set(x / 2, y / 2);

}

/**
 * Show an event in the LogCat view, for debugging
 */
private void dumpEvent(MotionEvent event) {
    String names[] = {"DOWN", "UP", "MOVE", "CANCEL", "OUTSIDE",
            "POINTER_DOWN", "POINTER_UP", "7?", "8?", "9?"};
    StringBuilder sb = new StringBuilder();
    int action = event.getAction();
    int actionCode = action & MotionEvent.ACTION_MASK;
    sb.append("event ACTION_").append(names[actionCode]);
    if (actionCode == MotionEvent.ACTION_POINTER_DOWN
            || actionCode == MotionEvent.ACTION_POINTER_UP) {
        sb.append("(pid ").append(
                action >> MotionEvent.ACTION_POINTER_ID_SHIFT);
        sb.append(")");
    }

    sb.append("[");

    for (int i = 0; i < event.getPointerCount(); i++) {
        sb.append("#").append(i);
        sb.append("(pid ").append(event.getPointerId(i));
        sb.append(")=").append((int) event.getX(i));
        sb.append(",").append((int) event.getY(i));
        if (i + 1 < event.getPointerCount())

            sb.append(";");
    }

    sb.append("]");
    Log.d(TAG, sb.toString());

}
nwsw7zdq

nwsw7zdq1#

移动设备屏幕是平面(x,y)的一个区域,其中(0,0)坐标是左上角。您需要计算imageview位置w.r.t屏幕区域。在事件处理程序中,获取imageview的位置。

int[] location = new int[2];
view.getLocationOnScreen(location);
int x = location[0];
int y = location[1];

现在获取图像视图中显示的图像大小。

int ih=view.getMeasuredHeight();//height of imageView
int iw=view.getMeasuredWidth();//width of imageView
int iH=view.getDrawable().getIntrinsicHeight();//original height of underlying image
int iW=view.getDrawable().getIntrinsicWidth();//original width of underlying image

if (ih/iH<=iw/iW)
    iw=iW*ih/iH;    //rescaled width of image within ImageView
else 
    ih= iH*iw/iW;   //rescaled height of image within ImageView

现在得到屏幕的宽度和高度

DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
int deviceHeight = displayMetrics.heightPixels;
int deviceWidth = displayMetrics.widthPixels;

如果imageview向左移动

if(x>0)
    //Move towards left functionality

如果imageview移向顶部

if(y>0)
    //Move towards top functionality

如果imageview向右移动

if(x+iw < deviceWidth)
    //Move towards right functionality

如果imageview向底部移动

if(y+ih < deviceHeight)
    //Move towards right functionality

相关问题