开放式Android笔画?


93

是否可以创建仅在某些侧面具有笔触的Android形状对象?

例如,我有:

<stroke 
 android:width="3dip" 
 android:color="#000000"
    android:dashWidth="10dip" 
    android:dashGap="6dip" />

类似于以下CSS:

border: 3px dashed black;

如何仅在一侧设置行程?这就是我在CSS中的做法:

border-left: 3px dashed black;

您如何在Android XML中做到这一点?

Answers:


126

我用这个实现了一个很好的解决方案:

<?xml version="1.0" encoding="utf-8"?>

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- This is the line -->
    <item android:top="-1dp" android:right="-1dp" android:left="-1dp">
      <shape>
            <solid android:color="@android:color/transparent" />
            <stroke android:width="1dp" android:color="#ffffff" />
      </shape>
    </item>

</layer-list>

如果您需要透明的背景,但仍需要开放的笔触颜色(在我的情况下,我只需要底线),则此方法效果很好。如果您需要背景色,则可以像Maragues答案中那样添加纯色。

编辑1

有时,对于高密度设备,使用低倾角值可能会导致非常细的或不可见的笔触或距离。设置ListView分隔符时,也会发生这种情况。

最简单的解决方法是使用1px而不是1dp的距离。这将使线在所有密度下始终可见。最好的解决方案是为每个密度创建尺寸资源,以获得每个设备的最佳尺寸。

编辑2

有趣,但是我尝试在6年后使用它,但在Lollipop设备上无法获得良好的结果。

当前的解决方案可能是使用9补丁。一直以来,Android都应该为这个问题提供一个简单的解决方案。


这对我也有用,但是我不知道为什么我必须使用-2dp而不是-1dp。如果使用后者,我仍然可以看到一条细线。
Edu Zamora

1
@EduZamora是的,似乎对于高密度设备-1dp不能按预期工作
htafoya 2012年

我也正在四面八方边框,但不是仅底部边框。
Cheok Yan Cheng 2012年

@YanChengCHEOK尝试使用1px而不是1dp。
htafoya

@htafoya,这是一个绝妙的解决方案。谢谢!
abriggs 2013年

52

我知道这个问题是很久以前发布的,因此发布该问题的人不会使用该答案,但它可能仍然会对其他人有所帮助。

 <?xml version="1.0" encoding="UTF-8"?>
    <!-- inset is used to remove border from top, it can remove border from any other side-->
    <inset xmlns:android="http://schemas.android.com/apk/res/android"
        android:insetTop="-2dp"
        >
    <shape xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/rectangle">
        <stroke android:width="1dp" android:color="#b7b7b7" />
        <corners android:bottomRightRadius="5dp"  android:bottomLeftRadius="5dp"/>

        <solid android:color="#454444"/>
    </shape>
    </inset>

使用inset标记,并为要删除的侧边框提供一个负值。

可能的值为:

android:insetTop="-1dp" android:insetBottom="-1dp" android:insetLeft="-1dp" android:insetRight="-1dp"


是的,不要做我做的事情,然后尝试将插入的attr放在stroke标签中,而不阅读其余答案!(感谢BTW OP的回答。完美的解决方案)
Kiran

优雅!我喜欢这个解决方案
豪气

41

我通过使用列表层解决了这一问题,将两个形状组合在一起,其中一个形状的高度为1dp,位于底部

optionscreen_bottomrectangle.xml:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- This is the line -->
<item>
      <shape>
            <solid android:color="#535353" />
      </shape>
</item>
<!-- This is the main color -->
<item android:bottom="1dp">
     <shape>
           <solid android:color="#252525" />
     </shape>
</item>
</layer-list>

然后,在layout / main.xml文件中

<TextView
    android:id="@+id/bottom_rectangle"
    android:background="@drawable/optionscreen_bottomrectangle"
    android:layout_width="fill_parent"
    android:layout_height="0dp"
    android:layout_below="@id/table_options"
    android:layout_above="@id/exit_bar"/>

这用背景填充了table_options和exit_bar之间的间隙,并且在exit_bar即将打印1dp行之前。这对我来说是成功的诀窍,希望对其他人有所帮助。

已编辑答案,以正确的顺序放置图层。亚历克斯!


如果您真的想自己回答,不发布答案可能很方便。当其他开发人员看到已经有答案时(虽然在这种情况下实际上不是答案),他们并不愿意回答。
MrSnowflake

31

另一种方法是使用padding处理其他响应。这个小片段在顶部和底部形成边框。

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- This is the line -->
    <item>
          <shape>
                <padding android:left="0dp" android:top="1dp" android:right="0dp" android:bottom="1dp"/>
                <solid android:color="#898989" />
          </shape>
    </item>
    <!-- This is the main color -->
    <item>
         <shape>
             <solid android:color="#ffffff" />
         </shape>
    </item>
</layer-list>

4
如果您需要圆角,这是迄今为止最好的答案。
MacKinley Smith 2014年

这也极大地帮助了我。请尝试一下并投票
男孩

@ug_我认为这是最好的方法。完美运行,谢谢
Lalit Sharma 2015年

作品。在Android Studio(v1.1)预览窗格中看起来完全不对,但是在设备上就可以了。
MuratÖgat2015年

26

@Maragues的答案是向后的,因为层列表可绘制对象从上到下绘制(意味着列表中的最后一个项目绘制在顶部):

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- This is the line -->
<item>
      <shape>
            <solid android:color="#535353" />
      </shape>
</item>
<!-- This is the main color -->
<item android:bottom="1dp">
     <shape>
           <solid android:color="#252525" />
     </shape>
</item>

</layer-list>

这将有效地用线条颜色填充形状,然后在其顶部绘制背景颜色,使最后的1dp清晰可见,以使线条颜色显示出来。


2
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >


<item>
    <shape android:shape="rectangle" >
        <stroke  android:width="2dp"
                 android:color="#BBBBBB" />
        <solid android:color="@android:color/transparent" />
    </shape>
</item>
<item  android:bottom="2dp" >
    <shape android:shape="rectangle" >
        <stroke  android:width="2dp"
                 android:color="@color/main_background_color" />
        <solid android:color="@android:color/transparent" />
    </shape>
</item>


2

我使用了以下代码。

<?xml version="1.0" encoding="UTF-8"?>
<!-- inset is used to remove border from top, it can remove border from any other side-->
<inset xmlns:android="http://schemas.android.com/apk/res/android"
    android:insetTop="-2dp" android:insetLeft="-2dp" android:insetRight="-2dp"
    >
    <shape xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/rectangle">
        <stroke android:width="1dp" android:color="@color/colorPrimary" />
        <solid android:color="#0000"/>
        <padding android:left="2dp" android:top="2dp" android:bottom="2dp" android:right="2dp"/>
    </shape>
</inset>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.