我是否在自定义 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 调用时不断地重新应用过滤器,这会影响性能。
我对创建自己的自定义视图还很陌生,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 调用时不断地重新应用过滤器,这会影响性能。