6

我尝试使用 XML layer-list drawable 创建一个简单的插图。
我有两个形状,一个圆形和一个矩形,
我想要一个不缩放的圆形。
以下是布局:

<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 的实现。似乎在幕后从项目属性创建了一个插图。所以我想通过计算那些我可以达到的结果,我想要。这是唯一的方法吗?

更新:

根据这个答案,我知道操纵项目的 android:top、android:left 等,我可以创建一个虚拟插图,它可以根据需要缩放我的“形状”。我检查了这个,它是正确的。所以这是一种解决方法。然而,我对它的反直觉感到非常失望。我仍然希望有人能指出一种禁用缩放的简单方法。

更新:根据这个 Google Android 文档页面,设置 ImageView scaleType 应该可以防止缩放。显然在我的情况下它不起作用。缺了点什么。

4

3 回答 3

7

给你的圆drawable相同的高度和宽度,如下所示:

<?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 将是您在参数等中指定的高度和宽度...

于 2014-09-22T10:02:15.400 回答
0

将您的shapedrawable放入layer-list并放入android:gravity="center"标签item。例如,我有几个TextViews LinearLayout,它们的大小由 决定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>
于 2019-05-29T10:13:06.177 回答
-2

只需放入android:gravity="center"项目标签

于 2016-11-21T10:03:33.620 回答