形状可绘制尺寸不起作用

Posted

技术标签:

【中文标题】形状可绘制尺寸不起作用【英文标题】:Shape Drawable Size not working 【发布时间】:2012-05-13 03:40:45 【问题描述】:

我有一个非常简单的形状,我想设置它的宽度:

<shape android:shape="rectangle">
    <solid android:color="@color/orange"/>
    <size android:/>
</shape>

但是,当我将它分配给 EditText 的背景时,它只显示橙色背景,而不是宽度为 2dp 的矩形。为什么设置大小不起作用?我想在左侧创建一个带有橙色矩形的透明可绘制对象。我也把这个包裹在一个选择器中:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_focused="true">
        <shape android:shape="rectangle">
            <solid android:color="@color/orange"/>
            <size android: android:/>
        </shape>
    </item>
    <item>
        <shape android:shape="rectangle">
            <solid android:color="@android:color/transparent"/>
        </shape>
    </item>
</selector>

我尝试添加高度只是为了看看它是否会改变大小。它没有。这就像它完全忽略了大小。什么鬼?

【问题讨论】:

它怎么不适合你?它就像一个魅力。也许问题出在您的布局设置中?看看你的 Layout 是否有 wrap_content 的高度和宽度。 这很简单。 被忽略,并且总是会创建一个填充视图的形状。 并非总是如此,当然不是 drawableTop/Bottom/etc 属性。 @Daler 你在说什么只是忽略了大小并填充了视图。你应该测试过它。与布局设置无关。 【参考方案1】:

对我来说,将项目的重力设置为“中心”解决了这个问题。 例如:

<item android:id="@android:id/progress" android:gravity="center">
    <clip>
        <shape>
            <size android:/>
            <solid android:color="@color/my_color"/>
        </shape>
    </clip>
</item>

【讨论】:

最有帮助的答案。非常感谢! 为这家伙加冕!【参考方案2】:

它可以与foreground 一起使用。似乎您无法设置背景的重力。但是你可以在前台。我检查了 API 21、23 和 24(嗯,使用 Studio 设计预览),然后在 ImageView 上放置了一个实心圆点。

<shape android:shape="oval" xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@color/colorPrimary" />
    <size android: android: />
</shape>

用布局sn-p

    <ImageView
            android:foreground="@drawable/list_new_dot"
            android:foregroundGravity="right|center_vertical"
            tools:src="@drawable/model_1_sm"
            />

更新:虽然它在布局设计工具中似乎可以工作,但在模拟器中看起来却不一样。 更新 2:由于此答案有几票,您可能需要检查我实际使用的内容以显示新的指示点: https://gist.github.com/CapnSpellcheck/4d4638aefd085c703b9d990a21ddc1eb

【讨论】:

【参考方案3】:

只是为了指定user983447的答案- size 属性确实意味着一个比例。您应该为图层列表中的所有形状设置大小,并且在缩放时将其用作比例 - 就像LinearLayoutlayout_weight 属性一样。所以最好不要命名为size,而是命名为weight

以下是如何在不使用size 属性的情况下实现顶部和底部白线的解决方法:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape>
            <solid android:color="#fff" />
        </shape>
    </item>
    <item android:top="1dp" android:bottom="1dp">
        <shape>
            <solid android:color="#888" />
        </shape>
    </item>
</layer-list>

【讨论】:

这会因为 gpu 过度绘制而导致性能不佳(当您只需要两行像素时,两个形状会填充所有像素) @Gilian 如果我错了,请纠正我,但是这个 xml 会通过 aapt 编译成 Drawable 的某个子类,所以编译完成后它只是一个 java 类,性能将与从 gpu 的角度来看,对于任何 9-patch 或位图。因此,如果设计需要它,那就没有办法了【参考方案4】:

由于以下原因,我第一次使用 Androider 时发现 layer-list 非常狡猾。乍一看,大多数人会认为项目的顶部、底部、右侧、左侧属性是来自顶部、底部、右侧、左侧。其中值如下:

<item android:top="10dp">

是否会为您提供一个距相应容器顶部 10dp 的起点。不是这种情况。将其视为顶部,底部,右侧,左侧。 &lt;item android:top="10dp"&gt; 仍然会为您提供距离顶部 10dp 的起点,但是当您想要设置底部时会发生什么?

<item android:bottom="20dp">

这不会让您在距离 TOP 20dp 的底部,而是在距离容器底部 20dp 的底部。

因此,例如对于 100dp 的容器,如果您想要一个顶部边缘从 20dp 开始,底部边缘从 40dp 开始的矩形:

<item android:top="20" android:bottom="60dp">

【讨论】:

当我发布这个问题时,我实际上明白了。将所有值(即上、左、下、右)全部设为上、左相对没有什么意义,因为在不知道容器大小的情况下,您永远无法定义扩展以匹配其父容器的形状。在这种特殊情况下,我的形状需要固定大小,因此我想使用宽度/高度来设置尺寸,但文档没有解释宽度/高度的坐标系,所以你只能猜测。 谢谢,这是一个很好的解释!让我明白我错在哪里,并在几个小时后终于解决了这个问题!但是为你竖起大拇指! +1【参考方案5】:

我也有类似的问题。

文档 (http://developer.android.com/guide/topics/resources/drawable-resource.html#Shape) 说:

形状的大小。 (...)

注意:默认情况下,形状缩放到容器视图的大小,与此处定义的尺寸成比例。在 ImageView 中使用形状时,可以通过将 android:scaleType 设置为“center”来限制缩放。

如果我理解正确的话,这意味着“size”标签不是用来设置大小而是用来设置比例的。

【讨论】:

所以它说宽度/高​​度是整数,但是您发布的内容听起来可能是百分比(0..1)还是与容器的尺寸(0..view.width)一样大? !或者你说它是有道理的,你知道它是如何工作的,并且可以比文档更好地解释它?我不完全明白你的意思。无论哪种方式,它都可能需要一个错误来清理极其可怕的文档或修复代码,使其实际上是宽度和高度。【参考方案6】:

shape 的 size 属性将提供 drawable.getIntrinsicWidth 和 getIntrinsicHeight 的值。

如果drawable的容器(例如ImageView,TextView)有布局参数WRAP_CONTENT,那么如果drawable的drawingState改变,容器尺寸也会改变。

但是Android框架在ImageView的drawingState实现中存在一个bug

ImageView 仅通过 state_selected 上的可绘制尺寸更新/调整其尺寸,但不在 state_activated 上

【讨论】:

【参考方案7】:

当您将其用作View 的背景时,将忽略形状的大小。当您通过ImageView 显示它时,它将起作用:

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <solid android:color="#FF7700" />
    <size android: android:/>
</shape>

在您的布局 XML 中:

<!-- will have the size of 20dp x 20dp -->
<ImageView
    android:layout_
    android:layout_
    android:src="@drawable/my_shape"
    />

【讨论】:

【参考方案8】:

用过这个。

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >

<stroke
    android:color="@color/lgray"
    android: />

<corners
    android:bottomLeftRadius="0dip"
    android:bottomRightRadius="0.1dip"
    android:topLeftRadius="0dip"
    android:topRightRadius="0.1dip" />

<solid android:color="@color/White" />

</shape>

把这个rectangle.xml放到drawable中。然后设置你的视图背景。

【讨论】:

以上是关于形状可绘制尺寸不起作用的主要内容,如果未能解决你的问题,请参考以下文章

填充在 ImageButton 上不起作用

windowbackground 在深色和浅色主题中不起作用

可绘制的 setAlpha 在 android 4.4.2 上不起作用

LayerDrawable 作为背景可绘制在 minSdkVersion=15 或更低时不起作用

使用选择器作为颜色的形状不起作用

形状虚线,破折号不起作用