Filed under Graph

Android的“最近应用对话框”

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

刚看到时想要如何画呢:确定图片的边界然后画上一条曲线?把放大后的图片和原来的图片叠加?模糊的边角看上去也很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的一些滤镜有点像…… 但是后面的原理现在还不清楚。

在Mac OS X上编译Clutter

在MacPorts上已经有Clutter,但是编译和链接tests里面的c文件时报错,说是找不到_main的定义。定义在clutter-main.c里面,但是不知道为什么port编译后的库里面找不到这个引用。

于是自己编译。其实参考port的定义就很容易了:

./configure –with-flavour=osx –enable-introspection=no –disable-gtk-doc

这里和port不同的是用的是osx,而port用的是glx。然后make就没有错误了,可能刚开始运行port install clutter时把一些依赖的库比如cairo, mesa都安装了,这次才会这么顺利。

照提示的信息看,osx的这种beckend现在还是实验性的,尝试运行了clutter/tests/interactive,有的有问题,有的没有问题。下面是test-cairo-flowers的截图:(后来发现官方文档对这已经有描述了。。。)

最新For Lion: 这里有有份官方文档,看来这还真是混乱。现在configurate的时候会出现新的问题:

Requested ‘cogl-1.0 >= 1.9.6′ but version of COGL is 1.6.20

cogl是clutter自身带的,居然没有找到。我没有办法,只能把这些依赖从configurate里面删除。但是make时候出现错误“error: cogl/cogl.h: No such file or directory”,看来cogl不是clutter自带的,于是我试了下

git clone git://git.gnome.org/cogl

果然有这个项目,日啊。编译时用“./configure –prefix=/opt/local –disable-introspection”,否则又会有glib的错误。sudo make install后再回到clutter下面重新configure,果然cogl的错误信息没有了。

接下来在make clutter的时候,又出现错误:

‘trackingRect’ undeclared (first use in this function)

这个好像是objective-c代码上的问题,得修改代码么?痛苦啊。看了下,将就改成下面的。

- (NSTrackingRectTag) trackingRect
{
  return tracking_rect;
}

- (void) dealloc
{
  if (tracking_rect)
    {
      [self removeTrackingRect:tracking_rect];
      tracking_rect = 0;
    }

  [super dealloc];
}

/*
- (void) dealloc
{
  if (trackingRect)
    {
      [self removeTrackingRect:trackingRect];
      trackingRect = 0;
    }

  [super dealloc];
}
*/

make;make install现在都没有问题。不过在运行test case时出现问题,跳出一个X11的窗口,奇怪啊。

Cairo under Mac os X (Quartz)

1) Install Cairo for Mac. You can install it by darwinports. You should change the Portfile to enable cairo for configuration. The file located at /opt/local/var/macports/sources/rsync.macports.org/release/ports/graphics/cairo on my machine. Maybe there is another better way to do it, for example Port Variants.

2) check out the cairo demo code.
cvs -d :pserver:anoncvs@cvs.cairographics.org:/cvs/cairo co cairo-demo

3) Then there is a project named QuartzCaiorTest. Change the main.c to
use the new API

//surface = cairo_quartz_surface_create(context, width, height);
surface =  cairo_quartz_surface_create_for_cg_context(context, width, height);

4) run “make” within project directory.

cairo