如何防止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】:

将您的shapedrawable 放入layer-list 并将android:gravity="center" 放入item 标记中。比如我在LinearLayout中有几个TextViews,它们的大小是由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层可绘制形状(例如圆形)缩放的主要内容,如果未能解决你的问题,请参考以下文章

如何使用xml中的可绘制形状绘制半椭圆形(Android)

如何在Android中获得圆形[重复]

如何在 Google Maps Android SDK 的折线上添加形状

Android:图层可绘制丢失信息

如何更改选项卡布局中所选选项卡的形状?

如何在 iOS Swift4 中创建这个圆形?