2016-10-25 197 views
1

我有一個帶有自定義邊框的圓形視圖,使用CircularImageView庫實現,並在RecyclerView中膨脹。到目前爲止,我已經在其中放置了一個圖像,但現在我想用一個單色圓和一個文本替換它。以編程方式更改現有形狀中的純色

我創建了下面的形狀(shape_colored_circle.xml):

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

    <size 
     android:height="70dp" 
     android:width="70dp"/> 
    <solid 
     android:color="#00f"/> 
</shape> 

而且與CircularImageView一起加入了一個TextViewFrameLayout

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/card" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:gravity="center" 
    android:orientation="vertical"> 

    <FrameLayout 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1" 
     android:gravity="center" 
     android:orientation="vertical"> 

     <com.mikhaellopez.circularimageview.CircularImageView 
      android:id="@+id/card_thumbnail" 
      android:layout_width="70dp" 
      android:layout_height="70dp" 
      android:src="@drawable/icon" 
      app:civ_border="true" 
      app:civ_border_color="@color/border_color" 
      app:civ_border_width="2dp" 
      app:civ_shadow="true" 
      app:civ_shadow_color="@color/grey" 
      app:civ_shadow_radius="10" 
      android:contentDescription="@string/card_thumbnail"/> 

     <TextView 
      android:id="@+id/card_name" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center" 
      android:text="@string/app_name" 
      android:textSize="18sp" 
      android:textStyle="bold"/> 

    </FrameLayout> 

</LinearLayout> 

我知道,佈局似乎有點奇怪(「爲什麼需要頂部LinearLayout?」),但沒有它,該視圖根本不會出現在RecyclerView中,而此佈局(取自圖書館的示例)滿足我們的需求。

onBindViewHolder我設定的形狀爲CircularImageView資源:

holder.thumbnail.setImageDrawable(activity.getResources().getDrawable(R.drawable.shape_colored_circle)); 

最後,我看到了我的期待。問題是我的drawable預先設置了特定的顏色。因此,我試圖以編程方式創建一個形狀:

GradientDrawable gd = new GradientDrawable(); 
gd.setShape(GradientDrawable.RECTANGLE); 
gd.setColor(colors[position]);    //Getting the color from a predefined array of colors 
holder.thumbnail.setImageDrawable(gd); 

但是視圖只是變成了一個黑色的矩形。我試圖通過編程創建一個形狀的更多解決方案(所有這些都非常相似)都無濟於事 - 我要麼看到一個黑色矩形,要麼根本看不到任何東西。

我做錯了什麼?有沒有其他的方法來創建一個形狀,或者在運行時改變現有形狀的方法?或者,也許完全不同的方式來實現所需的行爲?

謝謝!

+0

幾年前我碰到一個問題,當我嘗試以編程方式設置顏色時,我的drawable的背景變黑。也許有類似的問題? http://stackoverflow.com/questions/24581900/android-button-background-xml-sometimes-loses-alpha-when-setting-color-filter – 0x5453

+0

@ 0x5453我添加了'gd.setAlpha()'。對於值255,它是一個黑色矩形,對於值0,它顯然是不可見的。你是否認爲你的解決方案與程序創建的drawable相關? –

回答

1

感謝Vijay Pal Vishwakarma我設法解決了這個問題。

首先,我設置了預定義的形狀爲CircularImageView來源:

<com.mikhaellopez.circularimageview.CircularImageView 
      android:id="@+id/card_thumbnail" 
      android:layout_width="70dp" 
      android:layout_height="70dp" 
      android:src="@drawable/shape_colored_circle"  //Note this line 
      app:civ_border="true" 
      app:civ_border_color="@color/border_color" 
      app:civ_border_width="2dp" 
      app:civ_shadow="true" 
      app:civ_shadow_color="@color/grey" 
      app:civ_shadow_radius="10" 
      android:contentDescription="@string/card_followee_large_thumbnail"/> 

然後,在onBindViewHolder我得到的現有繪製並改變其顏色:

GradientDrawable gd = (GradientDrawable) holder.thumbnail.getDrawable(); 
if (gd != null) { 
    gd.setColor(colors[position]); 
} 
+0

這是我的方法的確切副本,不是嗎? –

+0

不,這裏'shape_colored_circle'被用作源而不是背景。 –

3
<com.mikhaellopez.circularimageview.CircularImageView 
    android:id="@+id/card_thumbnail" 
    android:layout_width="70dp" 
    android:layout_height="70dp" 
    android:background="@drawable/shape_colored_circle" //Note 
    android:contentDescription="@string/card_thumbnail" 
    android:src="@drawable/icon" 
    app:civ_border="true" 
    app:civ_border_color="@color/border_color" 
    app:civ_border_width="2dp" 
    app:civ_shadow="true" 
    app:civ_shadow_color="@color/grey" 
    app:civ_shadow_radius="10"/>` 

GradientDrawable gd = (GradientDrawable) holder.thumbnail.getBackground() 
if (gd != null) { 
    gd.mutate(); 
    gd.setColor(colors[position]); 
} 
+0

問題是'CircularImageView'背景是圓圈後面的整個矩形。因此我必須設定來源而不是背景。 –

相關問題