我创建自己的自定义视图相当新,而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);
}
}
答案 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调用时不断重新应用过滤器,这将达到性能。