我是否在自定义 ImageView 的正确位置应用了滤色器?

Am I applying the colorfilter in the right place in my custom ImageView?

我对创建自己的自定义视图还很陌生,onDraw() 总是让我觉得这是一个可怕的地方,所以我想确保我在正确的地方应用了滤色器:

public class ColorImageView extends ImageView {

  private int mColor = -1;

  public ColorImageView(Context context) {
    super(context);
  }
  public ColorImageView(Context context, AttributeSet attrs) {
    super(context, attrs);
    TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.ColorImageView);
    mColor = ta.getColor(R.styleable.ColorImageView_customColor, -1);
    ta.recycle();
  }

  @Override
  protected void onDraw(Canvas canvas) {
    if (mColor != -1) {
      Util.applyColorFilter(getDrawable(), mColor);
    }
    super.onDraw(canvas);
  }
}

onDraw() 不是您应该进行繁重计算的地方。 onDraw() 将在您的视图更改时调用多次,每次更改时都需要重绘并调用 onDraw()

在 super 调用后将颜色过滤移到 setImageDrawable() 内。此方法确保可绘制对象将被绘制到 canvas 并且您可以应用您的滤色器。 setImageDrawable保证ImageView会失效一次

@Override
public void setImageDrawable(@NotNull drawable){
 super.setImageDrawable(drawable);
 applyColorFilter();
}

最好的解决方案可能是从构造函数和此 setImageDrawable() 调用 applyColorFilter。

这会起作用,但仅当 mColor 发生变化时才应用它并保持其设置会更有意义。这样你就不需要在每次 onDraw 调用时不断地重新应用过滤器,这会影响性能。