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

이미지뷰 드래그하여 이동하는 것 질문입니다.

0 추천
public class MainActivity extends Activity {
 ViewTouchImage imgView;

 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);

  imgView = new ViewTouchImage(getApplicationContext());
  imgView.invalidate();
  setContentView(imgView);
  imgView.setImageResource(R.drawable.checkbox);
 }
}
class ViewTouchImage extends ImageView implements OnTouchListener {
 private static final String TAG = "ViewTouchImage";
 private static final boolean D = false;

 private Matrix matrix = new Matrix();
 private Matrix savedMatrix = new Matrix();
 private Matrix savedMatrix2 = new Matrix();

 private static final int NONE = 0;
 private static final int DRAG = 1;
 private int mode = NONE;

 private PointF start = new PointF();
 private PointF mid = new PointF();

 private static final int WIDTH = 0;
 private static final int HEIGHT = 1;

 private boolean isInit = false;

 public ViewTouchImage(Context context, AttributeSet attrs, int defStyle) {
  super(context, attrs, defStyle);

  setOnTouchListener(this);
  setScaleType(ScaleType.MATRIX);
 }

 public ViewTouchImage(Context context, AttributeSet attrs) {
  this(context, attrs, 0);
 }

 public ViewTouchImage(Context context) {
  this(context, null);
 }

 @Override
 protected void onLayout(boolean changed, int left, int top, int right,
   int bottom) {
  if (D)
   Log.i(TAG, "onLayout");
  super.onLayout(changed, left, top, right, bottom);
  if (isInit == false) {
   init();
   isInit = true;
  }
 }

 @Override
 public void setImageBitmap(Bitmap bm) {
  if (D)
   Log.i(TAG, "setImageBitmap");
  super.setImageBitmap(bm);
  isInit = false;
  init();
 }

 @Override
 public void setImageDrawable(Drawable drawable) {
  super.setImageDrawable(drawable);
  isInit = false;
  init();
 }

 @Override
 public void setImageResource(int resId) {
  super.setImageResource(resId);
  isInit = false;
  init();
 }

 protected void init() {
  matrixTurning(matrix, this);
  setImageMatrix(matrix);
  setImagePit();
 }

 public void setImagePit() {

  float[] value = new float[9];
  this.matrix.getValues(value);

  int width = this.getWidth();
  int height = this.getHeight();

  Drawable d = this.getDrawable();
  if (d == null)
   return;
  int imageWidth = d.getIntrinsicWidth();
  int imageHeight = d.getIntrinsicHeight();
  int scaleWidth = (int) (imageWidth * value[0]);
  int scaleHeight = (int) (imageHeight * value[4]);

  value[2] = 0;
  value[5] = 0;

  if (imageWidth > width || imageHeight > height) {
   int target = WIDTH;
   if (imageWidth < imageHeight)
    target = HEIGHT;

   if (target == WIDTH)
    value[0] = value[4] = (float) width / imageWidth;
   if (target == HEIGHT)
    value[0] = value[4] = (float) height / imageHeight;

   scaleWidth = (int) (imageWidth * value[0]);
   scaleHeight = (int) (imageHeight * value[4]);

   if (scaleWidth > width)
    value[0] = value[4] = (float) width / imageWidth;
   if (scaleHeight > height)
    value[0] = value[4] = (float) height / imageHeight;
  }

  matrix.setValues(value);

  setImageMatrix(matrix);
 }

 @Override
 public boolean onTouch(View v, MotionEvent event) {
  ImageView view = (ImageView) v;

  switch (event.getAction() & MotionEvent.ACTION_MASK) {
  case MotionEvent.ACTION_DOWN:
   savedMatrix.set(matrix);
   start.set(event.getX(), event.getY());
   mode = DRAG;
   break;

  case MotionEvent.ACTION_POINTER_UP:
   mode = NONE;
   break;
  case MotionEvent.ACTION_MOVE:
   if (mode == DRAG) {
    matrix.set(savedMatrix);
    matrix.postTranslate(event.getX() - start.x, event.getY()
      - start.y);
   } 
   break;
  }

  // 매트릭스 값 튜닝.
  matrixTurning(matrix, view);

  view.setImageMatrix(matrix);

  return true;
 }

 private void matrixTurning(Matrix matrix, ImageView view) {

  float[] value = new float[9];
  matrix.getValues(value);
  float[] savedValue = new float[9];
  savedMatrix2.getValues(savedValue);

  int width = view.getWidth();
  int height = view.getHeight();

  Drawable d = view.getDrawable();
  if (d == null)
   return;
  int imageWidth = d.getIntrinsicWidth();
  int imageHeight = d.getIntrinsicHeight();
  int scaleWidth = (int) (imageWidth * value[0]);
  int scaleHeight = (int) (imageHeight * value[4]);

  if (value[2] < width - scaleWidth)
   value[2] = width - scaleWidth;
  if (value[5] < height - scaleHeight)
   value[5] = height - scaleHeight;
  if (value[2] > 0)
   value[2] = 0;
  if (value[5] > 0)
   value[5] = 0;

  matrix.setValues(value);
  savedMatrix2.set(matrix);
 }
}

위의 코드는 이미지뷰를 드래그해서 이동하는 코드인데요

실행해보니 드래그해서 이동이 되지 않고있습니다.

제대로 작동해야되는것 같은데 이유를 모르겠네요;;

아시는분 도움 부탁드립니다!

익명사용자 님이 2014년 9월 5일 질문

답변 달기

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