タイトルのようなことをしたかったんですが、そんなプロパティはなかったのでImageViewを拡張してプロパティをつけたら出来ました。
↓のようなクラスを作って、xmlなり動的に生成するなりしたImageViewに対して操作をすれば期待した動きをしてくれる。
public class ExtendedPropatyImageView extends ImageView{
private static final float[] defaultValues = {
1, 0, 0, 0, 0,
0, 1, 0, 0, 0,
0, 0, 1, 0, 0,
0, 0, 0, 1, 0
};
private int mBrightness = 0;
private float mContrast = 0f;
private float mSaturation = 0f;
private float mHue = 0f;
private int mRed = 0;
private int mGreen = 0;
private int mBlue = 0;
public ExtendedPropatyImageView(Context context) {
super(context);
}
public ExtendedPropatyImageView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public void setBrightness(int brightness) {
float[] values = defaultValues;
ColorMatrix matrix = new ColorMatrix();
values[4] = values[9] = values[14] = brightness;
setColorFilter(new ColorMatrixColorFilter(values));
mBrightness = brightness;
}
public int getBrightness() {
return mBrightness;
}
public void setContrast(float contrast) {
float[] values = defaultValues;
values[0] = values[6] = values[12] = contrast;
setColorFilter(new ColorMatrixColorFilter(values));
mContrast = contrast;
}
public float getContrast() {
return mContrast;
}
public void setSaturation(float saturation) {
ColorMatrix matrix = new ColorMatrix();
matrix.setSaturation(saturation);
setColorFilter(new ColorMatrixColorFilter(matrix));
mSaturation = saturation;
}
public float getSaturation() {
return mSaturation;
}
public void setHue(float hue) {
float[] values = defaultValues;
float a = Math.max(0, (float) Math.cos(hue / 360 * 2 * Math.PI));
float b = Math.max(0, (float) Math.cos((hue - 120) / 360 * 2 * Math.PI));
float c = Math.max(0, (float) Math.cos((hue - 240) / 360 * 2 * Math.PI));
float sum = a + b + c;
values[0] = values[6] = values[12] = a / sum;
values[1] = values[7] = values[10] = b / sum;
values[2] = values[5] = values[11] = c / sum;
setColorFilter(new ColorMatrixColorFilter(values));
mHue = hue;
}
public float getHue() {
return mHue;
}
public void setRed(int red) {
float[] values = defaultValues;
values[4] = red;
setColorFilter(new ColorMatrixColorFilter(values));
mRed = red;
}
public int getRed() {
return mRed;
}
public void setGreen(int green) {
float[] values = defaultValues;
values[9] = green;
setColorFilter(new ColorMatrixColorFilter(values));
mGreen = green;
}
public int getGreen() {
return mGreen;
}
public void setBlur(int blue) {
float[] values = defaultValues;
values[14] = blue;
setColorFilter(new ColorMatrixColorFilter(values));
mBlue = blue;
}
public int getBlue() {
return mBlue;
}
}
アニメーションさせるときはこんな感じ
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ExtendedPropatyImageView image = (ExtendedPropatyImageView) findViewById(R.id.image_view);
ObjectAnimator objectAnimator = ObjectAnimator.ofInt(image, "brightness", 0, 255);
objectAnimator.setDuration(1000);
objectAnimator.start();
}
後は値の型に合わせてofFloatにするなり、brightnessをhueやらに変えればそのプロパティを変更するアニメーションを実行することが出来た。
ColorMatrixクラスに彩度をセットするメソッドはあったけど、なんで他は無いんだろう・・・