如何在 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不以正确的方式支持重力并强迫人们这样做有点遗憾。即使使用 标签而不是矩形、形状,它也对我有用,所以更简单。 schemas.android.com/apk/res/android" > 唯一的问题是我产生了过度绘制,因为你正在用你的边框颜色绘制一个完整的矩形,只是为了用实际的矩形过度绘制它。没有真正的重力仍然是 9-patch 获胜。 如果您需要半透明的顶部和实心的底部,这将不起作用。所以我想我将必须使用九个补丁?【参考方案2】:

不幸的是,我还没有找到一种方法让重力适用于可绘制对象,但我发现了如何使用纯 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>

祝你好运:)

【讨论】:

【参考方案3】:

我建议为此使用九个补丁图像 - 这是一个应该完成这项工作的示例:

(它只是很小,但它就在那里!) 如果你把它放在你的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>

以此类推,如果要使用重力leftright 将属性height 更改为width

【讨论】:

这个解决方案就像一个魅力,因为使用“放置一个矩形覆盖另一个矩形的笔划”解决方案有时会在文本框右侧留下一个微小的 1 像素边框。跨度> 不适用于 API 21。底线刚刚被拉伸到全高 刚刚在 API 22 上测试过,但它不起作用。不过在 Android Studio 预览面板中看起来不错。

以上是关于如何在 xml 中的可绘制对象上获得重力“底部”的主要内容,如果未能解决你的问题,请参考以下文章

如何在代码中获取 attr 引用?

如何使用xml中的可绘制形状绘制半椭圆形(Android)

无法解析属性“src”中的可绘制对象

聚焦时如何隐藏edittext的线条颜色

如何为我在 Android 中用作背景的可绘制对象添加圆角?

是否可以在 Android 的可绘制对象中使用子文件夹? [复制]