Skip to content

Commit

Permalink
优化地图刷新机制 (按住时不刷新)
Browse files Browse the repository at this point in the history
  • Loading branch information
ydcool authored and ydcool committed Sep 19, 2016
1 parent a4f5efa commit 7397097
Show file tree
Hide file tree
Showing 2 changed files with 74 additions and 73 deletions.
145 changes: 72 additions & 73 deletions library/src/main/java/com/onlylemi/mapview/library/MapView.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,7 @@
import android.graphics.Matrix;
import android.graphics.Picture;
import android.graphics.PointF;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
Expand All @@ -29,33 +27,27 @@
public class MapView extends SurfaceView implements SurfaceHolder.Callback {

private static final String TAG = "MapView";

private static final int TOUCH_STATE_NO = 0; // no touch
private static final int TOUCH_STATE_SCROLL = 1; // scroll(one point)
private static final int TOUCH_STATE_SCALE = 2; // scale(two points)
private static final int TOUCH_STATE_ROTATE = 3; // rotate(two points)
private static final int TOUCH_STATE_TWO_POINTED = 4; // two points touch
private SurfaceHolder holder;
private MapViewListener mapViewListener = null;
private boolean isMapLoadFinish = false;
private List<MapBaseLayer> layers; // all layers
private MapLayer mapLayer;

private Canvas canvas;

private float minZoom = 0.5f;
private float maxZoom = 3.0f;

private PointF startTouch = new PointF();
private PointF lastMove = new PointF();
private PointF mid = new PointF();

private Matrix saveMatrix = new Matrix();
private Matrix currentMatrix = new Matrix();
private float currentZoom = 1.0f;
private float saveZoom = 0f;
private float currentRotateDegrees = 0.0f;
private float saveRotateDegrees = 0.0f;

private static final int TOUCH_STATE_NO = 0; // no touch
private static final int TOUCH_STATE_SCROLL = 1; // scroll(one point)
private static final int TOUCH_STATE_SCALE = 2; // scale(two points)
private static final int TOUCH_STATE_ROTATE = 3; // rotate(two points)
private static final int TOUCH_STATE_TWO_POINTED = 4; // two points touch
private int currentTouchState = MapView.TOUCH_STATE_NO; // default touch state

private float oldDist = 0, oldDegree = 0;
Expand Down Expand Up @@ -123,7 +115,7 @@ public void surfaceDestroyed(SurfaceHolder holder) {
*/
public void refresh() {
if (holder != null) {
canvas = holder.lockCanvas();
Canvas canvas = holder.lockCanvas();
if (canvas != null) {
canvas.drawColor(-1);
if (isMapLoadFinish) {
Expand Down Expand Up @@ -188,6 +180,7 @@ public boolean onTouchEvent(MotionEvent event) {
case MotionEvent.ACTION_DOWN:
saveMatrix.set(currentMatrix);
startTouch.set(event.getX(), event.getY());
lastMove.set(event.getX(), event.getY());
currentTouchState = MapView.TOUCH_STATE_SCROLL;
break;
case MotionEvent.ACTION_POINTER_DOWN:
Expand Down Expand Up @@ -217,75 +210,81 @@ public boolean onTouchEvent(MotionEvent event) {
currentTouchState = MapView.TOUCH_STATE_NO;
break;
case MotionEvent.ACTION_MOVE:
switch (currentTouchState) {
case MapView.TOUCH_STATE_SCROLL:
currentMatrix.set(saveMatrix);
currentMatrix.postTranslate(event.getX() - startTouch.x, event.getY() -
startTouch.y);
refresh();
break;
case MapView.TOUCH_STATE_TWO_POINTED:
if (!isScaleAndRotateTogether) {
float x = oldDist;
float y = MapMath.getDistanceBetweenTwoPoints(event.getX(0),
event.getY(0), startTouch.x, startTouch.y);
float z = distance(event, mid);
float cos = (x * x + y * y - z * z) / (2 * x * y);
float degree = (float) Math.toDegrees(Math.acos(cos));

if (degree < 120 && degree > 45) {
oldDegree = rotation(event, mid);
currentTouchState = MapView.TOUCH_STATE_ROTATE;
if (Math.abs(event.getX() - lastMove.x) > 0
&& Math.abs(event.getY() - lastMove.y) > 0) {
switch (currentTouchState) {
case MapView.TOUCH_STATE_SCROLL:
currentMatrix.set(saveMatrix);
currentMatrix.postTranslate(event.getX() - startTouch.x, event.getY() -
startTouch.y);
refresh();
break;
case MapView.TOUCH_STATE_TWO_POINTED:
if (!isScaleAndRotateTogether) {
float x = oldDist;
float y = MapMath.getDistanceBetweenTwoPoints(event.getX(0),
event.getY(0), startTouch.x, startTouch.y);
float z = distance(event, mid);
float cos = (x * x + y * y - z * z) / (2 * x * y);
float degree = (float) Math.toDegrees(Math.acos(cos));

if (degree < 120 && degree > 45) {
oldDegree = rotation(event, mid);
currentTouchState = MapView.TOUCH_STATE_ROTATE;
} else {
oldDist = distance(event, mid);
currentTouchState = MapView.TOUCH_STATE_SCALE;
}
} else {
oldDist = distance(event, mid);
currentTouchState = MapView.TOUCH_STATE_SCALE;
currentMatrix.set(saveMatrix);
newDist = distance(event, mid);
newDegree = rotation(event, mid);

float rotate = newDegree - oldDegree;
float scale = newDist / oldDist;
if (scale * saveZoom < minZoom) {
scale = minZoom / saveZoom;
} else if (scale * saveZoom > maxZoom) {
scale = maxZoom / saveZoom;
}
currentZoom = scale * saveZoom;
currentRotateDegrees = (newDegree - oldDegree + currentRotateDegrees)
% 360;
currentMatrix.postScale(scale, scale, mid.x, mid.y);
currentMatrix.postRotate(rotate, mid.x, mid.y);
refresh();
}
} else {
break;
case MapView.TOUCH_STATE_SCALE:
currentMatrix.set(saveMatrix);
newDist = distance(event, mid);
newDegree = rotation(event, mid);

float rotate = newDegree - oldDegree;
// newDegree = rotation(event, mid);
// float rotate = newDegree - oldDegree;
float scale = newDist / oldDist;
if (scale * saveZoom < minZoom) {
scale = minZoom / saveZoom;
} else if (scale * saveZoom > maxZoom) {
scale = maxZoom / saveZoom;
}
currentZoom = scale * saveZoom;
currentRotateDegrees = (newDegree - oldDegree + currentRotateDegrees)
% 360;
currentMatrix.postScale(scale, scale, mid.x, mid.y);
refresh();
break;
case MapView.TOUCH_STATE_ROTATE:
currentMatrix.set(saveMatrix);
newDegree = rotation(event, mid);
float rotate = newDegree - oldDegree;
currentRotateDegrees = (rotate + saveRotateDegrees) % 360;
currentRotateDegrees = currentRotateDegrees > 0 ? currentRotateDegrees :
currentRotateDegrees + 360;
currentMatrix.postRotate(rotate, mid.x, mid.y);
refresh();
}
break;
case MapView.TOUCH_STATE_SCALE:
currentMatrix.set(saveMatrix);
newDist = distance(event, mid);
float scale = newDist / oldDist;
if (scale * saveZoom < minZoom) {
scale = minZoom / saveZoom;
} else if (scale * saveZoom > maxZoom) {
scale = maxZoom / saveZoom;
}
currentZoom = scale * saveZoom;
currentMatrix.postScale(scale, scale, mid.x, mid.y);
refresh();
break;
case MapView.TOUCH_STATE_ROTATE:
currentMatrix.set(saveMatrix);
newDegree = rotation(event, mid);
float rotate = newDegree - oldDegree;
currentRotateDegrees = (rotate + saveRotateDegrees) % 360;
currentRotateDegrees = currentRotateDegrees > 0 ? currentRotateDegrees :
currentRotateDegrees + 360;
currentMatrix.postRotate(rotate, mid.x, mid.y);
refresh();
// Log.i(TAG, "rotate:" + currentRotateDegrees);
break;
default:
break;
break;
default:
break;
}
lastMove.set(event.getX(), event.getY());
}
break;
default:
Expand Down Expand Up @@ -399,6 +398,10 @@ public float getCurrentZoom() {
return currentZoom;
}

public void setCurrentZoom(float zoom) {
setCurrentZoom(zoom, getWidth() / 2, getHeight() / 2);
}

public boolean isScaleAndRotateTogether() {
return isScaleAndRotateTogether;
}
Expand All @@ -420,10 +423,6 @@ public void setMinZoom(float minZoom) {
this.minZoom = minZoom;
}

public void setCurrentZoom(float zoom) {
setCurrentZoom(zoom, getWidth() / 2, getHeight() / 2);
}

public void setCurrentZoom(float zoom, float x, float y) {
currentMatrix.postScale(zoom / this.currentZoom, zoom / this.currentZoom, x, y);
this.currentZoom = zoom;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,8 @@ public void draw(Canvas canvas, Matrix currentMatrix, float currentZoom, float
nodeList.get(routeList.get(i + 1)).y};
currentMatrix.mapPoints(goal1);
currentMatrix.mapPoints(goal2);
//For test
paint.setColor(Color.rgb((int) (Math.random() * 255d), (int) (Math.random() * 255d), (int) (Math.random() * 255d)));
paint.setStrokeWidth(routeWidth);
canvas.drawLine(goal1[0], goal1[1], goal2[0], goal2[1], paint);
}
Expand Down

0 comments on commit 7397097

Please sign in to comment.