如何根据微调器选择更改可绘制的形状颜色

时间:2018-02-09 16:54:26

标签: android spinner drawable

我试图找出如何根据微调器选择更改纯色和笔触颜色。

spin_shape drawable

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
<solid android:color="#97233F" />
<stroke android:color="#FFC20E"
    android:width="@dimen/button_border" />
</shape>

将drawable作为背景的按钮

<Button
    android:id="@+id/team_a_td"
    android:background="@drawable/spin_shape"
    android:onClick="addSixForTeamA" />

阵列资源xml文件

<array name="color_array">
    <item>#ff0000</item>
    <item>#e9b300</item>
    <item>#db9fd5</item>
</array>
<array name="stroke_color_array">
    <item>#2988BC</item>
    <item>#660006</item>
    <item>#0C6674</item>
</array>

这是我过去根据微调器选择更改图像视图的内容。我想知道是否有类似的东西可以改变形状颜色和笔触颜色。

String[] listOfObjects = getResources().getStringArray(R.array.teams_array); 
TypedArray images = getResources().obtainTypedArray(R.array.team_image);
TypedArray team_colors = getResources().obtainTypedArray(R.array.color_array);
TypedArray secondary_colors = getResources().obtainTypedArray(R.array.stroke_color_array);
Button team_a_td_color = (Button)findViewById(R.id.team_a_td);
final Spinner spinnerA = (Spinner)findViewById(R.id.team_a_spinner);
ArrayAdapter<String> spinnerAdapterA = new ArrayAdapter<String>(this,R.layout.spinner_item, listOfObjects);
    spinnerAdapterA.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinnerA.setAdapter(spinnerAdapterA);
    spinnerA.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
        itemImageA.setImageResource(images.getResourceId(spinnerA.getSelectedItemPosition(), -1));           
}

2 个答案:

答案 0 :(得分:0)

我可以看到两种方法,一种是创建自定义Drawable类,另一种是使用不同的主题。

方法1 - 自定义类

public class MyJavaDrawable extends Drawable {

    private final int fillColor;
    private final Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);

    public MyJavaDrawable(int fillColor, int strokeColor, float strokeWidth){
        this.fillColor = fillColor;
        paint.setColor(strokeColor);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(strokeWidth);
    }

    @Override
    public void draw(@NonNull Canvas canvas) {
        canvas.drawColor(fillColor);
        canvas.drawRect(0, 0, canvas.getWidth(), canvas.getHeight(), paint);
    }

    @Override
    public void setAlpha(int alpha) {
        paint.setAlpha(alpha);
    }

    @Override
    public void setColorFilter(@Nullable ColorFilter colorFilter) {
        paint.setColorFilter(colorFilter);
    }

    @Override
    public int getOpacity() {
        return paint.getAlpha();
    }
}

// ...

MyJavaDrawable drawable = new MyJavaDrawable(fillColor, strokeColor, borderWidthPx);
imageView.setImageDrawable(drawable);

由于您不使用图像而只是直接在画布上绘图,因此您可以轻松地使用不同的颜色实例化其中的许多图像。警告n.1,我认为strokeWidthPx的值应该加倍,因为它正好在矩形的边缘上绘制,因此该宽度的一半将位于绘图区域之外。警告n.2,ImageView应该有明确定义的大小,如果你想使用wrap_content我认为你应该设置Drawable的内在界限。

方法2 - 主题

在笔划和填充颜色的styles.xml定义2属性中,然后根据需要设置多个样式,例如&#34;红色&#34;和&#34;蓝&#34;样式:

<attr name="SpinShapeFillColor" format="color" />
<attr name="SpinShapeStrokeColor" format="color" />

<style name="SpinShapeRed">
    <item name="SpinShapeFillColor">#ffff0000</item>
    <item name="SpinShapeStrokeColor">#ffff9900</item>
</style>

<style name="SpinShapeBlue">
    <item name="SpinShapeFillColor">#ff0000ff</item>
    <item name="SpinShapeStrokeColor">#ff9900ff</item>
</style>

然后更改您的spin_shape.xml以引用您已定义的属性:

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <solid android:color="?attr/SpinShapeFillColor" />
    <stroke android:color="?attr/SpinShapeStrokeColor"
        android:width="@dimen/button_border" />
</shape>

然后在您的代码中,您需要为每种样式创建Resources.Theme

final Resources.Theme themeBlue = getResources().newTheme();
themeBlue.applyStyle(R.style.SpinShapeBlue, true);

final Resources.Theme themeRed = getResources().newTheme();
themeRed.applyStyle(R.style.SpinShapeRed, true);

最后,您使用选定的Drawable实例化Theme并将其设置为ImageView

Drawable drawable = getResources().getDrawable(R.drawable.spin_shape, themeBlue);
imageView.setImageDrawable(drawable);

答案 1 :(得分:0)

一个简单的解决方法是,您可以创建2个具有2种颜色的drawable,并根据您的条件设置drawable,例如

'reg_form_id':self.id,