2016-10-25 15 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> 

И добавил TextView вместе с CircularImageView в FrameLayout:

<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 он (очевидно) невидим. Вы считаете, что ваше решение имеет отношение к программно созданным чертежам? –

ответ

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' - это весь прямоугольник за кругом. Поэтому я должен установить источник, а не фон. –