2014-01-13 6 views
2

Я с настройкой динамического фона для моего виджета проблемы:Dynamic GradientDrawable в RemoteView

Мои предпочтения возвращают цвет, выбранный пользователем, и я хотел бы, чтобы применить его к виджету, но с градиентом эффект. Так вот, где я нахожусь в данный момент:

Мой widget.xml:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/widget_layout" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:background="@drawable/style_widget" 
> ... 

Мой Service.java:

public void onStart(Intent intent, int startId) { 
    super.onStart(intent, startId);  

    remoteViews = new RemoteViews(this.getPackageName(), R.layout.widget); 
    this.prefs = PreferenceManager.getDefaultSharedPreferences(this);  

    //this is where I get the color preference value, and create another with some transparency 

    int color1 = prefs.getInt("background_color", 00000000); 
    int color2 = Color.argb(22, Color.red(color1), Color.green(color1), Color.blue(color1)); 

    int colors[] = { color1, color2 }; 

      //Create the GradientDrawable:  
    GradientDrawable gradientDrawable = new GradientDrawable(
      GradientDrawable.Orientation.TOP_BOTTOM, colors); 

Если я:

remoteViews.setInt(R.id.widget_layout, "setBackgroundColor", color1); 

Я получаю цвет фона изменился, но поскольку gradientDrawable не является int, как применить его к моему фону через remoteViews?

ответ

2

Ну, я нашел ответ здесь:

Setting GradientDrawable through RemoteView

Я создал ImageView заполняющего весь виджет, а затем создал битовый массив с помощью моего gradientDrawable, то выставиться растровое изображение в ImageView:

<?xml version="1.0" encoding="utf-8"?> 

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/widget_layout" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:background="@drawable/style_widget" 
android:padding="0dip" > 

<ImageView 
     android:id="@+id/bck_image" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:scaleType="fitXY" 
    /> 

, а затем в моей службы:

GradientDrawable gradientDrawable = new GradientDrawable(
        GradientDrawable.Orientation.LEFT_RIGHT, colors);    

float dpi = getBaseContext().getResources().getDisplayMetrics().xdpi; 
float dp = getBaseContext().getResources().getDisplayMetrics().density; 

Bitmap bitmap = Bitmap.createBitmap(Math.round(288 * dp), Math.round(72 * dp), Config.ARGB_8888); 
Canvas canvas = new Canvas(bitmap); 
gradientDrawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); 
gradientDrawable.setCornerRadius(5 * (dpi/160)); 
gradientDrawable.draw(canvas); 
remoteViews.setImageViewBitmap(R.id.bck_image, bitmap); 

(Я очень новичок в Android, поэтому не знаю, хорошо ли сформирован код, но для меня это работает, на случай, если он может помочь кому угодно.)

Смежные вопросы