形状可绘制尺寸不起作用
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 的高度和宽度。 这很简单。对我来说,将项目的重力设置为“中心”解决了这个问题。 例如:
<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 属性确实意味着一个比例。您应该为图层列表中的所有形状设置大小,并且在缩放时将其用作比例 - 就像LinearLayout
的layout_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 的起点。不是这种情况。将其视为顶部,底部,右侧,左侧。 <item android:top="10dp">
仍然会为您提供距离顶部 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中。然后设置你的视图背景。
【讨论】:
以上是关于形状可绘制尺寸不起作用的主要内容,如果未能解决你的问题,请参考以下文章
windowbackground 在深色和浅色主题中不起作用
可绘制的 setAlpha 在 android 4.4.2 上不起作用