Android ACTION_MOVE图像设置图像滚动范围在其父级之外

时间:2016-01-26 17:00:51

标签: java android matrix android-imageview scale

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

我使用了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>

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我找到了解决方案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);
}

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