标签:
两种方法:
OnScaleGestureListener listener = new OnScaleGestureListener() {@Overridepublic void onScaleEnd(ScaleGestureDetector detector) {Log.i("OnScaleGestureListener", "onScaleEnd");}@Overridepublic boolean onScaleBegin(ScaleGestureDetector detector) {Log.i("OnScaleGestureListener", "onScaleBegin");return true;}@Overridepublic boolean onScale(ScaleGestureDetector detector) {Log.i("OnScaleGestureListener", "onScale");float dXStart = detector.getPreviousSpanX();float dXEnd = detector.getCurrentSpanX();float dScale = (dXEnd - dXStart) / getWidth();scale += dScale;if(scale > 3f) {scale = 3f;}if(scale < 1) {scale = 1f;}// Log.i("xFirstStart,xSecondStart,xFirstEnd", xFirstStart + "," + xSecondStart + "," + xFirstEnd + "," + xSecondEnd);// Log.i("dXStart,dXEnd,scale,kcvKchart.getWidth()", dXStart + "," + dXEnd + "," + scale + "," + kcvKchart.getWidth());setScaleX(scale);return false;}};
// 没有使用MotionEvent.ACTION_POINTER_DOWN事件kcvKchart.setOnTouchListener(new OnTouchListener() {private float xFirstStart;private float xSecondStart;private float xFirstEnd;private float xSecondEnd;private int dXFirst;private int oldPointerCount;private int newPointerCount;private float scale = 1f;@Overridepublic boolean onTouch(View v, MotionEvent event) {// can be written in KChartView‘s onTouchEven(--)switch (event.getAction()) {case MotionEvent.ACTION_DOWN:xFirstStart = event.getX();// to WindowScreenoldPointerCount = event.getPointerCount();break;case MotionEvent.ACTION_MOVE:newPointerCount = event.getPointerCount();if(newPointerCount == 1) {// one finger translatexFirstEnd = event.getX();dXFirst = Math.round(xFirstStart - xFirstEnd);// the closest integer to the argument,including positive & negative .// TODO condition:if left x axis < 0 || right x axis > view.getWidth, then left x=0 || right x=view.getWidth returnkcvKchart.scrollBy(dXFirst, 0); // can called repeatedly// Log.i("startX - endX, distanceX", xFirstStart - xFirstEnd + "," + dXFirst);xFirstStart = xFirstEnd;} else {// two or more finger scalexFirstEnd = event.getX();xSecondEnd = event.getX(1);if(oldPointerCount == 1) {// initialize second pointer axis// 由于第二个pointer的初始坐标不能再down事件中获取,只能在第一次move时获取,故第一次move不能进行缩放,需要过滤oldPointerCount = newPointerCount;} else {float dXStart = Math.abs(xFirstStart - xSecondStart);float dXEnd = Math.abs(xFirstEnd - xSecondEnd);float dScale = (dXEnd - dXStart) / kcvKchart.getWidth();scale += dScale;if(scale > 3f) {scale = 3f;}if(scale < 1) {scale = 1f;}// Log.i("xFirstStart,xSecondStart,xFirstEnd", xFirstStart + "," + xSecondStart + "," + xFirstEnd + "," + xSecondEnd);// Log.i("dXStart,dXEnd,scale,kcvKchart.getWidth()", dXStart + "," + dXEnd + "," + scale + "," + kcvKchart.getWidth());kcvKchart.setScaleX(scale);}xFirstStart = xFirstEnd;xSecondStart = xSecondEnd;}break;case MotionEvent.ACTION_POINTER_DOWN:break;default:break;}return true;}} );
标签:
原文地址:http://www.cnblogs.com/chenchengzhi/p/4915227.html