gpt4 book ai didi

java - Android ACTION_MOVE图像设置图像滚动范围超出其父级

转载 作者:太空宇宙 更新时间:2023-11-04 13:00:01 25 4
gpt4 key购买 nike

我为 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;

情况下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>

预先感谢您的帮助!

最佳答案

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

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

关于java - Android ACTION_MOVE图像设置图像滚动范围超出其父级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35019487/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com