以编程方式创建时椭圆形被剪裁

2023-11-27

我有一个剪辑问题。

首先,我尝试仅使用 Xml 显示椭圆形。我有以下代码:

res/drawable/circle.xml

<?xml version="1.0" encoding="utf-8"?>
<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval" >
    <size
        android:width="240dp"
        android:height="240dp" />
    <solid
        android:color="#FFFFFF" />
    <stroke
        android:width="2dp"
        android:color="#EEEEEE" />
</shape>    

*res/layout/test.xml

....
<RelativeLayout
    android:id="@+id/circle_layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_weight="1" >

    <ImageView
        android:src="@drawable/circle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true" />

</RelativeLayout>
....

它工作完美,并给了我这个:截屏

问题是,由于各种原因,我必须以编程方式执行相同的操作。

我有这个代码:

RelativeLayout layout = (RelativeLayout) findViewById(R.id.circle_layout);

ShapeDrawable drawable = new ShapeDrawable(new OvalShape());
drawable.getPaint().setColor(Color.parseColor("#EEEEEE"));
drawable.getPaint().setStyle(Style.STROKE);
drawable.getPaint().setStrokeWidth(dpToPx(2));
drawable.getPaint().setAntiAlias(true);
drawable.setIntrinsicHeight(dpToPx(240));
drawable.setIntrinsicWidth(dpToPx(240));

ImageView iv = new ImageView(this);
iv.setImageDrawable(drawable);

RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT);
lp.addRule(RelativeLayout.CENTER_IN_PARENT);
iv.setLayoutParams(lp);

layout.addView(iv);

dpToPx 函数为:

private float scale = 0;

private float getScale() {
    if (scale == 0)
        scale  = this.getResources().getDisplayMetrics().densityDpi / 160f;
    return scale;
}

public float dpToPx(float dp) {
    return dp * getScale();
}

...这应该给我同样的东西吧?好吧,它给出了一个稍微大一点的圆圈,上面、右边、下面和左边的边缘都被剪掉了。这是一个屏幕截图(屏幕区域与前一个屏幕区域相同):截屏

有人知道什么以及为什么?

谢谢。

Edit:

如果我将描边宽度设置为更高的值(12dp),我会得到以下结果:截屏


我在此页面上找到了解决方案:http://www.betaful.com/2012/01/programmatic-shapes-in-android/

在 Android 中,当您使用笔划进行绘制时,它会在您所绘制的形状的边界处绘制笔划的中心。正如您所看到的,笔划被图像的边界裁剪掉。幸运的是,您可以在画布上执行转换。我们想要做的是将笔画形状转换为比边界稍小——并且有一个矩阵运算!

matrix.setRectToRect(new RectF(0, 0, canvas.getClipBounds().right, canvas.getClipBounds().bottom),
new RectF(strokeWidth/2, strokeWidth/2, canvas.getClipBounds().right - strokeWidth/2,
    canvas.getClipBounds().bottom - strokeWidth/2),
Matrix.ScaleToFit.FILL);

Edit

...更好、更简单的解决方案可以在链接的评论部分找到:

正如您在 Android 文档中看到的,资源中的形状 Drawable 实际上映射到 GradientDrawable,而不是 ShapeDrawable:

因此,我的以下代码可以完美运行:

GradientDrawable drawable = new GradientDrawable();
drawable.setColor(Color.TRANSPARENT);
drawable.setShape(GradientDrawable.OVAL);
drawable.setStroke((int)dpToPx(2), Color.parseColor("#EEEEEE"));
drawable.setSize((int)dpToPx(240), (int)dpToPx(240));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

以编程方式创建时椭圆形被剪裁 的相关文章

  • 在 Android 中动态填充年份的微调器?

    我一直在绞尽脑汁试图让它发挥作用 我想动态地将 1900 年到当前年份的年份输入到旋转器中 我认为使用 XML 定义的数组不可能做到这一点 但是我可以使用数组适配器来做到这一点吗 这是我到目前为止所拥有的 ArrayList
  • 如何检测android中的颠倒方向?

    在我的 Android 应用程序中 我有全景图像 并且我使用 TYPE ORIENTATION 传感器根据手机运动旋转该图像 它对于横向和纵向都工作良好 这是旋转逻辑的代码 Override public void onSensorChan
  • 任务“:app:checkReleaseDuplicateClasses”执行失败

    我的 React Native Android 构建中突然出现构建问题 令人惊讶的是 它是早上建好的 没有做任何改变 但突然就失败了 这就是我得到的错误 知道为什么会发生这种情况吗 在 stack 和 GitHub 中也看到了一些类似的问题
  • ActionBarCompat 支持库 android:selectableItemBackground 不起作用

    我正在使用新的 ActionBarCompat 支持库 操作栏中的操作按钮在按下时应更改其背景 它适用于 Android 4 3 但不适用于 Gingerbread 在姜饼中 如果我按下按钮 它不会改变背景 我什至改变了选择器 它再次适用于
  • 如何使用 (a)smack 在 Android 上保持 XMPP 连接稳定?

    我使用适用于 Android 的 asmack android 7 beem 库 我有一个后台服务正在运行 例如我的应用程序保持活动状态 但 XMPP 连接迟早会在没有任何通知的情况下消失 服务器表示客户端仍然在线 但没有发送或接收数据包
  • android - 过度绘制布局允许通过 LinearLayout 进行触摸

    在下面的 UI 中 我将下面的 drabable 覆盖了整个屏幕 LinearLayout 是透明的 并允许其下方的控件可单击或可触摸 基本上我可以滚动此 LinearLayout 下面的列表以及单击控件 我如何禁用它 See attach
  • Android,让文本切换器成为中心?

    如何集中我的文本切换器 我尝试过设置重力 但似乎不起作用 ts setFactory new ViewFactory public View makeView TextView t new TextView this t setTypefa
  • 如何从静态快捷方式启动活动的现有实例

    我的应用程序中有一个活动 MainActivity 并且有一个静态快捷方式 指向 TempActivity 由于静态快捷方式将始终设置 FLAG ACTIVITY NEW TASK 和 FLAG ACTIVITY CLEAR TASK 因此
  • NullPointerException org.chromium.android_webview.AwContents$AwViewMethodsImpl.onDragEvent

    大约 10 天前 我的应用程序开始记录此异常 在开发控制台上看到 java lang NullPointerException at org chromium android webview AwContents AwViewMethods
  • 如何知道点击的widget id?

    我已经实施了一个widget与ImageButton and a TextView That ImageButton启动一个activity当它被点击时 这activity使用用户在活动上写入的内容更新小部件文本EditText 现在的问题
  • 如何从debug.keystore文件获取MD5?

    我使用一些命令来获取 MD5 私钥debug keystore文件 但实际上我得到的是 SHA1 私钥而不是 MD5 我不知道如何获得MD5 这是我使用的命令 keytool list alias androiddebugkey keyst
  • Android - 内容值覆盖现有行

    我正在尝试使用插入值ContentValues 我已将 5 个值插入到 5 列中 运行应用程序后 我只有最后一组值的行ContentValues 前四组未插入 ContentValues cv new ContentValues cv pu
  • NoClassDefFoundError:com.google.firebase.FirebaseOptions

    我继续得到NoClassDefFoundError在我正在使用的其他测试设备 4 4 2 上 但在我的测试设备 Android 5 1 上运行良好 我尝试了用谷歌搜索的解决方案 但似乎没有任何效果 我正在使用 Firebase 实时数据库
  • UnsupportedOperationException:特权进程中不允许使用 WebView

    我在用android sharedUserId android uid system 在我的清单中获得一些不可避免的权利 从 HDMI 输入读取安卓盒子 http eweat manufacturer globalsources com s
  • MPAndroidChart:组合图表

    我在用MPAndroidChart 库 https github com PhilJay MPAndroidChart 我想用CombinedChart创建这样的图表 那可能吗 我尝试了一下 但似乎不起作用 因为 这些条目没有按我的预期工作
  • 找不到资源矢量绘图的异常

    我将在某些设备上运行我的应用程序 其崩溃日志如下 01 04 16 54 02 206 7466 7466 com lawnmowers E AndroidRuntime FATAL EXCEPTION main Process com l
  • 协程和 Firebase:如何实现类似 Javascript 的 Promise.all()

    在 Javascript 中 您可以同时启动两个 或更多 异步任务 等待它们完成 然后执行某些操作 继续 const firstReturn secondReturn await Promise all firstPromise secon
  • Java中如何限制文件大小

    我正在我的应用程序中创建一个文件 并继续向该文件中写入一些内容 但是当我的文件达到一定大小 比如说 100 行 后 我想删除第一行并将新行写入底部 要求是我的文件应该受到限制 但它应该保留我写入文件的最新内容 请告诉我在Java中是否可行
  • TYPE_ACCELEROMETER 和 TYPE_LINEAR_ACCELERATION 传感器有什么区别?

    I think TYPE ACCELEROMETER显示设备加速 但是 我不明白什么时候应该使用TYPE LINEAR ACCELERATION 我需要计算移动设备的速度 哪种传感器适合此应用 另外 我读到TYPE LINEAR ACCEL
  • Android 中带有无尽列表视图滚动的 AsyncTask

    我正在创建一个应用程序 其中我需要有无限的滚动列表视图 我不想在我的应用程序中使用任何库 我在网上看到了一些有助于实现此类列表视图的示例 但我的疑问是 当我的数据来自服务器并在异步任务中进行解析时 如何才能拥有无尽的列表视图 如何从滚动异步

随机推荐

  • 阻止用户在网站上多次投票

    我计划在我运行的网站上添加一些投票赞成 反对投票按钮 这看起来很简单 但我想阻止人们多次投票 一种解决方案是让他们在投票之前进行注册 但我不希望强迫他们注册 有没有一种相当简单的方法可以做到这一点 检查 IP 地址似乎不是一个好的解决方案
  • 使用 type() 手动创建新类时,子类 __module__ 设置为元类模块

    在下面的示例中 新创建的子类最终成为元类 module 而不是父类的模块 我只在使用时见过这种情况ABCMeta所以这可能是该模块特有的东西 有人知道会发生什么吗 In 1 from abc import ABCMeta In 2 clas
  • termios VMIN VTIME 和阻塞/非阻塞读取操作

    我正在尝试为 Linux 编写一个简单的 C 串行通信程序 我对阻塞 非阻塞读取和 VMIN VTIME 关系感到困惑 我的问题是 我是否应该根据是否有阻塞 非阻塞开放调用来设置 VMIN VTIME 例如 如果我有以下公开征集 open
  • 在 Google App Engine Python SDK 上使用 RSA 私钥对字符串进行签名

    是否有任何已知的方法可以在 Google App Engine Python SDK 上使用 RSA 私钥对纯文本字符串进行签名 gdata python 库中包含的 tlslite 库是一个不错的选择 http code google c
  • 更改 JPanel 及其所有元素的字体大小

    我正在尝试创建一个 Swing 面板 其元素的字体大小与 swing 应用程序的其余部分不同 最初 使用setFont对于几个组件来说没有造成任何问题 现在我有几个组件 及其所有子组件 所以这个解决方案是不切实际的 我搜索过有关更改 swi
  • .net 4.0 代码合同。什么时候使用?他们什么时候浪费时间了?

    我一直在研究 NET 4 0 代码契约 并在 stackoverflow 上查找与此相关的问题 我仍然从未遇到过任何使用代码契约的示例代码 这让我想知道 这真的有用吗 或者也许它是您的代码达到一定复杂性时唯一有用的一个 有人使用代码合约并且
  • 在 Wordpress 中处理序列化数据

    我在 WordPress 自定义字段中有以下序列化数据字符串 first string a 9 s 5 email s 13 email protected s 4 name s 15 Werner Etsebeth s 8 address
  • 无法从Listview的EditText获取值?

    我正在尝试从列表视图中的 EditText 获取数据 我看到了很多类似的问题并得到了solution 但它在我的实现中引发了 NPE 所以请指导我解决这个问题 Adapter public class Coscho adapter exte
  • Visual Studio Code - 可以对 python 进行实时 linting 吗?

    这里有同样的问题 但还没有任何答复 使用 VSCode 对 Python 进行实时 linting 我现在正在使用 VS code 市场上的 Python 扩展 经过大约一个小时的研究 我在 linter 中发现了以下选项 python l
  • 如何在 Eclipse 中将源附加到 Google Drive API 或“Android Private Library”

    我已经安装了驱动API使用Add Google APIs 菜单选项 当手动钻入下面的任何一个罐子时驱动API 源代码打开正常 但手动钻入同一个罐子下Android Private Libraries结果是 未找到源 所以使用时open De
  • 同名的变量和函数在块内返回错误

    如果我们声明一个变量和一个同名的函数 它接受重新声明 但是当我们在一个块内做同样的事情时 它显示重新声明错误 Code var x function x no error 但在这种情况下我收到错误 var inside re declara
  • Nightwatch 无法通过 css id 或类选择器定位元素

    我们使用 Nightwatch 来自动化一些 UI 测试 当前的一些测试相当脆弱 主要与奇怪的 CSS 选择器有关 我正在尝试简化它们 但我希望一些简单的 CSS 选择器能够工作 但事实并非如此 我试图找到这个深度嵌套的 a tag a c
  • Emacs 桌面不记得 TRAMP 连接?

    我使用 emacs 在多个不同的服务器上编辑脚本和代码文件 TRAMP 运行良好 然而 当我退出 emacs 时 我所有的流浪者连接都会消失 我尝试了桌面保存模式 但重新启动 emacs 时仅显示本地文件 是否有一些软件包可以记住流浪者连接
  • 字符串作为 R 中的因子

    在 R 中创建数据框时 字符串默认转换为因子 我不介意 但是 当我想在数据框中创建新行时 我找不到将字符串编码为因子的方法 如果我使用factor 字符串被转换为数字 但仍然不是一个因子 在任何一种情况下 我都无法将新行附加到数据框中 因为
  • jquery菜单悬停

    我有一个菜单 当我将鼠标悬停在 div 上时它会显示 当鼠标移出时它会淡出 问题是 如果您滚动菜单的任何子菜单 菜单就会消失 因为从技术上讲 如果您在其中一个子菜单上 那么您就没有在父菜单上 是否有一种方法可以使滚动子菜单不会消失算作鼠标移
  • 为什么Icecast2不想通过https给出流?

    在具有 Ubuntu 14 04 LTS 的服务器上安装了支持 SSL 的 Icecast2 2 4 1 也在该服务器上运行 HTTPS 网站 我想在页面上插入 HTML5 播放器 该播放器也将通过 SSL 获取流 否则 混合内容错误 该网
  • rgba() 的颜色 IE 后备不起作用

    为什么 IE 有以下后备color red 行不通 在IE7中 颜色是black而不是red 现场演示在这里 HTML div span Hello span div CSS div width 200px height 100px bac
  • 如何编写键盘快捷键以从选定的表中选择前 1000 个*?

    有没有办法在 ssms 2012 中创建键盘快捷键 按下时会产生与select top 1000 from mytable 我已经探索过这一点 http msdn microsoft com en us library ms174178 很
  • 定位服务在 iOS 11 中不工作

    我刚刚使用 iOS 11 SDK 重建了我的应用程序 试图删除blue banner现在总是出现 我想 太棒了 这有效 却发现定位服务现在根本不起作用 该应用程序曾经在 iOS 10 上运行 有人听说过什么吗 看来苹果又增加了一项隐私功能
  • 以编程方式创建时椭圆形被剪裁

    我有一个剪辑问题 首先 我尝试仅使用 Xml 显示椭圆形 我有以下代码 res drawable circle xml