2011-02-09 3 views
15

Я экспериментирую с Drawable backgrounds и до сих пор не имел проблем.Изменение цвета фона градиента на Android во время выполнения

Теперь я пытаюсь изменить цвет фона градиента во время выполнения.

К сожалению, нет API для его изменения во время выполнения. Даже при попытке изменить (drawable), как описано здесь: Drawable mutations

Образец XML выглядит следующим образом. Он работает, как и ожидалось.

<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="rectangle"> 
    <gradient 
     android:startColor="#330000FF" 
     android:endColor="#110000FF" 
     android:angle="90"/> 
</shape> 

К сожалению, я хочу список с различными цветами, и их необходимо будет программно изменить во время выполнения.

Есть ли другой способ создать этот градиентный фон во время выполнения? Возможно, даже не используя XML вообще?

ответ

32

Да! Нашли способ!

бы забыть о XML, но вот как я это сделал:

На мой GetView() перегруженная функция (ListAdapter) Я просто должен был:

int h = v.getHeight(); 
    ShapeDrawable mDrawable = new ShapeDrawable(new RectShape()); 
    mDrawable.getPaint().setShader(new LinearGradient(0, 0, 0, h, Color.parseColor("#330000FF"), Color.parseColor("#110000FF"), Shader.TileMode.REPEAT)); 
    v.setBackgroundDrawable(mDrawable); 

И это дало мне тот же результат в качестве фона XML выше. Теперь я могу программно установить цвет фона.

+2

Можно ли задать значение угла выше? – Ahmed

+1

Если вы используете это в своем действии, вы можете запустить его, например. в onWindowFocusChanges() вместо onCreate(). –

0

В зависимости от ваших потребностей использование color state list вместо фиксированного цвета для startColor и endColor может делать то, что вы хотите.

+0

Интересная альтернатива, но мне действительно нужно что-то более динамичное. Это список, который показывает информацию от разных подключаемых поставщиков. Каждый поставщик имеет собственный цвет, поэтому пользователь знает, откуда эта информация. Я знаю, что это не так много информации, но, возможно, это поможет. – Phenome

9

Я попытался использовать решение Phenome для просмотра Button. Но почему-то это не сработало.

я придумал что-то другое: (Предоставлено: Android Примеры API Demo)

package com.example.testApp; 

import android.app.Activity; 
import android.graphics.drawable.GradientDrawable; 
import android.os.Bundle; 
import android.view.View; 

public class TetApp extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     View v = findViewById(R.id.btn); 
     v.setBackgroundDrawable(new DrawableGradient(new int[] { 0xff666666, 0xff111111, 0xffffffff }, 0).SetTransparency(10)); 

    } 

    public class DrawableGradient extends GradientDrawable { 
     DrawableGradient(int[] colors, int cornerRadius) { 
      super(GradientDrawable.Orientation.TOP_BOTTOM, colors); 

      try { 
       this.setShape(GradientDrawable.RECTANGLE); 
       this.setGradientType(GradientDrawable.LINEAR_GRADIENT); 
       this.setCornerRadius(cornerRadius); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 

     public DrawableGradient SetTransparency(int transparencyPercent) { 
      this.setAlpha(255 - ((255 * transparencyPercent)/100)); 

      return this; 
     } 
    } 
} 
0

Попробуйте мой код ниже:

int[] colors = new int[2]; 
      colors[0] = getRandomColor(); 
      colors[1] = getRandomColor(); 


      GradientDrawable gd = new GradientDrawable(
        GradientDrawable.Orientation.TOP_BOTTOM, colors); 

      gd.setGradientType(GradientDrawable.RADIAL_GRADIENT); 
      gd.setGradientRadius(300f); 
      gd.setCornerRadius(0f); 
      YourView.setBackground(gd); 

метод для генерации случайных цвет:

public static int getRandomColor(){ 
    Random rnd = new Random(); 
    return Color.argb(255, rnd.nextInt(256), rnd.nextInt(56), rnd.nextInt(256)); 
}