총 게시물 934건, 최근 0 건 안내 RSS 글쓰기
이전글  다음글  목록 글쓰기
[안드로이드]

하다하다 진짜 안되서..ㅠㅠ

글쓴이 : 우흣 날짜 : 2012-01-09 (월) 22:20 조회 : 23092
글주소 : http://www.androidside.com/B49_best/360
 
  유경,연돌 stack린넨슈트
유경산업, 연돌, stack, 린넨슈트
www.yk2.co.kr
  굴뚝공사전문 미래환경산업
연돌, 연돌보수, 굴뚝, 굴뚝보수, 공사, 청소, 철거전문, 방수코팅, 안전도검사
www.miraestack.co.kr
  댐퍼전문기업 남광엔지니어링
STACK전문, DAMPER, BUTTERFLY, LOUVER, DIVERTER.
www.damper.co.kr
신청하기


제가 안드로이드 멀티터치(?)를 구현하려고 하는데요 진짜 하다하다 안되서 질문드립니다.
 
일단 참조한 사이트는
 
 
구요.
 
제가 만든 소스는(어짜치 가따 붙인거긴하지만...;;;;) 
 
 Map_touchActivity.java
 

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.widget.ImageView;

public class Map_touchActivity extends Activity {
    
 @Override
  public void onCreate(Bundle savedInstanceState){
  super.onCreate(savedInstanceState);
  Map_touchView img = new Map_touchView(this);
  // ImageView img = new ImageView(this);
  Bitmap snoop = BitmapFactory.decodeResource(getResources(), R.drawable.subway_map);
  img.setImageBitmap(snoop);
  img.setMaxZoom(4f);
  //change the max level of zoom, default is 3f
  setContentView(img);
 }
}
 
 
 
 
 
 
 
 
 
Map_touchView.java
 
 
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.ScaleGestureDetector;
import android.view.View;
import android.widget.ImageView;
 
public class Map_touchView extends ImageView {
 
 Matrix matrix = new Matrix();
 
 // We can be in one of these 3 states
 static final int NonE = 0;
 static final int DRAG = 1;
 static final int ZOOM = 2;
 int mode = NONE;
 
 // Remember some things for zooming
 PointF last = new PointF();
 PointF start = new PointF();
 float minScale = 1f;
 float maxScale = 3f;
 float[] m;
 
 float redundantXSpace, redundantYSpace;
 
 float width, height;
 static final int CLICK = 3;
 float saveScale = 1f;
 float right, bottom, origWidth, origHeight, bmWidth, bmHeight;
 
 ScaleGestureDetector mScaleDetector;
 
 Context context;
 
 
 public Map_touchView(Context context, AttributeSet attrs){
  super(context , attrs);
  super.setClickable(true);
  this.context = context;
  mScaleDetector = new ScaleGestureDetector(context, new ScaleListener());
  matrix.setTranslate(1f, 1f);
  m = new float[9];
  setImageMatrix(matrix);
  setScaleType(ScaleType.MATRIX);
 
  setOnTouchListener(new OnTouchListener() {
 
   @Override
   public boolean onTouch(View v, MotionEvent event) {
    mScaleDetector.onTouchEvent(event);
 
    matrix.getValues(m);
    float x = m[Matrix.MTRANS_X];
    float y = m[Matrix.MTRANS_Y];
    PointF curr = new PointF(event.getX(), event.getY());
 
    switch (event.getAction()) {
                 case MotionEvent.ACTION_DOWN:
                  last.set(event.getX(), event.getY());
                  start.set(last);
                  mode = DRAG;
                  break;
                 case MotionEvent.ACTION_MOVE:
                  if (mode == DRAG) {
                   float deltaX = curr.x - last.x;
                   float deltaY = curr.y - last.y;
                   float scaleWidth = Math.round(origWidth * saveScale);
                   float scaleHeight = Math.round(origHeight * saveScale);
                   if (scaleWidth < width) {
                    deltaX = 0;
                    if (y + deltaY > 0)
                     deltaY = -y;
                    else if (y + deltaY < -bottom)
                     deltaY = -(y + bottom); 
                   } else if (scaleHeight < height) {
                    deltaY = 0;
                    if (x + deltaX > 0)
                     deltaX = -x;
                    else if (x + deltaX < -right)
                     deltaX = -(x + right);
                   } else {
                    if (x + deltaX > 0)
                     deltaX = -x;
                    else if (x + deltaX < -right)
                     deltaX = -(x + right);
 
                    if (y + deltaY > 0)
                     deltaY = -y;
                    else if (y + deltaY < -bottom)
                     deltaY = -(y + bottom);
                   }
                   matrix.postTranslate(deltaX, deltaY);
                   last.set(curr.x, curr.y);
                  }
                  break;
 
                 case MotionEvent.ACTION_UP:
                  mode = NONE;
                  int xDiff = (int) Math.abs(curr.x - start.x);
                  int yDiff = (int) Math.abs(curr.y - start.y);
                  if (xDiff < CLICK && yDiff < CLICK)
                         performClick();
                  break;
 
                 case MotionEvent.ACTION_POINTER_UP:
                  mode = NONE;
                  break;
    }
    setImageMatrix(matrix);
    invalidate();
    return true; // indicate event was handled
   }
 
  });
 }
 
 @Override
 public void setImageBitmap(Bitmap bm) { 
  super.setImageBitmap(bm);
  bmWidth = bm.getWidth();
  bmHeight = bm.getHeight();
 }
 
 public void setMaxZoom(float x)
 {
  maxScale = x;
 }
 
 private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
  @Override
  public boolean onScaleBegin(ScaleGestureDetector detector) {
   mode = ZOOM;
   return true;
  }
 
  @Override
  public boolean onScale(ScaleGestureDetector detector) {
   float mScaleFactor = (float)Math.min(Math.max(.95f, detector.getScaleFactor()), 1.05);
   float origScale = saveScale;
   saveScale *= mScaleFactor;
   if (saveScale > maxScale) {
    saveScale = maxScale;
    mScaleFactor = maxScale / origScale;
   } else if (saveScale < minScale) {
    saveScale = minScale;
    mScaleFactor = minScale / origScale;
   }
   right = width * saveScale - width - (2 * redundantXSpace * saveScale);
   bottom = height * saveScale - height - (2 * redundantYSpace * saveScale);
   if (origWidth * saveScale <= width || origHeight * saveScale <= height) {
    matrix.postScale(mScaleFactor, mScaleFactor, width / 2, height / 2);
    if (mScaleFactor < 1) {
     matrix.getValues(m);
     float x = m[Matrix.MTRANS_X];
     float y = m[Matrix.MTRANS_Y];
     if (mScaleFactor < 1) {
      if (Math.round(origWidth * saveScale) < width) {
       if (y < -bottom)
        matrix.postTranslate(0, -(y + bottom));
       else if (y > 0)
        matrix.postTranslate(0, -y);
      } else {
       if (x < -right) 
        matrix.postTranslate(-(x + right), 0);
       else if (x > 0) 
        matrix.postTranslate(-x, 0);
      }
     }
    }
   } else {
    matrix.postScale(mScaleFactor, mScaleFactor, detector.getFocusX(), detector.getFocusY());
    matrix.getValues(m);
    float x = m[Matrix.MTRANS_X];
    float y = m[Matrix.MTRANS_Y];
    if (mScaleFactor < 1) {
     if (x < -right) 
      matrix.postTranslate(-(x + right), 0);
     else if (x > 0) 
      matrix.postTranslate(-x, 0);
     if (y < -bottom)
      matrix.postTranslate(0, -(y + bottom));
     else if (y > 0)
      matrix.postTranslate(0, -y);
   }
   }
   return true;
 
  }
 }
 
 @Override
 protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec)
 {
  super.onMeasure(widthMeasureSpec, heightMeasureSpec);
  width = MeasureSpec.getSize(widthMeasureSpec);
  height = MeasureSpec.getSize(heightMeasureSpec);
  //Fit to screen.
  float scale;
  float scaleX =  (float)width / (float)bmWidth;
  float scaleY = (float)height / (float)bmHeight;
  scale = Math.min(scaleX, scaleY);
  matrix.setScale(scale, scale);
  setImageMatrix(matrix);
  saveScale = 1f;
 
  // Center the image
  redundantYSpace = (float)height - (scale * (float)bmHeight) ;
  redundantXSpace = (float)width - (scale * (float)bmWidth);
  redundantYSpace /= (float)2;
  redundantXSpace /= (float)2;
 
  matrix.postTranslate(redundantXSpace, redundantYSpace);
 
  origWidth = width - 2 * redundantXSpace;
  origHeight = height - 2 * redundantYSpace;
  right = width * saveScale - width - (2 * redundantXSpace * saveScale);
  bottom = height * saveScale - height - (2 * redundantYSpace * saveScale);
  setImageMatrix(matrix);
 }
 
}
 
입니다.
 
여기서 Map_touchActivity.java 내용중
 
밑에서 9번째줄
 
Map_touchView img = new Map_touchView(this);
 
에서  new Map_touchView(this);가 오류가 납니다.
 
 
오류구문
The constructor Map_touchView(Map_touchActivity) is undefined
 
 
이래바꿔보고 저래 바꿔바도 도무지 모르겠습니다.ㅠ;
 
 
 
 
한가지 더 궁금한점은 xml 파일을 만들때
 
<com.example.TouchImageView android:id="@+id/img" />
 
(제경우는<pakage.Alarm_subway.Map_touchView android:id="@+id/img" />겟죠?)
 
이미지를 불러오는 것같은데
 
당최 어케쓰는지 모르겠습니다..ㅡㅅㅡ;;
 
 
좀 도와주세요~~ㅜㅜ
 
 
 
 




질문답변 게시판에서 궁금한 사항을 해결하셨다면, 애써 답변해주신 분께 잘 되었다고 따뜻한 댓글 한마디 남겨주세요.
그리고 답변해주신 분의 글을 '추천' 해주세요.
추천받으신 분에게 1포인트가, 추천하신 분에게도 1포인트가 적립됩니다. ^^

덧없음 2012-01-10 (화) 09:35
Map_touchView img = new Map_touchView(this);
객체를 만들때 this를 파라메터로 넣어주셨는데
Map_touchView에는 해당 파라메터를 받는 생성자가 존재하지 않습니다.
링크따라 가봤는데 뭘 보고 하셨는지는 모르겠지만;
댓글주소 추천 0 반대 0
저하늘의별 2012-01-10 (화) 09:41
윗분 말씀 처럼 생성자가 Context 만 받는건 없네요
추가해 주시거나 아님 생성하실때 Context 와 AttributeSet 도 같이 넣어서 생성하세요
댓글주소 추천 0 반대 0
     
     
우흣 2012-01-10 (화) 13:08
저하늘의 별님 답을 보고 AtrributeSet부분때문에 오류가 생기나?
 
해서 그부분을 지워봤더니 오류가 없어지네요~
 
답변 감사드립니다^^
 
근데 왜!!! 글쓴이는 AtrriburteSet을 넣으라고 했을까요?;;;
 
흠....
 
이게또 궁금하네...;;;
 
쨌든 일단 오류는 없앴으니 성공입니다^^
 
감사드려요^^
댓글주소 추천 0 반대 0
우흣 2012-01-10 (화) 12:36
덧없음님 ///
 
앤 위의 소스를 보고 만든데 아니구요
 
그아래의 왼쪽의 숫자 21이라고 적혀있는 소스를 보고 만든겁니다.
 
제가 궁금한게 그거거에요..ㅜㅜ;
 
생성자가 없는게 왜 그렇게 해놨는지..
 
적혀있는 댓글 보면 남들은 그레이트~~막이러는데 나만왜이랴..ㅜㅜ
 
답변 감사드려요~~^^
댓글주소 추천 0 반대 0
     
     
안사지킴이 2012-01-10 (화) 12:36
축하드립니다. ;)
우흣님은 럭키라이팅에 당첨되어 5 포인트 지급되었습니다.
덧없음 2012-01-10 (화) 12:49
소스 제대로 보신거 맞나요? 다른데요?

TouchImageViewActivity.java

TouchImageView touch = new TouchImageView(this);
touch
.setImageBitmap(bm);
touch
.setMaxZoom(4f); //change the max level of zoom, default is 3f
setContentView
(touch);



public TouchImageView(Context context) {
   
super(context);
   
super.setClickable(true);
   
this.context = context;
    mScaleDetector
= new ScaleGestureDetector(context, new ScaleListener());
    matrix
.setTranslate(1f, 1f);
    m
= new float[9];
    setImageMatrix
(matrix);
    setScaleType
(ScaleType.MATRIX);
댓글주소 추천 0 반대 0
     
     
안사지킴이 2012-01-10 (화) 12:49
축하드립니다. ;)
덧없음님은 럭키라이팅에 당첨되어 3 포인트 지급되었습니다.
덧없음 2012-01-10 (화) 12:50
글쓴이분의 소스

 public Map_touchView(Context context, AttributeSet attrs){ 
  super(context , attrs); 
  super.setClickable(true); 
  this.context = context; 
  mScaleDetector = new ScaleGestureDetector(context, new ScaleListener()); 
  matrix.setTranslate(1f, 1f); 
  m = new float[9]; 
  setImageMatrix(matrix); 
  setScaleType(ScaleType.MATRIX); 
댓글주소 추천 0 반대 0
     
     
안사지킴이 2012-01-10 (화) 12:50
축하드립니다. ;)
덧없음님은 럭키라이팅에 당첨되어 1 포인트 지급되었습니다.
     
     
우흣 2012-01-10 (화) 13:02
글쓴이가 참고 하라고 전체 소스를 올려주신 링크가있는데요.
 
소스위의 글을 보시면 왼쪽의 21이란 숫자 옆에 링크된 사이트가있습니다.
 
그곳으로 들어가면 전체 소스를 볼수있는데요.
 
그걸 참고 했습니다.
 
제가 적은 링크의 소스는 완벽한 소스를 적어 놓으신게 아닌듯해요~
 
 
댓글주소 추천 0 반대 0
          
          
덧없음 2012-01-10 (화) 13:25
해당 링크안의 전체소스에도  public TouchImageView(Context context) {
이런식으로 되어있는데요;;

attr까지 받는경우는 커스텀 뷰의 경우에 콜되기 때문에 쓰이는걸로 아는데
해당 예제처럼 동작되는 방식이면 Context만 받는게 맞는것 같네요
댓글주소 추천 0 반대 0
               
               
안사지킴이 2012-01-10 (화) 13:25
축하드립니다. ;)
덧없음님은 럭키라이팅에 당첨되어 1 포인트 지급되었습니다.
     
     
우흣 2012-01-10 (화) 13:15
그소스의 위부분의 글쓴이가 달아논 글을 보면
 
"위의 소스를 사용 할려면 자바 소스를 고쳐야돼는데
 
(원본소스의)TouchImageView의 부분을
 
 
TouchImageView(Context context ,Attibute attrs)로 수정해라
 
라고 적어 놓았습니다.(EDIT2부분)
 
그래서 AttributeSet 부분을 넣은 건데
 
이게 오류가 나는거였어요...
 
위의 저하늘의별님의 답글에도 적어 놓았었는데 이걸 왜
 
넣으라고 한건지...
 
(제가 해석을 잘못한걸까요?)
 
그걸 이제 좀알아봐야겠네요~ㅎㅎ
 
답변 감사드립니다^^
 
 
댓글주소 추천 0 반대 0
          
          
덧없음 2012-01-10 (화) 13:26
 If you are calling this class from XML, you need to make a few changes

당신이 만약 xml에서 이클래스를 부를려면.. 이라는 전제가 있죠.

또한 xml을 만들지도 않았구여..
댓글주소 추천 0 반대 0
               
               
우흣 2012-01-10 (화) 13:59
TouchImageView 라는게 그 클래스 네임 아닌가요?
 
제가 적은 건 제가 만들어 놓은 클래스의 이름으로 바꾼거구요.
 
xml파일을 만들었습니다.
 
AttributeSet 부분을 삭제하니까 오류가 없어지고 에뮬이 실행되긴하는데 불러진 못하네요 ㅎㅎㅎ
 
며칠 골머리썩에 생겼습니다 ㅋㅋㅋ
 
 
댓글주소 추천 0 반대 0
                    
                    
안사지킴이 2012-01-10 (화) 13:59
축하드립니다. ;)
우흣님은 럭키라이팅에 당첨되어 3 포인트 지급되었습니다.
                    
                    
덧없음 2012-01-10 (화) 15:50
public Map_touchView(Context context, AttributeSet attrs){
super(context, attrs);
//동일로직
}
public Map_touchView(Context context){
super(context);
//동일로직
}
이런식으로 만들어보시길 바랍니다.
댓글주소 추천 0 반대 0
                         
                         
우흣 2012-01-11 (수) 01:14
ㅎㅎ덧없음님께서 적어주신 방법대로 하니까 해결이 되네요
 
감사드려요~
public Map_touchView(Context context){
super(context);
 
부분에 Attribute 부분을 수정해서 더하는게 아니라.
 
public Map_touchView(Context context, AttributeSet attrs){
super(context, attrs);
}
 
부분을 한번더 쓰는 거였네요 ㅎㅎㅎ
 
덧없음님 감사드려요^^
댓글주소 추천 0 반대 0
이전글  다음글  목록 글쓰기

 


Copyright ⓒ www.androidside.com. All rights reserved.
채팅 권한: 글쓰기 1개
2레벨 이상만 대화 가능
공개 채팅: 평일 !(9시 ~ 17시),토,일
안사2 변경사항 보러가기 챗방이 잘 안보이면 크롬에서 접속해주세요
챗방 숨기기 |  챗방 보이기