wv.setOnTouchListener(new OnTouchListener() { private float OldX1, OldY1, OldX2, OldY2; private float NewX1, NewY1, NewX2, NewY2; @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_POINTER_2_DOWN: if (event.getPointerCount() == 2) { OldX1 = event.getX(0); OldY1 = event.getY(0); OldX2 = event.getX(1); OldY2 = event.getY(1); } break; case MotionEvent.ACTION_MOVE: if (event.getPointerCount() == 2) { if(OldX1 == -1 && OldX2 == -1) break; NewX1 = event.getX(0); NewY1 = event.getY(0); NewX2 = event.getX(1); NewY2 = event.getY(1); float disOld = (float) Math.sqrt((Math.pow(OldX2 - OldX1, 2) + Math.pow(OldY2 - OldY1, 2))); float disNew = (float) Math.sqrt((Math.pow(NewX2 - NewX1, 2) + Math.pow(NewY2 - NewY1, 2))); Log.e("onTouch", "disOld=" + disOld + "|disNew=" + disNew); if (disOld - disNew >= 25) { // 缩小 // wv.zoomOut(); wv.loadUrl("javascript:mapScale=1;"); Log.e("onTouch", "zoomOut"); } else if (disNew - disOld >= 25) { // 放大 // wv.zoomIn(); wv.loadUrl("javascript:mapScale=-1;"); Log.e("onTouch", "zoomIn"); } OldX1 = NewX1; OldX2 = NewX2; OldY1 = NewY1; OldY2 = NewY2; } break; case MotionEvent.ACTION_UP: if (event.getPointerCount() < 2) { OldX1 = -1; OldY1 = -1; OldX2 = -1; OldY2 = -1; } break; } return false; } });
代码很容易理解 判断触控的手指数 同时去比较前后2点间的距离 从而做到手势缩放 最后发送消息到webview
在js中这里是模拟了鼠标滚轮的缩放 所以只给了一个mapscale 具体的情况也可以在js中提供一个放大缩小视口的接口 直接调用等多种方式
仅起到抛砖引玉的作用