2013-07-24 6 views
99

Я редактирую, чтобы упростить вопрос, надеясь, что это поможет в точном ответе.Установить цвет формы андроида

Скажем, у меня есть следующий 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

Что вы можете установить для этого? – Vikram

+0

Выбираемый является «овальным» и является фоном 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

Примечание: Ответ был обновлен, чтобы покрыть ситуацию, когда background является экземпляром ColorDrawable. Спасибо Tyler Pfaff, для указания этого.

вытяжке овальный и является фоном из ImageView

Получить Drawable от imageView с помощью getBackground():

Drawable background = imageView.getBackground(); 

Проверка против обычных подозреваемых:

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(); 
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). Мой код испытывает другие ошибки, поэтому его трудно проверить. Но все же это может установить «твердую» часть формы. Как насчет части «удара»? –

+0

сделал yu управление? Я ищу сделать то же самое! – 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 Вы добавили 'android: background' в свой xml или даже операцию' setBackground'in, прежде чем вы вызываете 'getBackground()'? Он должен работать, если вы это сделали. –

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.

fun Drawable.overrideColor(@ColorInt colorInt: Int) { 
    when (this) { 
     is GradientDrawable -> setColor(colorInt) 
     is ShapeDrawable -> paint.color = colorInt 
     is ColorDrawable -> color = colorInt 
    } 
} 
Смежные вопросы