许久都没有更新CSND 的博客,近几月的确有些忙乱,以至于找不到工作和生活的平衡点,既没有太多时间来自己写博客,记录成长,也没有太多时间担当家事,陪伴老婆照顾孩子。至此自省:为梦想远行,亦不负沿途美景。
言归正传,近期的一个小需求,觉得可以简单的总结记录一下,走起......
需求:
PM小姐姐,需要我出临时出一个演示版本的 Launcher,需要部分未完成开发的应用,显示在applist中,但图标置灰,点击无响应,或不可点击。(匪夷所思.....)
直接上解决方案:
【 方案一:静态布局的属性的处理方式 】
前提条件:图片具有静态布局,而非需要动态加载的图片,且图片显示资源为:background 属性设置;
在ImageView 布局属性中,把 src 设置为 半透明颜色值,或者是灰暗的图片,建议首选设置半透明色值,节省应用的内存消耗,如:srcandroid:src="#80000000",即可以实现。
【 方案二:动态获取 图片资源 灰色过滤的 Drawable 】
public static Drawable getGrayDrawable(Context context, int resId) {
Drawable drawable = context.getResources().getDrawable(resId);
drawable.setColorFilter(Color.GRAY, PorterDuff.Mode.MULTIPLY);
return drawable;
}
【 方案三:实时 获取 图片资源的 低饱和度 Bitmap 】
? 一波常规的 Bitmap 像素级 操作 ~!?
public static Bitmap getLowSaturationBitmap(Context context, int resId) {
Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), resId);
int width = bitmap.getWidth();
int height = bitmap.getHeight();
int[] pixels = new int[width * height];
//
bitmap.getPixels(pixels, 0, width, 0, 0, width, height);
int alpha = 0xFF << 24;
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
int grey = pixels[width * i + j];
int red = ((grey & 0x00FF0000) >> 16);
int green = ((grey & 0x0000FF00) >> 8);
int blue = (grey & 0x000000FF);
grey = (int) (red * 0.3 + green * 0.59 + blue * 0.11);
grey = alpha | (grey << 16) | (grey << 8) | grey;
pixels[width * i + j] = grey;
}
}
//
Bitmap newBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
newBitmap.setPixels(pixels, 0, width, 0, 0, width, height);
Bitmap targetBitmap = ThumbnailUtils.extractThumbnail(newBitmap, 460, 460);
return targetBitmap;
}
【 方案四:实时 获取 图片资源的 0 饱和度 Drawable 】
Android系统源码中,提供一个用于调整颜色矩阵算法的类 ColorMatrix,这是一个4x5的数字矩阵,颜色的色值则保存在一个4x1的矩阵中,色值的区间为[0,255]。
其中,有一个通过设置矩阵的浮点数值,来计算、调整或 影响色彩饱和度的方法 :
/**
* Set the matrix to affect the saturation of colors.
*
* @param sat A value of 0 maps the color to gray-scale. 1 is identity.
*/
public void setSaturation(float sat) {
reset();
float[] m = mArray;
final float invSat = 1 - sat;
final float R = 0.213f * invSat;
final float G = 0.715f * invSat;
final float B = 0.072f * invSat;
m[0] = R + sat; m[1] = G; m[2] = B;
m[5] = R; m[6] = G + sat; m[7] = B;
m[10] = R; m[11] = G; m[12] = B + sat;
}
除了直接设置矩阵的设置饱和度外,该类还封装了一些API来快速调整矩阵参数,如:
设置色调:
setRotate(int axis, float degrees)
设置亮度:
setScale(float rScale, float gScale, float bScale,float aScale) {
。。。
setConcat(ColorMatrix matA, ColorMatrix matB)
。。。。。。
等等,这些方法使用起来很简单方便,具体这里就不细说,待以后有机会细细研究后,在做总结分享;
我们只需要这样,就可实现我们的需求了~!
public static Drawable getZeroSaturationDrawable(Context context, int iconResId) {
Drawable drawable = context.getResources().getDrawable(iconResId);
ColorMatrix matrix = new ColorMatrix();
matrix.setSaturation(0);
drawable.setColorFilter(new ColorMatrixColorFilter(matrix));
return drawable;
}
【匆忙完结,叩谢~!】