图像视图的放大和缩小问题,拖动最大和最小级别

2023-11-29

我已经实现了具有缩放和拖动功能的图像视图。我正在使用矩阵进行缩放和拖动功能。但我的问题是我无法设置最小和最大缩放级别以及拖动空间限制。任何人都可以告诉我我怎样才能做到这一点。

    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,在这种情况下,我将缩放矩阵重置回单位矩阵。我在 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
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

图像视图的放大和缩小问题,拖动最大和最小级别 的相关文章

  • Android Volley 对于一个请求返回两次结果

    我两天来一直在试图解决这个问题 但我完全被难住了 由于某种原因 我向队列发送一个请求 但 volley 返回两次 这会调用侦听器两次并使列表视图中的结果加倍 我打开了 Volley 的日志记录 可以看到请求被添加到队列中并返回 然后几秒钟后
  • 使用街景图像

    我想获取街景图片 注明纬度和经度 并显示在对话框中 这可能吗 我在这里看到了一些示例 但没有找到一个向我展示如何在对话框中显示图像的示例 抱歉 如果网站中已经存在这个问题 但我在搜索时没有找到 是的你可以 作为 URL 根 你可以使用这个h
  • 调整 Android 日期选择器控件的大小

    如何将 android datepicker 控件的初始大小调整为更小或更大 有没有唯一的方法可以重新实现它 我一直无法找到调整其大小的方法 但已经看到了使用 DatePicker 作为对话框的实现 日期呈现为带有编辑按钮的 TextVie
  • Cordova 无法构建项目

    Update 新读者 请检查我最后的编辑 更新cordova后 无法构建 运行 Mac mini de Toni funcook toniweb sudo cordova build Password Running command Use
  • 如何立即开始执行 Kotlin 协程

    我想立即启动一个协程 我有一段代码 class SampleActivity AppCompatActivity CoroutineScope private var job Job Job override val coroutineCo
  • 64位版本的adb和fastboot?

    我在 Debian 7 3 x64 已完全修补 上发现了以下错误 我很确定这是因为adb即使在其 SDK 工具的 64 位发行版中也是 32 位 which adb opt android sdk platform tools adb op
  • 在 Mac 上升级到 Android Studio 3.3 后,运行卡在“安装 APK”上并且无法部署到连接的设备

    从 Mac 机器上的稳定通道升级到最新的 Android Studio 版本 3 3 后 现在当我使用连接的设备按下运行时 它会成功构建并不断告诉 正在安装 apk 但经过一段时间后 它既不安装也不显示错误 也尝试过模拟器和同样的问题 任何
  • Android studio总是乱码

    I have change the encode to UTF 8 so I got this problem who can help me I reinstalled it twice but android studio1 4 Alw
  • 在原生 Android 应用程序中集成多个 Unity 游戏

    我有一个原生 Android 应用程序 我想在其中嵌入多个 Unity 游戏 我跟着link https medium com davidbeloosesky embedded unity within android app 7061f4
  • 使用 Android 解析 JSON 的最有效方法

    我编写了一些代码来解析我的 Android 程序收到的 Google 距离矩阵 JSON 响应 我唯一感兴趣的数据是 距离 值 节点 我的代码可以工作 但似乎必须有一种更简单的方法来做到这一点 距离值节点在 JSON 中嵌套得很深 但是真的
  • Android - 使用 Intent 打开 PDF 文档关闭后不保存

    我面临的问题是 当尝试保存对使用此 URI 打开的 PDF 文档的更改时内容 xx xxx xxx fileprovider external Download Sync FileName pdf 我所做的任何更改在关闭文档后都不会保存 但
  • NoClassDefFoundError:解析失败:Lio/realm/internal/LinkView

    我正在使用领域 我安装了 Stetho Realm 来查看领域数据 这就是我所做的 buildscript repositories google jcenter dependencies classpath com android too
  • 无法将库添加到我的 Android 项目

    我正在创建一个新应用程序 我想使用一些像这样的库 https github com JakeWharton Android ViewPagerIndicator https github com JakeWharton Android Vi
  • 解析JSON数据并将其放入gridview中

    我正在开发一个应用程序 我必须在其中解析JSON数据并且必须将它们放入自定义中gridview 它应该是这样的 到目前为止 我已经在 asynctask 中解析了 JSON 数据并获取了这些值 这是我的代码 private class ge
  • Retrofit RxAndroid 为 api 调用制作包装器

    我想在改造中为 api 调用创建一个包装器 这样我就可以在常见位置显示 ProgressDialog 并处理常见响应 我通过创建这样的包装器来实现这一点 public static
  • SpannableString 中的 URLSpan

    我正在使用这个例子SpannableString http developer android com resources samples ApiDemos src com example android apis text Link ht
  • 我可以在“com.android.vending.BILLING”中使用“uses-feature”而不是“uses-permission”吗?

    在我的应用程序的 AndroidManifest xml 中 我目前有
  • 如何在两种不同模式、两种布局中设置方向?

    我有一个叫做Main XML我将方向设置为纵向AndroidManifest xml 我也为 Honeycomb 设计了这个布局并将其放置在layout xlarge mdpi文件夹 但我想使用Main XML in layout xlar
  • Android 通知上有按钮

    我正在尝试使用 2 个按钮发出通知 一个带我回到活动 另一个将其关闭 有谁知道如何捕获按钮单击事件 请记住活动已暂停 我很高兴发布它 经过一夜的工作 我发现了一些东西 那么 我们开始吧 1 为您的通知创建 xml 布局文件 2 使用Noti
  • 如何在android中使用Room Persistence ORM工具实现created_at和updated_at列

    我该如何实施created at and updated at在Android中使用Room Persistence ORM工具的列 可以在创建或更新表中的行时自动更新时间戳 我研究了很多网站 但仍然没有找到任何可以处理的结果middlew

随机推荐

  • 如何在使用 Binding.scala 将元素加载到 dom 后执行一些 init

    dom def chart show Var Boolean if show bind
  • 向下滚动时淡入,向上滚动时淡出 - 基于窗口中的元素位置

    我试图让一系列元素在窗口中完全可见时在向下滚动时淡入 如果我继续向下滚动 我不希望它们淡出 但如果我向上滚动 我确实希望它们淡出 这是我发现的最接近的jsfiddle http jsfiddle net tcloninger e5qaD d
  • 在 JSP/Servlet 中管理文件上传

    又是一个非常初学者的问题 但我在这里 我想使用 servlet 或类似工具将上传的文件 从 html 文件选择 复制到永久位置 这就是我需要对文件执行的所有操作 我目前正在使用 Apache Commons FileUpload 和 IO
  • (jQuery Highchart) 有没有办法将额外的自定义数据放入工具提示框中?

    我想添加额外的custom工具提示框中的统计数据行 出现在鼠标悬停上方 据我所知 它仅显示名为的对象数组内的数据series and tooltip 我只是想放入更多自定义数据 放入工具提示框中 每个工具提示都有单独的值 不常见 例如 第
  • 电池历史记录无法找到结束时间android

    我正在尝试使用 Battery Historian Pythonscript从 GitHub 分析电池使用情况 但每次使用脚本生成的 html 显示 找不到结束时间 我正在按照步骤表操作here 这是一个示例batterystats txt
  • 实体框架分离一个实体,相关实体消失

    当我使用实体框架时 我想查询上下文中的记录并将其添加到具有相同架构的另一个上下文中 查询出记录后 我将其与上下文分离 但相关实体都消失了 是吗 有什么办法解决吗 提前致谢 这是 设计使然 EF 只能一一分离实体 但同时 EF 不支持由附加实
  • 如何使用 Java 从 CryptoJS 解密加密的 AES-256 字符串? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我有一个来自 CryptoJS 的带有密码的加密 AES 256 字符串 我需要用 Java 解密它 但不知道该怎么做 看来你需要 IV 密钥和盐来解密 如下所示CryptoJS
  • 更改 VBA 中的小数点分隔符(不仅在 Excel 中)

    在A1单元格中输入 1 10 运行这个宏 Sub ChangeDecimalSeparator Application DecimalSeparator Application UseSystemSeparators False MsgBo
  • 检测到带有 Chrome 驱动程序的 Python Selenium Web 驱动程序

    我假设 Selenium 打开的 chrome 浏览会话与 google chrome 本地安装相同 但是当我尝试在这个网站上搜索时 即使只是用 selenium 打开它并手动控制搜索过程 我也会收到一条错误消息 因为当我在自己的个人资料中
  • 如何说服 python 流对象从 isatty() 返回 true?

    Usually isatty 告诉您流是否是 TTY 并且是确定 stdout 或 stderr 是否是控制台的常用方法 问题是 当您在 IDE 下运行脚本时 输出会被重定向 因此 istty 将返回 False 或者甚至不会被定义 我想将
  • 如何获取 MongoDB 集合中的最低值?

    我有一个名为 Product 的 MongoDB 集合 其中包含以下文档 如下所示 product Milk barcode 12345 price 100 store BestBuy product Milk barcode 12345
  • 调用从电子表格返回自定义类型的 VBA 函数

    我有一个返回自定义数据类型的 vba 函数 定义为 Public Type stockValue stock As String value As Double End Type 我的问题是当我从电子表格单元格调用该函数时如何处理这个问题
  • 使用自写包部署Shiny应用

    我有一个工作闪亮的应用程序 它使用库 珊瑚 其中珊瑚是我自己编写的包 安装在闪亮应用程序的目录中 当我尝试将应用程序部署到shinyapps io 时 我收到以下消息 Error Unable to retrieve package rec
  • 自定义代码合约异常消息

    我有一个代码契约表示为这样 它验证要存储的实体不为空并且对于持久性有效 有用 棒极了 ContractClassFor typeof IRepository lt gt internal abstract class ContractsFo
  • DLL 加载库 - 错误代码 126

    我正在使用 Windows API 中的 LoadLibrary 当我运行该应用程序时 它会抛出错误代码 126 我读到这可能是由依赖项引起的 我检查了某些应用程序 如 Dependency Walker 出了什么问题 但一切都正常很好 在
  • 在所有活动中显示通用音乐播放器

    我正在为一支乐队开发一款应用程序 其中包含多种不同的活动 例如议程 新闻部分 专辑部分等 因为是乐队的作品 所以我想在背景中播放乐队的歌曲 这不是一个问题 但我想在所有活动的底部显示一个小型音乐播放器 以便用户可以随时停止 跳过或重播歌曲
  • 如何使用 StringBuilder 进行多个不区分大小写的替换

    我有一个 大 模板 想要替换多个值 替换需要不区分大小写 还必须能够拥有模板中不存在的键 例如 TestMethod public void ReplaceMultipleWithIgnoreCaseText const string te
  • 添加为 UIWindow 子视图的 UIView 不响应点击

    我添加了一个UIView含有一个UITapGestureRecognizer作为我的关键窗口的子视图 它显示正确 但是当我点击视图时 目标方法不会被触发 我什至尝试用手势识别器替换UIButton 仍然无济于事 这是我的代码 通知视图 h
  • 在基本工作区中查找具有部分字符串匹配的变量(Matlab)

    我想知道如何通过仅输入变量名称的一部分来在基本 MATLAB 工作区中查找变量 我有一长串变量并且我不知道确切的变量名称 是否有一个函数可以比较 匹配变量字符串列表中的字符顺序 Thanks 您可以使用who获取当前工作区中所有变量名称的列
  • 图像视图的放大和缩小问题,拖动最大和最小级别

    我已经实现了具有缩放和拖动功能的图像视图 我正在使用矩阵进行缩放和拖动功能 但我的问题是我无法设置最小和最大缩放级别以及拖动空间限制 任何人都可以告诉我我怎样才能做到这一点 private float spacing MotionEvent