多亏了pskink,我才能够创建完整的解决方案.
如果要创建自定义视图,其中必须是针对不同触摸状态(按下,选定,聚焦等)的自定义工程图,并且您不知道此视图是否将放置在其他可以拦截触摸事件的视图中,或者视图结构更加困难.您应该实现以下行为
>创建自定义Drawable
>在覆盖方法isStateful()中返回真值(需要保持不同的状态)
>覆盖onStateChange方法,如果状态已更改,则调用invalidateSelf().
>覆盖draw方法以基于drawableState实现自定义绘图(请参见getState方法)
>应该绘制可绘制对象的自定义视图覆盖方法(例如setImageDrawable,setBackground …取决于您的需要)
>在带有自定义Drawable类的方法调用supermethod中
例:
public class CircularImageView extends ImageView{
@Override
public void setImageDrawable(Drawable drawable) {
super.setImageDrawable(new CustomDrawable(
((BitmapDrawable)drawable).getBitmap()));
}
protected class CustomDrawable extends Drawable {
//
private Bitmap bitmap;
public CustomDrawable(Bitmap bitmap){
this.bitmap = bitmap;
}
@Override
public boolean isStateful() {
// always return true
return true;
}
@Override
public int getOpacity() {
// see documentation on android developers site
return PixelFormat.OPAQUE;
}
@Override
public void setColorFilter(ColorFilter colorFilter) {
}
@Override
public void setAlpha(int i) {
}
boolean pressed = false;
@Override
protected boolean onStateChange(int[] states) {
// simplified but working
for (int state : getState()){
if (state == android.R.attr.state_pressed ||
state == android.R.attr.state_focused)
pressed = true;
else pressed = false;
}
invalidateSelf();
return true;
}
@Override
public void draw(Canvas canvas) {
// very simplified example
canvas.drawBitmap(bitmap,0,0,paint);
circlePaint.setColor(pressed ? colorActive : colorPassive);
canvas.drawCircle(0, 0, 100, 100);
}
}
}