如何防止 Android 图层可绘制形状(例如圆形)缩放

6

我尝试使用XML图层列表绘制来创建一个简单的插图。
我有两个形状,一个圆和一个矩形。
我希望圆形不会缩放。
以下是布局:

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>

    <ImageView
        android:layout_margin="10dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        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:width="2dp" android:color="@android:color/holo_red_light" />
            <size android:width="200dp" android:height="100dp"/>
        </shape>
    </item>

    <item android:top="10dp" android:left="10dp">
        <shape android:shape="oval" android:gravity="center" android:scaleType="center" >
            <stroke android:width="2dp" android:color="@android:color/holo_blue_light" />
            <corners android:radius="10dp" />
            <size android:width="20dp" android:height="20dp"/>

        </shape>
    </item>
</layer-list>

生成的图形如下:

渲染活动的截图

很明显,android:top属性起了作用,但是并没有阻止图片缩放。size width也没有起作用,android:scaleType="center"也没有用。我快速查看了LayerDrawable.java的实现方式。在幕后,似乎通过属性项来创建一个插入线。所以我想通过计算这些属性项就可以达到我想要的结果。这是唯一的方法吗?
更新:
根据这个答案,我知道通过操作item的android:top、android:left等属性,我可以创建一个虚拟插入线,将我的“形状”按照我想要的比例进行缩放。我检查了一下,是正确的。所以这是一个变通方法。然而,我对它有多么不直观感到非常失望。我仍然希望有人能指点我一个简单的方法来禁用缩放。
更新: 根据Google Android文档页面上的说明,设置ImageView scaleType应该可以防止缩放。但是,在我的情况下,它似乎没有起作用。还有什么遗漏的吗?

保持正方形... 宽度=高度 - Phantômaxx
Vyger,不确定您的意思。请详细说明。 - Michael Kariv
形状容器是一个矩形。正方形是矩形的一种例外,其中宽度和高度相等。因此,当宽高比为1时,内接圆(或其他形状)将保持正方形的外观。 - Phantômaxx
Vyger,如果我想画一个矩形,在其中一侧画一个完美的圆(不是椭圆,椭圆是拉伸的圆),你认为该怎么做?最好附上代码示例。 - Michael Kariv
我会使用两个分开的元素。它们看起来像一个 - 我们不告诉任何人。你可以制作一个“正方形”,其中包含一个没有边框的圆形。然后将此可绘制对象作为复合可绘制对象放置在TextView中(最佳实践!)。 TextView具有背景,其本身是9 patch(因此它与TextView的大小完美地拉伸),作为其边框。所以,完成了。您可以将圆形可绘制对象放置在TextView的内部之一,并在其周围拥有带颜色边框的矩形。如果需要,您还可以添加一些文本,并使其对单击做出反应 - 就像按钮一样。 - Phantômaxx
3个回答

7

将您的圆形可绘制对象的高度和宽度设置为相同,如下所示:

<?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:width="16dp"
      android:height="16dp"/>
</shape>

您输入的高度和宽度值并不是非常重要,重要的是高度=宽度。将它们视为纵横比例,您希望获得一个完美圆形的比例,即1:1。
您无需担心确切的值,因为可绘制对象将通过scaleType属性进行缩放。
一旦将可绘制对象插入到ImageView中,您就可以设置scaleType来进行缩放:
scaleType = fitCenter -> Drawable将与ImageView相同大小,但仍保持完美的圆形! scaleType = centerInside -> Drawable将是您在参数中指定的高度和宽度 等等...

他不应该接受你的答案,因为它没有回答最初的问题。正如你所看到的,问题是要保持圆形的比例,而这个圆形是其中的一层。他得到了一个矩形作为一层,椭圆形作为另一层。在这种情况下,设置椭圆形的大小将毫无作用。 - Leo DroidCoder
说实话,我认为通过XML在图层可绘制中实现这一点是不可能的。 - A. Steenbergen
好的,这是可能的。 - Leo DroidCoder
你基本上给出了和我一样的答案,指定层列表的大小与我描述的完全相同,我不明白我们的答案有什么不同。据我所知,在层列表中为一个项目提供纵横比是不可能的。 - A. Steenbergen

0
将您的shape可绘制对象放入layer-list中,并在item标签中添加android:gravity="center"。例如,我在LinearLayout中有几个TextView,它们的大小由weight确定,因此这些视图不是完美的正方形。
TextView中,我定义了backgroundandroid: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:width="@dimen/mat2"
                android:color="@color/dodger_blue"/>
        <size
                android:width="@dimen/mat70"
                android:height="@dimen/mat70"/>
    </shape>
</item>
</layer-list>

-2

只需将android:gravity="center"放入item标签中即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接