package com.example.test;
import android.app.Activity;
import android.content.Context;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.os.Bundle;
import android.util.FloatMath;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
public class MainActivity extends Activity {
DragView dragView;
public static PointF mid = new PointF();
public static int mode = 0;
public static float TWO_PI = 360;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
dragView = new DragView(this);
setContentView(dragView);
}
class DragView extends ImageView {
private float oldDist;
public static final int DRAG = 1;
public static final int NONE = 0;
private static final String TAG = "Touch";
public static final int ZOOM = 2;
float d = 0.0F;
private Matrix savedMatrix;
private Matrix matrix;
private PointF start;
private float lastAngle=0;
//현재 손가락 각도
private float thisAngle=0;
//변화각도
private float deltaAngle;
//현재 회전판 각도
private float angle;
public DragView(Context context){
super(context);
super.setScaleType(ImageView.ScaleType.MATRIX);
super.setImageResource(R.drawable.m_compass);
init();
super.setOnTouchListener(t);
}
private void init(){
savedMatrix = new Matrix();
matrix = new Matrix();
start = new PointF();
}
View.OnTouchListener t = new View.OnTouchListener(){
public boolean onTouch(View paramView, MotionEvent event){
ImageView view = (ImageView)paramView;
switch (event.getAction() & MotionEvent.ACTION_MASK)
{
case MotionEvent.ACTION_DOWN:
// savedMatrix.set(matrix);
// start.set(event.getX(), event.getY());
Log.d(TAG, "mode=DRAG" );
mode = DRAG;
break;
case MotionEvent.ACTION_POINTER_DOWN:
oldDist = spacing(event);
Log.d(TAG, "oldDist=" + oldDist);
if (oldDist > 10f) {
savedMatrix.set(matrix);
midPoint(mid, event);
mode = ZOOM;
Log.d(TAG, "mode=ZOOM" );
}
break;
case MotionEvent.ACTION_MOVE:
if (mode == DRAG) {
matrix.set(savedMatrix);
// matrix.postTranslate(event.getX() - start.x, event.getY() - start.y); // 이동
}
else if (mode == ZOOM) {
float newDist = spacing(event);
Log.d(TAG, "newDist=" + newDist);
matrix.set(savedMatrix);
float scale = newDist / oldDist;
// matrix.postScale(scale, scale, mid.x, mid.y);
setRotate(event);
}
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP:
mode = NONE;
Log.d(TAG, "mode=NONE" );
break;
}
view.setImageMatrix(matrix);
return true;
}
private void midPoint(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);
}
//
private float spacing(MotionEvent event) {
float x = event.getX(0) - event.getX(1);
float y = event.getY(0) - event.getY(1);
return FloatMath.sqrt(x * x + y * y);
}
private void setRotate(MotionEvent event){
matrix.set(savedMatrix);
float x1 = event.getX(0);
float y1 = event.getY(0);
float x2 = event.getX(1);
float y2 = event.getY(1);
thisAngle = (float)Math.toDegrees(Math.atan2((y1-y2), (x2-x1)));
Log.d("TAG", "thisAngle : " + thisAngle);
if(lastAngle==0){
lastAngle=thisAngle;
}
deltaAngle = thisAngle-lastAngle;
angle += -deltaAngle;
lastAngle = thisAngle;
Log.d("TAG", "deltaAngle : " + deltaAngle);
Log.d("TAG", "lastAngle : " + lastAngle);
Log.d("TAG", "Angle : " + angle);
matrix.postRotate(angle, mid.x, mid.y);
}
};
}
}
코드에서 이동이랑 확대 축소는 주석처리했구요
필요한 부분이 회전부분뿐이라 하고 있는중인데
회전을 돌릴때 예를들어 복불복판이나 돌림판같이 일정 축을 기준으로 돌릴수없나요?ㅠㅠ