之前在某车的中控台上看到三指缩放回到桌面,当时看到效果觉得挺酷的,今天心血来潮的想实现这个功能。
三指缩放主要涉及到的知识点有多点触控和事件分发,这两块内容大家应该都不陌生,网上的资料一堆堆的。
先上代码
switch (ev.getActionMasked()) {
case MotionEvent.ACTION_POINTER_DOWN:
if (ev.getPointerCount() == 3) {
// 当有三个手指按在屏幕上时,计算三指之间的面积
firstFingerDis = distanceBetweenFingers(ev);
}
break;
case MotionEvent.ACTION_MOVE:
if (ev.getPointerCount() == 3) {
// 当有三个手指按在屏幕上滑动时,计算三指之间的面积
lastFingerDis = distanceBetweenFingers(ev);
if (firstFingerDis / lastFingerDis > 2) {
Intent home = new Intent(Intent.ACTION_MAIN);
home.addCategory(Intent.CATEGORY_HOME);
startActivity(home);
return true;
}
}
break;
}
MotionEvent.getActionMasked()是多点触控获取事件类型的方法,MotionEvent.getPointerCount(),获取当前触碰屏幕的手指个数,因为需要三指缩放,判断三个手指在屏幕才执行相对应逻辑,我这里通过计算三点之间的面积判断是否缩放。
计算三点面积
private double distanceBetweenFingers(MotionEvent event) {
//0、1之间的距离
float dis0_1X = Math.abs(event.getX(0) - event.getX(1));
float dis0_1Y = Math.abs(event.getY(0) - event.getY(1));
double disA = Math.sqrt(dis0_1X * dis0_1X + dis0_1Y * dis0_1Y);
//1、2之间的距离
float dis0_2X = Math.abs(event.getX(0) - event.getX(2));
float dis0_2Y = Math.abs(event.getY(0) - event.getY(2));
double disB = Math.sqrt(dis0_2X * dis0_2X + dis0_2Y * dis0_2Y);
//1、2之间的距离
float dis1_2X = Math.abs(event.getX(1) - event.getX(2));
float dis1_2Y = Math.abs(event.getY(1) - event.getY(2));
double disC = Math.sqrt(dis1_2X * dis1_2X + dis1_2Y * dis1_2Y);
//利用海伦公式获取三角形的面积
double s = (disA + disB + disC) / 2;//三角形周长一半
return Math.sqrt(s * (s - disA) * (s -disB) * (s - disC));
}
根据事件的分发可知道,最先处理触摸事件是activity的dispatchTouchEvent,在源码中Activity的dispatchTouchEvent方法中加入此逻辑即可,然后编译android工程,烧写到开发版。