我在自定义ImageView中将colorfilter应用于正确的位置吗?

时间:2016-01-25 22:05:23

标签: android android-view

我创建自己的自定义视图相当新,而onDraw()总是让我觉得这是一个可怕的地方,所以我想确保我在正确的位置应用滤镜:<\ n / p>

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);
  }
}

2 个答案:

答案 0 :(得分:1)

onDraw()不是您应该执行繁重计算的地方。 onDraw()会随着视图的变化而多次调用,每次更改时都需要重绘自己并调用onDraw()

超级调用后,在setImageDrawable()内移动颜色过滤。此方法可确保将drawable绘制到画布,然后您可以应用颜色过滤器。 setImageDrawable确保ImageView无效一次。

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

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

答案 1 :(得分:0)

这样可行,但只有在更改mColor时才应用它,并保持设置更有意义。这样你就不需要在每次onDraw调用时不断重新应用过滤器,这将达到性能。