2013-07-24 172 views
99

我在編輯以使問題更簡單,希望能夠幫助您獲得準確的答案。以編程方式設置android形狀顏色

說我有以下oval形狀:

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> 
    <solid android:angle="270" 
      android:color="#FFFF0000"/> 
    <stroke android:width="3dp" 
      android:color="#FFAA0055"/> 
</shape> 

如何設置的顏色編程,從活動類中?

+0

你對此drawable設置了什麼? – Vikram

+0

drawable是一個「橢圓形」,是ImageView的背景。 –

+0

如果問這個問題太困難了,是否有辦法將多個圖像繪製到畫布上,並將分層最終產品設置爲視圖的背景? –

回答

12

試試這個:

public void setGradientColors(int bottomColor, int topColor) { 
GradientDrawable gradient = new GradientDrawable(Orientation.BOTTOM_TOP, new int[] 
{bottomColor, topColor}); 
gradient.setShape(GradientDrawable.RECTANGLE); 
gradient.setCornerRadius(10.f); 
this.setBackgroundDrawable(gradient); 
} 

的詳細檢查此鏈接this

希望幫助。

+0

投票支持鏈接。但這不是我的問題的答案。 –

177

:答案已經更新到覆蓋場景backgroundColorDrawable一個實例。謝謝Tyler Pfaff,指出這一點。

的繪製是一個橢圓形,是一個ImageView的

的背景使用getBackground()獲取從imageViewDrawable

if (background instanceof ShapeDrawable) { 
    // cast to 'ShapeDrawable' 
    ShapeDrawable shapeDrawable = (ShapeDrawable) background; 
    shapeDrawable.getPaint().setColor(ContextCompat.getColor(mContext,R.color.colorToSet)); 
} else if (background instanceof GradientDrawable) { 
    // cast to 'GradientDrawable' 
    GradientDrawable gradientDrawable = (GradientDrawable) background; 
    gradientDrawable.setColor(ContextCompat.getColor(mContext,R.color.colorToSet)); 
} else if (background instanceof ColorDrawable) { 
    // alpha value may need to be set again after this call 
    ColorDrawable colorDrawable = (ColorDrawable) background; 
    colorDrawable.setColor(ContextCompat.getColor(mContext,R.color.colorToSet)); 
} 

Drawable background = imageView.getBackground(); 

對通常的嫌疑人入住

壓縮版本:

Drawable background = imageView.getBackground(); 
if (background instanceof ShapeDrawable) { 
    ((ShapeDrawable)background).getPaint().setColor(ContextCompat.getColor(mContext,R.color.colorToSet)); 
} else if (background instanceof GradientDrawable) { 
    ((GradientDrawable)background).setColor(ContextCompat.getColor(mContext,R.color.colorToSet)); 
} else if (background instanceof ColorDrawable) { 
    ((ColorDrawable)background).setColor(ContextCompat.getColor(mContext,R.color.colorToSet)); 
} 

請注意,不需要空值檢查。

但是,在修改它們之前,如果它們在其他地方使用,則應在畫面上使用mutate()。 (默認情況下,圖形的XML共享加載相同的狀態。)

+3

感謝您的回答。 (+1)。我的代碼遇到其他錯誤,所以很難測試。但是,這仍然可以設定形狀的「堅實」部分。 'stroke'部分怎麼樣? –

+0

幹啥管理?我期待着做同樣的事情! – TiGer

+1

@TiGer您應該在您的評論中添加「@ username」以確保向用戶發送通知。順便說一下,您需要繼承'ShapeDrawable'以設置筆劃部分。更多信息在這裏:[鏈接](http://stackoverflow.com/a/3663956)。看看評論,因爲它提到了接受答案的問題。 – Vikram

38

這樣做:

ImageView imgIcon = findViewById(R.id.imgIcon); 
    GradientDrawable backgroundGradient = (GradientDrawable)imgIcon.getBackground(); 
    backgroundGradient.setColor(getResources().getColor(R.color.yellow)); 
+0

嘗試它,但得到NPE。 – user3111850

+0

@ user3111850在你調用'getBackground()'之前,你在xml中甚至是'setBackground'中添加了'android:background'嗎?如果你這樣做的話,它應該有效。 –

9

希望這將有助於有人用同樣的問題

GradientDrawable gd = (GradientDrawable) YourImageView.getBackground(); 
//To shange the solid color 
gd.setColor(yourColor) 

//To change the stroke color 
int width_px = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, youStrokeWidth, getResources().getDisplayMetrics()); 
gd.setStroke(width_px, yourColor); 
+0

這工作正常,謝謝 – Leebeedev

+0

最初我無法得到這個工作,我想出** yourColor **必須提供像這樣:'gd.setStroke(width_px,Color.parseColor(「#FF5722」)); ' – pwnsauce

5

這是解決方案,爲我工作...寫在另一個問題以及: How to change shape color dynamically?

//get the image button by id 
ImageButton myImg = (ImageButton) findViewById(R.id.some_id); 

//get drawable from image button 
GradientDrawable drawable = (GradientDrawable) myImg.getDrawable(); 

//set color as integer 
//can use Color.parseColor(color) if color is a string 
drawable.setColor(color) 
6

Vikram's的答案上展開,如果您正在爲動態視圖着色,如回收器視圖項目等....那麼您可能要在設置顏色之前調用mutate()。如果你不這樣做,任何具有通用可繪製視圖(即背景)的視圖也會將其可繪製改爲/着色。

public static void setBackgroundColorAndRetainShape(final int color, final Drawable background) { 

    if (background instanceof ShapeDrawable) { 
     ((ShapeDrawable) background.mutate()).getPaint().setColor(color); 
    } else if (background instanceof GradientDrawable) { 
     ((GradientDrawable) background.mutate()).setColor(color); 
    } else if (background instanceof ColorDrawable) { 
     ((ColorDrawable) background.mutate()).setColor(color); 
    }else{ 
     Log.w(TAG,"Not a valid background type"); 
    } 

} 
+1

需要額外的檢查和參數:'if(background instanceof LayerDrawable)background =((LayerDrawable)background.mutate())。getDrawable(indexIfLayerDrawable); } if(background instanceof ShapeDrawable)[...]'處理使用' Johny

3

這個問題已經回答了一段時間,但它可以現代化改寫爲kotlin擴展函數。

​​
相關問題