2010-03-11 20 views
76

是否有可能創建一個只有某些邊有筆畫的Android形狀對象?開放式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中做到這一點?

回答

37

我解決了這個通過使用列表層,結合兩種形狀,其中一個放置在底部

optionscreen_bottomrectangle.xml高度1DP的:

<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> 

然後,在佈局/主.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打印1DP前行exit_bar。這對我來說是訣竅,我希望它能幫助別人。

回答編輯按照正確的順序放置圖層。 Thx亞歷克斯!

+0

如果您真的想親自回答問題,如果您不想發佈答案,可能會非常方便。當其他開發者看到已經有一個答案的時候(在這種情況下它實際上並不是),他們並不傾向於回答。 – MrSnowflake 2010-03-30 16:35:33

+0

我用有用的信息編輯了答案。 – Maragues 2010-03-31 08:13:07

25

@ 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以顯示線條顏色。

109

我實現了這一個很好的解決方案:

<?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的答案。

EDIT 1

有時,對於高密度的設備,其使用低傾角值在非常薄的或不可見的筆劃或距離可以結束。這也可能發生在您設置ListView分隔線時。

最簡單的解決方法是使用1px而不是1dp的距離。這將使線條在任何密度下始終可見。 最好的解決方案是爲每個密度創建維度資源,以獲得每個設備的最佳尺寸。

編輯2

有趣,但我想6年以後使用這個,我不能得到棒棒糖設備是一個很好的結果。

可能目前的解決方案是使用9補丁。畢竟,Android應該已經爲這個問題提供了一個簡單的解決方案。

+0

這工作對我來說 – JoeLallouz 2011-12-19 23:44:05

+0

這也適用於我,但我不知道爲什麼我不得不使用-2dp而不是-1dp。如果我使用後者,我仍然可以看到一條細線。 – 2012-01-11 09:24:37

+1

@EduZamora是的,似乎對於高密度設備-1dp沒有按預期工作 – htafoya 2012-03-01 14:29:40

28

另一個採用填充而不是其他響應。這個小snipplet使頂部和底部的邊界。

<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

如果你需要圓角,這是迄今爲止最好的答案。 – 2014-04-16 16:08:34

+0

這一個也幫助了我很大。請試試看,謝謝 – Boy 2014-06-01 09:20:21

+0

@ug_我認爲這是最好的方法。完美作品,謝謝 – 2015-01-12 10:35:22

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> 

24

我知道這個問題很久以前就貼了,所以答案不會受到誰張貼了這個問題的人使用,但它仍然可以幫助別人。

<?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"

+0

非常有幫助的答案!!!!!!!!!!! – 2016-01-13 06:51:05

+0

這很美,謝謝。 – Tunga 2016-03-04 15:47:53

+0

Lovvvvvvvvvely! – Benten 2016-05-08 18:01:37

1

我用下面的代碼。

<?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>