如何防止android层可绘制形状(例如圆形)缩放
Posted
技术标签:
【中文标题】如何防止android层可绘制形状(例如圆形)缩放【英文标题】:How to prevent android layer drawable shapes (e.g. circle) from scaling 【发布时间】:2014-05-11 04:07:44 【问题描述】:我尝试使用 XML layer-list drawable 创建一个简单的插图。 我有两个形状,一个圆形和一个矩形 我想要一个不按比例缩放的圆圈。 以下是布局:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_
android:layout_
>
<ImageView
android:layout_margin="10dp"
android:layout_
android:layout_
android:src="@drawable/shape5"
android:layout_gravity="center"
android:scaleType="center"
/>
</LinearLayout>
这是 shape5.xml 可绘制对象
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:top="0dp" android:left="0dp">
<shape android:shape="rectangle" android:scaleType="center">
<stroke android: android:color="@android:color/holo_red_light" />
<size android: android:/>
</shape>
</item>
<item android:top="10dp" android:left="10dp">
<shape android:shape="oval" android:gravity="center" android:scaleType="center" >
<stroke android: android:color="@android:color/holo_blue_light" />
<corners android:radius="10dp" />
<size android: android:/>
</shape>
</item>
</layer-list>
生成的绘图如下所示:
很明显,项目 android:top 完成了这项工作,但没有什么能阻止形状缩放。 size width 不起作用,android:scaleType="center" 也不起作用。
我快速查看了 LayerDrawable.java 的实现。似乎在幕后从项目属性创建了一个插图。所以我想通过计算那些我可以达到的结果,我想要。这是唯一的方法吗?
更新:
根据answer,我知道操纵项目的 android:top、android:left 等,我可以创建一个虚拟插图,它可以根据需要缩放我的“形状”。 我检查了这个,它是正确的。所以这是一种解决方法。然而,我对它的反直觉感到非常失望。我仍然希望有人能指出一种禁用缩放的简单方法。
更新: 根据this Google Android documentation page,设置 ImageView scaleType 应该可以防止缩放。显然在我的情况下它不起作用。有些东西不见了。
【问题讨论】:
保持正方形... width=height. Vyger,不确定你的意思。请详细说明 形状容器是一个矩形。正方形是长方形的一个例外,长方形的宽度和高度相等。因此,当 w/h 比为 1 时,内接圆(或其他形状)将保持正方形。 Vyger,如果我想画一个矩形并在它的一侧画一个完美的圆(不是椭圆,它是一个拉伸的圆)怎么办。在你看来,我该怎么做?示例代码会很好 那么我会使用 2 个单独的东西。这看起来像一个 - 我们不会告诉任何人。你做一个“正方形”,里面有一个圆圈,没有边界。然后将此 drawable 作为复合 Drawable 放入 TextView 中(最佳实践!)。 textView 有一个背景,它又是一个 9 补丁(因此它与 TextView 的大小完美地拉伸)作为它的边框。所以,完成了。您可以将可绘制的圆圈放在 TextView 的内侧之一上,并在其周围有一个带有彩色边框的矩形。你也可以有一些文本(如果是这样的话)并让它对点击做出反应——就像一个按钮。 【参考方案1】:像这样为你的可绘制圆圈提供相同的高度和宽度:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval" >
<solid
android:color="@color/grey" />
<size
android:
android:/>
</shape>
你输入的高度和宽度的值并不重要,重要的是高度 = 宽度。将它们视为纵横比,您想要一个完美圆形的比例,即 1:1。
您不必担心确切值的原因是因为可绘制对象将通过 scaleType 属性进行缩放。
将可绘制对象插入 ImageView 后,您可以设置 scaleType 来缩放它:
scaleType = fitCenter -> Drawable 将与 ImageView 的大小相同,但会保持一个完美的圆形! scaleType = centerInside -> Drawable 将是您在参数中指定的高度和宽度 等等……
【讨论】:
他不能接受你的回答,因为它没有回答最初的问题。如您所见,问题是要保持圆的比例,而这个圆是其中一层。他得到一个矩形作为一层,椭圆形作为另一层。在这种情况下,设置椭圆的大小将不起作用。 公平地说,我认为这不可能通过可绘制图层中的 xml 实现 嗯,有可能 您基本上给出了与我相同的答案,指定图层列表的大小与我描述的完全相同,我看不出我们的答案有何不同.. 给出纵横比对于图层列表中的一项是不可能的 afaik【参考方案2】:将您的shape
drawable 放入layer-list
并将android:gravity="center"
放入item
标记中。比如我在LinearLayout
中有几个TextView
s,它们的大小是由weight
决定的,所以这些视图不是完美的正方形。
在TextView
我定义background
: android:background="@drawable/button_selector"
选择器定义如下:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="@drawable/btn_pressed" />
<item android:state_pressed="false" android:drawable="@android:color/transparent"/>
</selector>
可绘制:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:gravity="center">
<shape
android:shape="oval">
<stroke
android:
android:color="@color/dodger_blue"/>
<size
android:
android:/>
</shape>
</item>
</layer-list>
【讨论】:
【参考方案3】:只需将android:gravity="center"
放入项目标签
【讨论】:
以上是关于如何防止android层可绘制形状(例如圆形)缩放的主要内容,如果未能解决你的问题,请参考以下文章