2016-01-06 22 views
0

什麼我有:如何在背景可繪製筆畫的筆畫改變後正確地佈局視圖?

我有一個LinearLayout含有Views與背景Drawable(具有圓角矩形形狀和中風)。他們充當顏色選擇按鈕。最初,第一個按鈕的背景較粗(4px而不是1px)。一切都很好(見下圖左側)。

我想要什麼:

然而,當我按這樣的按鈕,我想從先前選擇按鈕刪除粗的筆劃,並將其應用到實際的按鈕。我嘗試以下方式(只有一個片段):

// get layout 
LinearLayout favoriteColorsLayout = (LinearLayout) findViewById(R.id.favoriteColorsLayout); 

// get view at old position, update stroke, invalidate 
View view = favoriteColorsLayout.getChildAt(selectedColorButton); 
GradientDrawable drawable = (GradientDrawable) view.getBackground(); 
drawable.setStroke(1, Color.parseColor("#bbbbbb")); 
view.invalidate(); // do I need this? 

// also update stroke of new view 
.. 

// re-layout 
favoriteColorsLayout.requestLayout(); // do I need this? 

我看到:

事實上較厚的行程移動可惜佈局是錯誤的算帳!按鈕2-4的彩色背景在圍繞它們的筆畫變粗時應變細,以便它們仍然適合包含的佈局,但這種情況不會發生(請參閱下圖的右側)。相反,中風被部分切斷(因爲否則它將被繪製在視圖的邊界之外)。這不是一個理想的效果。

我需要做些什麼才能獲得理想的效果呢? 我知道在運行時只有多少顏色的按鈕,所以我更喜歡一個編程解決方案。

其實我開始認爲它可能是一個Android錯誤,因爲在默認情況下在邊界外繪製筆畫肯定不是期望的行爲。我看到在模擬器和API級別23的效果,以及我的舊手機與API級別11

enter image description here

佈局XML的位。線性佈局(查看以編程方式添加):

<LinearLayout 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:gravity="center" 
    android:id="@+id/favoriteColorsLayout"></LinearLayout> 

按鈕瀏覽次數:

<?xml version="1.0" encoding="utf-8"?> 
<View xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="@dimen/color_selection_button_size" 
    android:layout_height="@dimen/color_selection_button_size" 
    android:layout_margin="@dimen/color_selection_button_margin" 
    android:layout_gravity="center" 
    android:background="@drawable/color_selection_cell_background"> 
</View> 

的按鈕背景繪製(color_selection_cell_background.xml):

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> 

    <stroke 
     android:width="1px" 
     android:color="#bbbbbb"/> 

    <corners 
     android:radius="5px" /> 

    <gradient 
     android:angle="90" 
     android:centerX="0.5" 
     android:centerY="0.5" 
     android:startColor="#aaaaaa" 
     android:endColor="#bbbbbb" 
     android:type="linear" /> 
</shape> 
+0

您可以發佈佈局XML嗎? –

+0

@JimRhodes當然。被附上。 – Trilarion

+0

作爲評論:我真的想要一個程序化解決方案,因爲我不知道每個按鈕在運行前的數量或漸變顏色。 – Trilarion

回答

2

不知道爲什麼你在代碼中做它,但爲什麼不能有兩個drawable並改變它們?

button_blue_selected.xml:

<?xml version="1.0" encoding="utf-8"?> 
<shape 
    android:shape="rectangle" 
    xmlns:android="http://schemas.android.com/apk/res/android"> 

    <solid android:color="@color/blue_500" /> 
    <stroke android:width="4dp" android:color="@color/grey_500" /> 
    <corners android:radius="5dp" /> 
</shape> 

button_blue_unselected。XML:

<?xml version="1.0" encoding="utf-8"?> 
<shape 
    android:shape="rectangle" 
    xmlns:android="http://schemas.android.com/apk/res/android"> 

    <solid android:color="@color/blue_500" /> 
    <stroke android:width="1dp" android:color="@color/grey_500" /> 
    <corners android:radius="5dp" /> 
</shape> 

然後在你的代碼更新背景繪製:

View view = favoriteColorsLayout.getChildAt(selectedColorButton); 
view.setBackgroundResource(R.drawable.button_blue_selected); 

甚至更​​好,你可以使用第三方繪製與狀態,所以你並不需要直接在代碼更新:

button_blue.xml:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_selected="true" android:drawable="@drawable/button_blue_selected" /> 
    <item android:drawable="@drawable/button_blue_unselected" /> 
</selector> 

然後:

view.setSelected(true); 
+0

我在代碼中做零件,因爲按鈕的數量可能會有所不同,並且對於只有一個屬性,它似乎是更簡單的方法。謝謝你的回答,我需要一點時間來檢查它。 – Trilarion

+0

@Trilarion - 有道理。您仍然可以使用帶狀態的第三個drawable來處理使用'setSelected'方法自動更改背景。 –

+0

我檢查了你的代碼,它的工作原理,也是一個很好的例子,但我不能接受它作爲解決方案,因爲在我的情況下,我不知道每個Drawable的填充顏色的數量,因此必須以編程方式進行。不幸的是,我仍然沒有在那裏管理,也沒有人在這裏。這可能是一個Android錯誤。 – Trilarion