这个对话框会列出应用的图标,当用小球把焦点移到某个图标时,这个图标会有种“光晕”的效果,如下图所示:

刚看到时想要如何画呢:确定图片的边界然后画上一条曲线?把放大后的图片和原来的图片叠加?模糊的边角看上去也很cool…

找一通后发现对话框的代码位置:$Droid_Src/frameworks/base/policy/src/com/android/internal/policy/impl/com/android/internal/policy/impl,图片处理的代码为IconUtilities.java。图简便就地使用ApiDemo里面的代码来做个小例子,主要代码如下。显示结果在上面的图片中。

int[] xy = new int[2];
Paint mBlurPaint = new Paint();
final float density = mDisplayMetrics.density;
final float blurPx = 5 * density;
mBlurPaint.setMaskFilter(new BlurMaskFilter(blurPx, BlurMaskFilter.Blur.NORMAL));
Bitmap mask = mBitmap.extractAlpha(mBlurPaint, xy);

mGlowColorFocusedPaint = new Paint();
mGlowColorFocusedPaint.setColor(0xffff8e00);
mGlowColorFocusedPaint.setMaskFilter(TableMaskFilter.CreateClipTable(0, 30));
canvas.drawBitmap(mask, 10, y, mGlowColorFocusedPaint);
canvas.drawBitmap(mBitmap, 10-xy[0], y-xy[1], new Paint());

上面TableMaskFilter在android定义为hidden,所以不能在自己的项目中用。我找个一个方法:在自己的project中重新定义一个同名同package的脚手架类,使上面代码编译通过即可。这个方法跟iPhone上面一样。

package android.graphics;

public class TableMaskFilter2 extends MaskFilter {

public TableMaskFilter2(byte[] table) {

}

public static TableMaskFilter2 CreateClipTable(int min, int max) {
return null;
}

public static TableMaskFilter2 CreateGammaTable(float gamma) {
return null;
}
}

代码很简单,和Photoshop的一些滤镜有点像…… 但是后面的原理现在还不清楚。