gpt4 book ai didi

android - 放大和缩小的 ImageView 问题,以最大和最小级别拖动

转载 作者:行者123 更新时间:2023-11-29 18:13:39 24 4
gpt4 key购买 nike

我已经实现了一个具有缩放和拖动功能的 ImageView 。我正在使用矩阵来实现缩放和拖动功能。但我的问题是我无法设置我的最小和最大缩放级别以及拖动空间限制。可以任何告诉我该怎么做。

    private float spacing(MotionEvent event) {
float x = event.getX(0) - event.getX(1);
float y = event.getY(0) - event.getY(1);
return FloatMath.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);
}

private float spacing(PointF start,PointF end)
{
float x = end.x- start.x;
float y = end.y -start.y;

return FloatMath.sqrt(x * x + y * y);
}

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

float scale;


switch (event.getAction() & MotionEvent.ACTION_MASK) {

case MotionEvent.ACTION_DOWN:

savedMatrix.set(matrix);
start.set(event.getX(), event.getY());
Log.d(TAG, "mode=DRAG" );
mode = DRAG;

break;
case MotionEvent.ACTION_UP:

if(mode==DRAG)
{
PointF end=new PointF();
end.set(event.getX(), event.getY());

Log.d("Fling", "Inside the Action Key UP"+spacing(start, end));

float []x = new float[9],org=new float[9];

matrix.getValues(x);
orgMatrix.getValues(org);

Log.d("Fling", "matrixValue"+matrix);
Log.d("Fling", "OrgmatrixValue"+orgMatrix);

float matrixSizex=x[Matrix.MSCALE_X];
float matrixSizey=x[Matrix.MSCALE_Y];


float matrixOrgSizex=org[Matrix.MSCALE_X];
float matrixOrgSizey=org[Matrix.MSCALE_Y];

if(Math.abs(matrixOrgSizex-matrixSizex)<0.17f&&Math.abs(matrixOrgSizey-matrixSizey)<0.17f)
{
Log.d("Fling", "Current Size is equal");
if(spacing(start, end)>30.f)
{
if((start.x>end.x+30)&&(Math.abs(start.y-end.y)<50.0f))
{
Log.d("Fling", "Is From Right To left");
loadedimage.setImageMatrix(orgMatrix);
leftSwipe();
view.setScaleType(ImageView.ScaleType.FIT_XY);
}
else if((end.x>start.x+30)&&(Math.abs(end.y-start.y)<50.0f))
{
Log.d("Fling", "Is From Left To Right");
loadedimage.setImageMatrix(orgMatrix);
rightSwipe();
view.setScaleType(ImageView.ScaleType.FIT_XY);
}
}
}
}
case MotionEvent.ACTION_POINTER_UP: //second finger lifted
mode = NONE;
Log.d(TAG, "mode=NONE" );
break;
case MotionEvent.ACTION_POINTER_DOWN: //second finger down
oldDist = spacing(event);
Log.d(TAG, "oldDist=" + oldDist);
if (oldDist > 5f) {
savedMatrix.set(matrix);
midPoint(mid, event);
mode = ZOOM;
Log.d(TAG, "mode=ZOOM" );
}
break;

case MotionEvent.ACTION_MOVE:
if (mode == DRAG) {

//movement of first finger
PointF end=new PointF();
end.set(event.getX(), event.getY());

Log.d("Fling", "Inside the Action Key UP"+spacing(start, end));

float []x = new float[9],org=new float[9];

matrix.getValues(x);
orgMatrix.getValues(org);

Log.d("Fling", "matrixValue"+matrix);
Log.d("Fling", "OrgmatrixValue"+orgMatrix);

float matrixSizex=x[Matrix.MSCALE_X];
float matrixSizey=x[Matrix.MSCALE_Y];


float matrixOrgSizex=org[Matrix.MSCALE_X];
float matrixOrgSizey=org[Matrix.MSCALE_Y];

if(Math.abs(matrixOrgSizex-matrixSizex)>=0.17f&&Math.abs(matrixOrgSizey-matrixSizey)>=0.17f)
{

matrix.set(savedMatrix);

if (view.getLeft() >= 0)
{
matrix.postTranslate(event.getX() - start.x, event.getY() - start.y);
}
}
}
else if (mode == ZOOM) { //pinch zooming
float newDist = spacing(event);
Log.d(TAG, "newDist=" + newDist);
if (newDist > 5f) {
matrix.set(savedMatrix);
scale = newDist / oldDist; //thinking i need to play around with this value to limit it**
matrix.postScale(scale, scale, mid.x, mid.y);
}
}
break;
}

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

return true; // indicate event was handled
}

我的示例代码在这里,任何人都可以帮助我设置最小和最大缩放和拖动级别。当我在 ImageView 中触摸时我也有问题,当转换为矩阵时它会自动缩放我无法让它保持适合设备屏幕。我完全被困在这里.......

最佳答案

为了限制缩放,我将缩放矩阵与单位矩阵进行比较,如果它小于单位矩阵,则不将其分配给我的 ImageView,在这种情况下,我将缩放矩阵重置回单位矩阵。我在 Android 上使用 Mono,但我想它在 Java 中几乎是一样的:

      //check that zoom is not too small
if (Utils.SmallerThanIdentity(matrix))
{
ResetView(v);
}

实现 SmallerThanIdentity 的地方:

public static bool SmallerThanIdentity(Android.Graphics.Matrix m)
{
float[] values = new float[9];
m.GetValues(values);

return ((values[0] < 1.0) || (values[4] < 1.0) || (values[8] < 1.0));
}

这是 ResetView。我有 Java 代码:

public void resetView(View v)
{
ImageView view = (ImageView)v;
matrix = new Matrix();

view.setScaleType(ImageView.ScaleType.MATRIX);
view.setImageMatrix(matrix);
}

关于滚动,在将矩阵转换到我想限制滚动的区域之前,我使用了下面的 ShouldScroll 方法。

private bool ShouldScroll(Android.Graphics.Matrix matrix)
{
float[] values = new float[9];
matrix.GetValues(values);

float[] oldValues = new float[9];
oldMatrix.GetValues(oldValues);

float zoomPercentX = values[0] / oldValues[0];
float zoomPercentY = values[4] / oldValues[4];

float tmpW = -(this.Drawable.IntrinsicWidth / 2) * zoomPercentX;
float tmpH = -(this.Drawable.IntrinsicHeight / 2) * zoomPercentY;

return (values[2] < 0.0f) && (values[2] > tmpW) && //horizontal coordinates
(values[5] < 0.0f) && (values[5] > tmpH); //vertical coordinates
}

关于android - 放大和缩小的 ImageView 问题,以最大和最小级别拖动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9357090/

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