【问题标题】:How to get gravity 'bottom' working on a drawable in xml如何在 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:width="1dip" android:color="#010101"/>
        </shape>
    </item>
</layer-list>

但它通过中心画线,即忽略重力='底部'位。我该如何解决这个问题?

编辑:这个问题非常老了。选择的答案可能与当前的 API 等一致,也可能不一致。我们鼓励您提出自己的问题,而不是添加到不再受监控的问题中。

【问题讨论】:

    标签: android xml drawable


    【解决方案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:width="1dp" 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:height="2dp"/>
                <stroke android:width="1dip" 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:height="10dp" />      <!-- I would suggest 1dp -->
                    <solid android:color="#F50057" />   <!-- Line color -->
                </shape>
            </item>
        </layer-list>
        

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

        【讨论】:

        • 这个解决方案就像一个魅力,因为使用“放置一个矩形覆盖另一个矩形的笔划”解决方案有时会在文本框右侧留下一个微小的 1 像素边框。跨度>
        • 不适用于 API 21。底线刚刚被拉伸到全高
        • 刚刚在 API 22 上测试过,但它不起作用。不过在 Android Studio 预览面板中看起来不错。
        猜你喜欢
        • 2015-04-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多