更改自定义视图的状态更改颜色

时间:2015-01-02 02:03:13

标签: android android-layout android-canvas android-view android-styles

我有一个自定义View,它会覆盖onDraw并基本上使用画布绘制自定义形状。 触摸视图时,我想更改颜色。

环顾StackOverflow,似乎preferred way for Buttons是设置一个可绘制的选择器列表,其中android:state_pressedandroid:state_focused设置了各种颜色。 但是,这种方法似乎对我不起作用,因为我自己绘制形状,颜色是在我自己的Paint对象上设置的。

这就是我现在所拥有的:

我使用简单的颜色属性设置自定义属性:

<declare-styleable name="CustomView">

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

</declare-styleable>

我在CustomView的构造函数中检索颜色,然后设置Paint

private final Paint paint;

...

TypedArray conf = context.obtainStyledAttributes(
  attributes,
  R.styleable.CustomView
);
Resources resources = getResources();
int color = conf.getColor(
  R.styleable.CustomView_color,
  resources.getColor(R.color.blue)
);
paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setStyle(Paint.Style.FILL);
paint.setColor(color);

最后,我在onDraw中使用它:

canvas.drawPath(shapePath, paint);

我开始研究ColorStateList,但我不知道如何将其集成到我的代码中。关于如何为我的自定义视图实现选择器列表功能的任何建议都将非常感谢!

1 个答案:

答案 0 :(得分:1)

嗯,最简单的方法是在自定义视图的触摸方法中更改Paint对象的颜色。

你可以做得更像这样:

@Override
public boolean onTouchEvent(MotionEvent event) {
    switch (event.getAction()){
        case MotionEvent.ACTION_DOWN:
            paint.setColor(mPressedColor);
            invalidate();
            break;
        case MotionEvent.ACTION_UP:
        case MotionEvent.ACTION_CANCEL:
            paint.setColor(mNormalColor);
            invalidate();
            break;
    }
    return super.onTouchEvent(event);
}

(其中mPressedColormNormalColor分别存储了压缩颜色和普通颜色的int值