2011-03-08 75 views
4

我有一個來自XML資源的drawable,我想使用該drawable但動態設置漸變顏色。到目前爲止,我有這樣的事情:Android - 動態設置drawable的漸變

<?xml version="1.0" encoding="utf-8"?> 
<shape 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="rectangle"> 
    <corners 
     android:radius="3dip"> 
    </corners> 
    <gradient 
     android:angle="90" 
     android:type="linear" 
     android:startColor="#FFFFFFFF" 
     android:centerColor="#FFFF0000" 
     android:endColor="#FFFF0000"> 
    </gradient> 
</shape> 

現在我想通,我將能夠通過獲取繪製在運行時,鑄造它作爲一個GradientDrawable,使用方法來設置顏色,使顏色動態。然而,GradientDrawable沒有這樣的方法,只能在構造函數中設置顏色。我覺得很奇怪,因爲梯度的其他方面都是可以設置的。有沒有比重寫onDraw()和自己做漸變更簡單的方法?我試圖使用的一些課程記錄很差..

回答

0

您可以設置爲動態視圖的背景繪製。

view.setBackgroundDrawable(R.drawable.your_drawable_id);

0

資源主要是靜態的,通常不允許修改。有些資源類型允許您「克隆」可變副本。 GradientDrawable只允許您在contstuctor中設置顏色(如您發現的那樣),所以如果您想要在運行時動態控制顏色,或者更好地從資源中選擇一個固定數量的背景,則需要在內部創建這些顏色。 如前所述,使用setBackgroundDrawable()在運行時安裝您的背景。 無需通過判斷,只需Get-R-Done!

+0

注意GradientDrawable現在支持setColors:http://developer.android.com/reference/android/graphics/drawable/GradientDrawable.html#setColors(INT []) 作爲API級的16 – 2013-03-12 18:15:26

+0

爲真棒感謝擡頭! – 2013-03-13 12:02:26

0

做一個GradientDrawable類像這樣:

public class RoundedDrawable extends GradientDrawable { 

     public RoundedDrawable(int shape, int solidColor, int strokeWidth, 
    int strokeColor, float[] fourRadii) { 

      this.mutate(); 
      this.setShape(shape); 
      this.setColor(solidColor); 
      this.setStroke(strokeWidth, strokeColor); 
      this.setCornerRadii(fourRadii); 
     } 
    } 

現在您的活動使用這樣的:

公共類AAActivity延伸活動{

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.fragment_transaction_layout); 

    RoundedDrawable customBg; 

    RelativeLayout relList = (RelativeLayout) findViewById(R.id.relList); 
    float radii[]={5.0f, 5.0f, 5.0f, 5.0f, 5.0f, 5.0f, 5.0f, 5.0f}; 
    customBg = new RoundedDrawable(GradientDrawable.RECTANGLE,Color.parseColor("#FFFFFF"), 
      2, Color.parseColor("#8C8C8C"),radii); 
    relList.setBackgroundDrawable(customBg); 

    LinearLayout linearItemsRow = (LinearLayout) findViewById(R.id.linearItemsRow); 
    float[] rowRadii={5.0f, 5.0f, 5.0f, 5.0f, 0.0f, 0.0f, 0.0f, 0.0f}; 
    customBg = new RoundedDrawable(GradientDrawable.RECTANGLE,Color.parseColor("#CBCBCB"), 
      0, 0, rowRadii); 
    linearItemsRow.setBackgroundDrawable(customBg); 


} 

}

希望這會有所幫助。