【问题标题】:Android ACTION_MOVE image set image scrolling bounds outside its parentAndroid ACTION_MOVE 图像设置图像滚动边界超出其父级
【发布时间】:2016-01-26 17:00:51
【问题描述】:

我为 ImageView 实现了 ACTION_MOVE,它比它的父级 (FrameLayout) 大。现在我正在尝试添加一些代码,以在至少一个图像边缘位于其父级内部时停止移动(拖动和捏缩放)(因此它不会显示父级的背景)。

我使用了this question中的代码。

case MotionEvent.ACTION_MOVE:
    if (mode == DRAG) { //movement of first finger
        matrix.set(savedMatrix);
        float newX = event.getX() - start.x;
        float newY = event.getY() - start.y;

        if (view.getLeft() >= -392){
            matrix.postTranslate(newX, newY);
        }
    }
    else if (mode == ZOOM) { //pinch zooming
        float[] f = new float[9];

        float newDist = spacing(event);
        if (newDist > 5f) {
            matrix.set(savedMatrix);
            scale = newDist / oldDist; 
            matrix.postScale(scale, scale, mid.x, mid.y);
        }

        matrix.getValues(f);
        float scaleX = f[Matrix.MSCALE_X];
        float scaleY = f[Matrix.MSCALE_Y];

        if(scaleX <= MIN_ZOOM) {
            matrix.postScale((MIN_ZOOM)/scaleX,
                 (MIN_ZOOM)/scaleY, mid.x, mid.y);
        } 
        else if(scaleX >= MAX_ZOOM) {
            matrix.postScale((MAX_ZOOM)/scaleX, 
                 (MAX_ZOOM)/scaleY, mid.x, mid.y);
        }
}
break;

我尝试了很多东西,我知道已经有人问过类似的问题,但到目前为止没有一个问题适合我的需要。

我最好的猜测是在下面添加代码,但看起来 mImageView.getLeft()mImageView.getRight() 等返回父级边缘而不是图像。

在 onCreate() 中:

DisplayMetrics displayMetrics = 
getApplicationContext().getResources().getDisplayMetrics();
float screenWidth = displayMetrics.widthPixels;
float screenHeight = displayMetrics.heightPixels;

case MotionEvent.ACTION_MOVE

if (mImageView.getLeft() > 0 ||
    mImageView.getRight() < screenWidth) {
       matrix.postTranslate(0, newY);
       break;
}
else if (mImageView.getTop() > 0 || 
       mImageView.getBottom() < screenHeight) {
       matrix.postTranslate(newX, 0);
       break;
 }
 else {
        matrix.postTranslate(newX, newY);
 }

这是我的布局:

<RelativeLayout
    android:id="@+id/imageViewContainer"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/mag_background">
    <TextView/>
    <ImageView/>
    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/imageViewHeadingLabel">
        <ImageView
            android:id="@+id/imageView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/image"
            android:scaleType="matrix"
            android:layout_gravity="center_vertical|center_horizontal"
            android:contentDescription="image to zoom"/>
    </FrameLayout>
</RelativeLayout>

提前感谢您的帮助!

【问题讨论】:

    标签: java android matrix android-imageview scale


    【解决方案1】:

    我找到了解决方案hire

    我取消了检查,所以我不让图像移动到布局之外,而不是让图像边界在布局内部移动,如下所示:

    if (mode == DRAG) { //movement of first finger
        matrix.set(savedMatrix);
        matrix.getValues(matrixValues);
        matrixX = matrixValues[2];
        matrixY = matrixValues[5];
        width = matrixValues[0] * (view.getDrawable().getIntrinsicWidth());
        height = matrixValues[4] * (view.getDrawable().getIntrinsicHeight());
        dx = event.getX() - start.x;
        dy = event.getY() - start.y;
    
        //if image will go inside left bound
        if (matrixX + dx > 0){
            dx = -matrixX;
        }
        //if image will go inside right bound
        if(matrixX + dx + width < view.getWidth()){
            dx = view.getWidth() - matrixX - width;
        }
        //if image will go inside top bound
        if (matrixY + dy > 0){
            dy = -matrixY;
        }
        //if image will go inside bottom bound
        if(matrixY + dy + height < view.getHeight()){
            dy = view.getHeight() - matrixY - height;
        }
        matrix.postTranslate(dx, dy);
    }
    

    但是,如果您将缩放的图像移动到角落然后缩小,它将显示父背景,直到下一次触摸事件,所以问题没有完全解决。

    【讨论】:

      猜你喜欢
      • 2017-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-29
      • 2019-09-19
      相关资源
      最近更新 更多