最近要做个多点触摸的东西,由于多点触摸的支持是从API Level 5开始的,所以如果工程设置了2.1以下的版本则不能编译,那几个像getPointerCount() 之类的函数就会打个红叉,那么怎么办呢,总不能2.1以下发个版本,2.1以上也发个版本? 想想C/C++ ,那个#ifdef / #ifndef 真是太好使了,哈哈,但这是Java,没办法,于是我想到了Java反射机制。
我的思路是这样的:首先我定义一个专门负责反射的类,在这里我们用class ReflectDemo来表示,由于要使用 SDK中的getPointCount,getX(int index),getY(int index)等函数,所以我也在ReflectDemo中定义类似的函数,类定义如下:
public class ReflectDemo
{
public ReflectDemo()
{
}
public int getPointCount(Object obj)
{
int num=1;
Class c=MotionEvent.class;
try{
Method m=c.getDeclaredMethod(“getPointCount”);
//如果函数为有参数函数 则应该是这样调用Method m=c.getDeclaredMethod(func,param);
num=(int)m.invoke(obj) ;//此处的obj 为 onTouchEvent(MotionEvent event)的event 这个实例
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return num;
}
…
//其他需要反射的函数
}
这样我们在onTouchEvent(MotionEvent event)中不管系统哪一个版本都可以调用自己的getPointerCount,这样如果系统不支持,那么也会返回1,表示单点触摸,这样就很好的避免了编译问题。
本人Java也是入门级别,所以很多地方难免会出现错误,如有发现,还敬请赐教。在这里只是把自己的想法写出来,不知道还有没有什么别的好方法,欢迎大家一起讨论。