视图变换后图像超出范围

2024-03-08

我在显示图像时遇到问题。

我有一个想要全屏显示的图像。所以我有这个带有 match_parent 和 20dp 填充的 Imageview。

它看起来不错,但是当我对其应用旋转时,视图的边界似乎没有改变,并且图像可能会被剪出屏幕!完全不希望这样的事情发生!如何重新缩放图像,以便图像在旋转 90 度时也适合 ImageView。

这是我的 XML,其中包含旋转。

EDIT:

How to fix the bounds of the Image so the Text is aligned just above the image? enter image description here


测量视图和计算比例时不考虑旋转。一个可能的解决方案是自己做:

public class RotatedImageView extends ImageView {

    ...
    constructors
    ...


    private double mRotatedWidth;
    private double mRotatedHeight;

    private boolean update() {
        Drawable d = getDrawable();

        if (d == null) {
            return false;
        }

        int drawableWidth = d.getIntrinsicWidth();
        int drawableHeight = d.getIntrinsicHeight();

        if (drawableWidth <= 0 || drawableHeight <= 0) {
            return false;
        }

        double rotationRad = getRotation() / 180 * Math.PI;

        // calculate intrinsic rotated size
        // see diagram

        mRotatedWidth = (Math.abs(Math.sin(rotationRad)) * drawableHeight
                + Math.abs(Math.cos(rotationRad)) * drawableWidth);
        mRotatedHeight = (Math.abs(Math.cos(rotationRad)) * drawableHeight
                + Math.abs(Math.sin(rotationRad)) * drawableWidth);

        return true;
    }


    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

        if (update()) {
            double ratio = mRotatedWidth / mRotatedHeight;

            int wMax = Math.min(getDefaultSize(Integer.MAX_VALUE, widthMeasureSpec), getMaxWidth());
            int hMax = Math.min(getDefaultSize(Integer.MAX_VALUE, heightMeasureSpec), getMaxHeight());

            int w = (int) Math.min(wMax, hMax * ratio);
            int h = (int) Math.min(hMax, wMax / ratio);

            setMeasuredDimension(w, h);
        } else {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        }

    }

    private final float[] values = new float[9];

    protected void onDraw(Canvas canvas) {

        if (update()) {
            int availableWidth = getMeasuredWidth();
            int availableHeight = getMeasuredHeight();

            float scale = (float) Math.min(availableWidth / mRotatedWidth, availableHeight / mRotatedHeight);

            getImageMatrix().getValues(values);

            setScaleX(scale / values[Matrix.MSCALE_X]);
            setScaleY(scale / values[Matrix.MSCALE_Y]);
        }

        super.onDraw(canvas);
    }

    @Override
    public void setRotation(float rotation) {
        super.setRotation(rotation);
        requestLayout();
    }
}

adjustViewBounds必须是真的:

<com.mypackage.RotatedImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="20dp"
    android:adjustViewBounds="true"
    android:rotation="90"
    android:maxWidth="100dp"
    android:maxHeight="100dp"
    android:scaleType="fitCenter"
    android:src="@drawable/test" />

对计算的很好的解释,礼貌谢蒂坎普 https://stackoverflow.com/questions/43414865/image-out-of-bounds-after-transformation-on-view/43477366?noredirect=1#comment74025272_43477366 :

更新:现在尝试调整边界。之间没有区别wrap_content and match_parent(根据图像方面,两者都尽可能增长)。你应该使用maxWidth和/或maxHeight,或将其放入LinearLayout尺寸为 0,重量为 0。

它也不可设置动画,在设置动画时调整边界需要为每个帧进行布局传递,这是非常低效的。请参阅其他答案以了解可用于的版本View.animate()

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

视图变换后图像超出范围 的相关文章

  • PHP服务器端IAB验证openssl_verify总是返回0

    我使用以下函数 服务器端 php 来验证 IAB v3 事务 我从 Android 应用程序传递过来 Override protected void onActivityResult int requestCode int resultCo
  • 删除 json 对象字符串中的“\”

    如何删除下面字符串中的特殊字符 String x message content toom recipients id 1000001865 room subject room 我使用了 x replaceAll 但它不起作用 您必须转义正
  • Android 从键盘读取

    我的登录屏幕根本没有文本字段 当用户使用 RFID 扫描仪扫描他的 id 令牌时 我会得到一个 8 个字符长的字符串 其原理与使用键盘相同 只是更快 我希望我的登录活动在用户扫描其令牌时而不是之前执行 有一个聪明的方法来实现这个吗 我不能有
  • Mesibo 通话 UI 未更新

    我正在尝试更改 Mesibo Call UI 的配置 但它并没有改变 我尝试如下 MesiboCallConfig mesiboCallConfig new MesiboCallConfig mesiboCallConfig backgro
  • Android中如何将文件写入raw文件夹?

    我认为这是一个非常基本的问题 我目前正在编写这样的文件 File output new File exampleout mid 现在 我想将文件写入 myproject res raw 我读到我可以通过将完整的网址放在 中来做到这一点 但
  • Android/Java 创建辅助类来创建图表

    Goal 创建用于图形生成的辅助类 背景 我有 3 个片段 每个片段收集一些传感器数据 加速度计 陀螺仪 旋转 并使用 GraphView 绘制图表 以下是其中一个片段的代码 该代码当前工作正常 public class Gyroscope
  • Android:拍照后调用裁剪活动

    我在解析拍摄照片的 uri 来裁剪活动时遇到问题 在我的应用程序中 用户可以拍摄一张照片或从图库中选择一张照片 然后裁剪并上传 一切听起来都很简单 从图库中选择时 图库应用程序会返回所选照片的 uri 如下所示 content media
  • 有没有办法替代Android中的标准Log?

    有没有办法以某种方式拦截对 android 中标准 Log 的调用并执行其他操作 在桌面 Java 中 人们通常会得到一些记录器 因此有多种方法可以安装不同的日志处理程序 实现 但是 Android似乎对Log有静态调用 我找不到任何有关替
  • AOSP 中 android.Build.SERIAL 何时何地生成?

    我知道android Build SERIAL是在第一次设备启动时生成的 但我无法准确定位位置和时间 我正在建造AOSP Jelly Bean Android平板电脑 nosdcard 第二个问题 这个是序列号吗 really对所有人来说都
  • Android 中带有透明背景的 ImageButton [重复]

    这个问题在这里已经有答案了 我已经按照这篇文章在android中制作ImageButton 安卓图像按钮 https stackoverflow com questions 2283444 android image button 图像出现
  • 如何在虚拟机 VirtualBox 上运行 Android-x86 4.2 iso?

    我想用Android x86测试和调试我的应用程序 我之前成功尝试过其他版本的Android x86 但是关于android x86 4 2有一个错误 所以我在这里问我的问题 因为它可能会发生在其他人身上 我安装了oracle VM vir
  • Android 发布到 facebook 墙,stream.publish 几天来就中断了

    我有很多使用 FB android sdk 发布的应用程序 github com facebook facebook android sdk 我所有使用 FB 的应用程序几天后就停止工作了 这必然是 FB 方面的更改或错误 因为我的应用程序
  • 在尝试使用 GPS 之前如何检查 GPS 是否已启用

    我有以下代码 但效果不好 因为有时 GPS 需要很长时间 我该如何执行以下操作 检查GPS是否启用 如果启用了 GPS 请使用 GPS 否则请使用网络提供商 如果 GPS 时间超过 30 秒 请使用网络 我可以使用时间或 Thread sl
  • 确定视图是否在屏幕上 - Android

    我对这个有点困惑 首先也是最重要的是 以下链接很有用 但是我提出了一些可见性问题 链接 检查视图可见性 https stackoverflow com questions 4628800 android how to check if a
  • 获取当前图片在图库中显示的位置

    在我的应用程序中 我有一个图片库 但我想检测当前显示图像的位置 例如 当我启动我的活动时 位置是 0 但是当我在图库中滚动时 我想获取当前显示图像的位置 我尝试过 OnFocusChanged OnItemClicked 但只有当我单击图库
  • 如何以编程方式创建 CardView

    我正在开发一个 Android 应用程序Java Android Studio 我想在活动中创建CardView以编程方式 我想将以下属性设置为CardView layout width wrap content layout row 0
  • Android:ANT 构建失败,并显示 google-play-services-lib:“解析为没有项目的 project.properties 文件的路径”

    我正在尝试使用 ANT 构建我的应用程序 但在包含 google play services lib 库项目后 我惨遭失败 Step 1 我在 project properties 文件中设置了对库项目的引用 android library
  • Android BLE 扫描永远找不到设备

    几天以来 我尝试在我的应用程序中实现 BLE 连接 我知道我尝试连接的设备功能齐全 因此问题一定是我的代码 我用BluetoothLeScanner startScan 方法 但回调方法永远不会被调用 public void startSc
  • firebase中按范围查询

    我有一个食品价格范围滑块 根据滑块的最小值和最大值 我想显示此范围内的食品 滑块代码 multiSlider setOnThumbValueChangeListener new MultiSlider SimpleChangeListene
  • 进程被杀死后不会调用 onActivityResult

    我有一个主要活动 Main 和另一个活动 Sub 由 Main 调用 startActivityForResult new Intent this SubActivity class 25 当我在 Sub 时 我终止该进程 使用任务管理器或

随机推荐

  • HashMap 不可序列化

    HashMap with Serializable键 值应该是Serializable 但这对我不起作用 尝试了其他一些IO流 没有一个有效 有什么建议吗 测试代码 public class SimpleSerializationTest
  • Modernizr.touch 在 Firefox 浏览器上返回 true

    我编写了一段代码来获取基于触摸和非触摸的事件 它适用于除 Firefox 之外的所有其他浏览器和设备 默认 FF 返回true var thumbsEvent isTouch Modernizr touch detect the touch
  • mysql中正则表达式匹配的十六进制字符

    我发现 mysql 的行为非常奇怪 下面的选择返回 0 SELECT CONVERT a USING BINARY REGEXP x61 然而 下面语义相同的 select 返回 1 SELECT CONVERT a USING BINAR
  • 仅在滚动时触发一次函数(scrollstop)

    所以 我只想在滚动时触发一次函数 使用滚动停止 https stackoverflow com questions 16867266 peform a function if an element is completely in the
  • 如何更改行结束设置

    是否有文件或菜单可以让我更改如何处理行结尾的设置 我读到有 3 个选项 Windows 风格的签出 Unix 风格的提交 Git 在签出文本文件时会将 LF 转换为 CRLF 什么时候 提交文本文件时 CRLF 将转换为 LF 为了 跨平台
  • Jquery:当输入值被另一个函数更改时,.on('input') 不会触发

    这是代码 input type text on input function stuff here first function input type text click function second function keyboard
  • Rhino - 模拟类而不覆盖虚拟方法

    如果我正在模拟一个类 如下所示 有什么方法可以让模拟not重写虚拟方法 我知道我可以简单地删除 virtual 修饰符 但我实际上想稍后删除此方法的行为 换句话说 除了删除 virtual 修饰符之外 如何才能通过此测试 namespace
  • 递归查找子集

    这是我尝试创建的一个递归函数 用于查找 STL 集中传递的所有子集 这两个参数是一个用于搜索主题的 STL 集 以及一个数字 i gt 0 它指定子集应该有多大 如果整数大于集合 则返回空子集 我认为我这样做不正确 有时是对的 有时则不是
  • 在 Erlang 中如何将元组对列表转换为记录?

    假设我有这个 record my record foo bar baz Keyvalpairs foo val1 bar val2 baz val3 Foorecord my record foo val1 bar val2 baz val
  • SimpleDateFormat 错误地解析字符串

    String s 19 17 38 008000 DateFormat f new SimpleDateFormat HH mm ss SSSSSS Date d f parse s system out println d 这是我正在运行
  • 有没有办法在 Windows 上使用 Qt 列出当前进程?

    使用 Qt 4 是否可以知道哪些进程正在运行 我正在寻找一种方法来等待用户关闭应用程序才能进行操作 我也不知道 Qt 解决方案 但使用CreateToolhelp32Snapshot Process32FirstW and Process3
  • 在后台任务中添加到 CALayer 时 UIImage 不显示

    在我的视图控制器中我有 IBOutlet var worldmapview Worldmapview var eventLayer CALayer CALayer 和一些功能 func create picture layer pathto
  • SVN 标签:如何不更新/签出它们?

    在许多项目中 我查看完整的存储库并获得标准目录结构 project branches tags trunk 如果我做一个svn up project 一切都很好branches and trunk文件夹 但是 当然 tags文件夹也更新了
  • 我无法将 postgresql schema.table 与 dplyr 包连接

    我正在尝试将 postgres 与 dplyr 函数连接 my db lt src postgres dbname mdb1252 user diego password pass my db src postgres 9 2 5 post
  • 带日期轴的箭袋或倒钩

    绘制箭袋或倒刺的时间序列 日期 的标准方法是什么 我经常在 Pandas DataFrame 中有时间序列 并像这样绘制它们 plt plot df index to pydatetime df parameter 这非常有效 x 轴可以被
  • 使用@font-face 使用多种自定义字体?

    我确信我错过了一些非常直接的东西 一直使用带有普通字体的单个自定义字体 font face font family CustomFont src url CustomFont ttf 当我使用它时一切正常 但如果我想添加另一种自定义字体我该
  • StandardML 中的 y 组合器

    我知道我可以用 SML 编写 y 组合器 如下所示 首先声明一个新的数据类型来绕过由于循环而导致的类型不匹配 datatype a mu Roll of a mu gt a val unroll fn Roll x gt x 现在您可以轻松
  • 使用 GitLab API 设置外部问题跟踪器设置?

    我将 GitLab 与外部问题跟踪器 JIRA 一起使用 并且效果很好 我的问题是当我创建一个新的 GitLab 项目 使用 API 时 我必须进入 GitLab 的项目设置并manually选择我想要使用的问题跟踪器并manually输入
  • Django 中多个视图中的相同 URL

    我正在开发一个网络应用程序 我需要这样的东西 url r collection views home name home url r collection views main name main 如果用户已通过身份验证 则转到 main
  • 视图变换后图像超出范围

    我在显示图像时遇到问题 我有一个想要全屏显示的图像 所以我有这个带有 match parent 和 20dp 填充的 Imageview 它看起来不错 但是当我对其应用旋转时 视图的边界似乎没有改变 并且图像可能会被剪出屏幕 完全不希望这样