Last active
June 4, 2020 18:26
-
-
Save shubhamnikam/866e4036960c047d0668964678585541 to your computer and use it in GitHub Desktop.
Medium Article - zoomview- ZoomView.java
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.theappnerds.zoomview; | |
import android.graphics.PointF; | |
import android.view.MotionEvent; | |
import android.view.View; | |
public class ZoomView { | |
float[] lastEvent = null; | |
float d = 0f; | |
float newRot = 0f; | |
private boolean isZoomAndRotate; | |
private boolean isOutSide; | |
private static final int NONE = 0; | |
private static final int DRAG = 1; | |
private static final int ZOOM = 2; | |
private int mode = NONE; | |
private PointF start = new PointF(); | |
private PointF mid = new PointF(); | |
float oldDist = 1f; | |
private float xCoOrdinate, yCoOrdinate; | |
public void setupZoom(View view) { | |
view.setOnTouchListener(new View.OnTouchListener() { | |
@Override | |
public boolean onTouch(View view, MotionEvent event) { | |
view.bringToFront(); | |
doViewTransformation(view, event); | |
return true; | |
} | |
}); | |
} | |
private void doViewTransformation(View view, MotionEvent event) { | |
switch (event.getAction() & MotionEvent.ACTION_MASK) { | |
case MotionEvent.ACTION_DOWN: | |
xCoOrdinate = view.getX() - event.getRawX(); | |
yCoOrdinate = view.getY() - event.getRawY(); | |
start.set(event.getX(), event.getY()); | |
isOutSide = false; | |
mode = DRAG; | |
lastEvent = null; | |
break; | |
case MotionEvent.ACTION_POINTER_DOWN: | |
oldDist = viewSpacing(event); | |
if (oldDist > 10f) { | |
viewMidPoint(mid, event); | |
mode = ZOOM; | |
} | |
lastEvent = new float[4]; | |
lastEvent[0] = event.getX(0); | |
lastEvent[1] = event.getX(1); | |
lastEvent[2] = event.getY(0); | |
lastEvent[3] = event.getY(1); | |
d = viewRotate(event); | |
break; | |
case MotionEvent.ACTION_UP: | |
isZoomAndRotate = false; | |
if (mode == DRAG) { | |
float x = event.getX(); | |
float y = event.getY(); | |
} | |
case MotionEvent.ACTION_OUTSIDE: | |
isOutSide = true; | |
mode = NONE; | |
lastEvent = null; | |
case MotionEvent.ACTION_POINTER_UP: | |
mode = NONE; | |
lastEvent = null; | |
break; | |
case MotionEvent.ACTION_MOVE: | |
if (!isOutSide) { | |
if (mode == DRAG) { | |
isZoomAndRotate = false; | |
view.animate().x(event.getRawX() + xCoOrdinate).y(event.getRawY() + yCoOrdinate).setDuration(0).start(); | |
} | |
if (mode == ZOOM && event.getPointerCount() == 2) { | |
float newDist1 = viewSpacing(event); | |
if (newDist1 > 10f) { | |
float scale = newDist1 / oldDist * view.getScaleX(); | |
view.setScaleX(scale); | |
view.setScaleY(scale); | |
} | |
if (lastEvent != null) { | |
newRot = viewRotate(event); | |
view.setRotation((float) (view.getRotation() + (newRot - d))); | |
} | |
} | |
} | |
break; | |
} | |
} | |
private float viewRotate(MotionEvent event) { | |
double delta_x = (event.getX(0) - event.getX(1)); | |
double delta_y = (event.getY(0) - event.getY(1)); | |
double radians = Math.atan2(delta_y, delta_x); | |
return (float) Math.toDegrees(radians); | |
} | |
private float viewSpacing(MotionEvent event) { | |
float x = event.getX(0) - event.getX(1); | |
float y = event.getY(0) - event.getY(1); | |
return (int) Math.sqrt(x * x + y * y); | |
} | |
private void viewMidPoint(PointF point, MotionEvent event) { | |
float x = event.getX(0) + event.getX(1); | |
float y = event.getY(0) + event.getY(1); | |
point.set(x / 2, y / 2); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment