2017-01-04 14 views
0

Я хотел бы определить, какой цвет следует использовать при рисовании на холсте в зависимости от настраиваемого состояния. Это, как далеко я получил:Android: обновление пользовательского атрибута цвета с помощью селектора

В Рез/макет/content.xml:

<com.example.package.MyView 
    app:primary_color="@drawable/my_selector" 
/> 

primary_color является пользовательский атрибут, определенный в Рез/значения/attrs.xml:

<resource> 
    <declare-styleable name="MyView"> 
     <attr name="primary_color" format="reference"/> 
    </declare-styleable> 
</resource> 

my_selector определяется в Рез/рисуем/my_selector.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res/com.example.package"> 
    <item 
     app:state_a="true" 
     android:drawable="@drawable/red" /> 
    <item 
     app:state_b="true" 
     android:drawable="@drawable/orange" /> 
    <item 
     app:state_c="true" 
     android:drawable="@drawable/red" /> 
</selector> 

красный, оранжевый и красный, определены в Рез/значений/colordrawab le.xml:

<resources> 
    <drawable name="red">#f00</drawable> 
    <drawable name="orange">#fb0</drawable> 
    <drawable name="green">#0f0</drawable> 
</resources> 

В MyView я могу получить эту вытяжке:

StateListDrawable primaryColor; 

public MyView(Context context, AttributeSet attrs) { 
    super(context, attrs); 

    try{ 

     primaryColor = (StateListDrawable) a.getDrawable(
      R.styleable.MyView_primary_color); 
    }finally { 
     a.recycle(); 
    } 
} 

primaryColor правильно обновляется с различными состояниями, я могу проверить это по телефону:

setBackground(primaryColor); 

Но я хотите использовать этот цвет с помощью Paint, например:

paint.setColor(primaryColor); 

Но это, очевидно, не допускается. Я попытался преобразовать primaryColor в ColorDrawable, у которого есть метод getColor(), но я не могу понять, как это сделать, если это возможно.

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

ответ

0

Я нашел ColorStateList, который оказался именно тем, что мне нужно. Ниже приведен упрощенный вариант моей текущей реализации, если кто-то другой попадает в ту же колею, что и я.

В Рез/цвет/my_selector.xml

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

    <item app:state_weak="true" android:color="#F00" /> 
    <item app:state_average="true" android:color="#0F0" /> 
    <item app:state_strong="true" android:color="#00F" /> 
    <item android:color="#FA0" /> 
</selector> 

В RES/макет/content.xml (Это имеет другую компоновку, обернутый вокруг него, но это не имеет значения)

<com.example.package.MyView 
    android:id="@+id/strMeter" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    app:primary_color="@color/my_selector" 
    /> 

primary_color это определяет в качестве ссылки в RES/значений/attrs.xml

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <declare-styleable name="MyView"> 
     <attr name="primary_color" format="reference"/> 
    </declare-styleable> 
</resources> 

я получаю ссылку на ColorStateList в конструкторе MyView:

ColorStateList primaryColor; 

public PasswordStrengthBar(Context context, AttributeSet attrs) { 
    super(context, attrs); 

    try{ 
     primaryColor = a.getColorStateList(
      R.styleable.MyView_primary_color); 
    }finally { 
     a.recycle(); 
    } 
} 

Когда я хочу, чтобы получить цвет для текущего состояния:

int color = secondaryColor.getColorForState(
       getDrawableState(), primaryColor.getDefaultColor()); 

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