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

Change color on state change for custom view

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

环顾 Whosebug,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,但我不清楚如何将它集成到我的代码中。非常感谢任何有关如何为我的自定义视图实现选择器列表功能的建议!

嗯,最简单的方法是在自定义视图的触摸方法中更改 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 值)