如何在 xml 中的可绘制对象上获得重力“底部”
Posted
技术标签:
【中文标题】如何在 xml 中的可绘制对象上获得重力“底部”【英文标题】:How to get gravity 'bottom' working on a drawable in xml 【发布时间】:2012-02-08 20:23:23 【问题描述】:我有一个简单的目标。我想在我的 FrameLayout 上有一个浅灰色的背景,在它下面有一条黑色的分界线(只在下面,而不是在四周)。到目前为止,我有这个:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle" android:gravity="center">
<solid android:color="#EEEEEE" />
</shape>
</item>
<item>
<shape android:shape="line" android:gravity="bottom" >
<stroke android: android:color="#010101"/>
</shape>
</item>
</layer-list>
但它通过中心画线,即忽略重力='底部'位。我该如何解决这个问题?
编辑:这个问题非常老了。选择的答案可能与当前的 API 等一致,也可能不一致。我们鼓励您提出自己的问题,而不是添加到不再受监控的问题中。
【问题讨论】:
【参考方案1】:我也为此苦苦挣扎。基本上,要在底部创建边框,您必须从与预期相反的方向思考。你从一个带有边框颜色的矩形开始。最重要的是,您绘制实际颜色,并从底部偏移。 我用这个:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<!-- CREATE A RECTANGLE WITH YOUR BORDER COLOR -->
<item>
<shape android:shape="rectangle" >
<solid android:color="#fff"/>
</shape>
</item>
<!-- NOW DEFINE THE NORMAL COLOR-->
<item android:bottom="BOTTOM_BORDER_THICKNESS E.G. 4dp">
<shape android:shape="rectangle" >
<solid android:color="#ccc"/>
</shape>
</item>
</layer-list>
或者,正如Juan Pablo Saraceno 建议的那样:
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item>
<color android:color="YOUR_BORDER_COLOR" />
</item>
<item android:top="YOUR_BORDER_THICKNESS">
<color android:color="YOUR_BG_COLOR" />
</item>
</layer-list>
【讨论】:
这是一个非常好的答案,值得更好地定位恕我直言。我认为android不以正确的方式支持重力并强迫人们这样做有点遗憾。即使使用不幸的是,我还没有找到一种方法让重力适用于可绘制对象,但我发现了如何使用纯 xml 实现你想要的:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:top="-2dp"
android:left="-2dp"
android:right="0dp"
android:bottom="1dp"
>
<shape android:shape="rectangle">
<solid android:color="#EEEEEE"/>
<stroke android: android:color="#010101"/>
</shape>
</item>
</layer-list>
祝你好运:)
【讨论】:
我建议为此使用九个补丁图像 - 这是一个应该完成这项工作的示例:
(它只是很小,但它就在那里!) 如果你把它放在你的drawable文件夹中并将你的FrameLayout的背景设置为它,那么你应该得到想要的结果。内容将进入灰色区域,#010101 像素将被水平拉伸以在底部形成一条线。只需确保保留 .9.png 扩展名,以确保它作为九个补丁加载。
希望对你有帮助
【讨论】:
这很好,我可以那样做。事实上,我会,但我仍然有兴趣知道 hot 以使重力标签适用于该行 - 对我来说似乎是更好的解决方案,但感谢您的建议。 没有提到重力标签here。我看不到使用纯 xml 实现此目的的任何方法,您可以在代码中创建 ShapeDrawable 并根据布局的边界设置其边界?【参考方案4】:这行得通!
<item>
<bitmap
android:gravity="left|bottom"
android:src="@drawable/myDrawable" />
</item>
【讨论】:
不,它不适用于 ShapeDrawable,因为它是可绘制的,而不是位图。【参考方案5】:我知道这是一个很老的问题,但给出的答案对我不起作用。事实证明,为了让重力属性起作用,您只需要在可绘制项目中添加尺寸标签。
所以以下将按预期工作:
<?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="rectangle">
<solid android:color="#EEEEEE" />
</shape>
</item>
<item
android:gravity="bottom">
<shape android:shape="line">
<size android:/>
<stroke android: android:color="#010101"/>
</shape>
</item>
</layer-list>
ps。此功能在 api 级别 23 中添加 https://developer.android.com/reference/android/graphics/drawable/LayerDrawable#setLayerGravity%28int,%20int%29
【讨论】:
【参考方案6】:<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item>
<shape android:shape="rectangle" >
<solid android:color="@color/Black" />
</shape>
</item>
<item android:bottom="5dp">
<shape android:shape="rectangle" >
<solid android:color="@color/White" />
</shape>
</item>
</layer-list>
【讨论】:
【参考方案7】:嗯,这是一个很老的问题,但似乎没有一个答案能回答实际问题(如何使gravity
工作)所以这里有一个工作示例:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<color android:color="#2196F3"/> <!-- Background color -->
</item>
<item android:gravity="bottom">
<shape>
<size android: /> <!-- I would suggest 1dp -->
<solid android:color="#F50057" /> <!-- Line color -->
</shape>
</item>
</layer-list>
以此类推,如果要使用重力left
或right
将属性height
更改为width
【讨论】:
这个解决方案就像一个魅力,因为使用“放置一个矩形覆盖另一个矩形的笔划”解决方案有时会在文本框右侧留下一个微小的 1 像素边框。跨度> 不适用于 API 21。底线刚刚被拉伸到全高 刚刚在 API 22 上测试过,但它不起作用。不过在 Android Studio 预览面板中看起来不错。以上是关于如何在 xml 中的可绘制对象上获得重力“底部”的主要内容,如果未能解决你的问题,请参考以下文章