마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

matrix rotate를 이용해서 이미지를 회전하는 데요 회전축을 지정할수 있나요

0 추천
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);
    }
       };
  }
 }

 

코드에서 이동이랑 확대 축소는 주석처리했구요

 

필요한 부분이 회전부분뿐이라 하고 있는중인데

회전을 돌릴때 예를들어 복불복판이나 돌림판같이 일정 축을 기준으로 돌릴수없나요?ㅠㅠ
익명사용자 님이 2013년 5월 29일 질문

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...