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

핀치줌 공부하고 있는데 질문있습니다.

0 추천
public class AndroidTouchPinchZoomActivity extends Activity {
	
	ImageView myImageView;
	Bitmap bitmap;
	int bmpWidth, bmpHeight;
	
	//Touch event related variables
	int touchState;
	final int IDLE = 0;
	final int TOUCH = 1;
	final int PINCH = 2;
	float dist0, distCurrent;
	
	
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        myImageView = (ImageView)findViewById(R.id.imageview);
        
        bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
        bmpWidth = bitmap.getWidth();
        bmpHeight = bitmap.getHeight();
       
        distCurrent = 1;	
        dist0 = 1;	
        		
        drawer();
        
        myImageView.setOnTouchListener(MyOnTouchListener);
        touchState = IDLE;
    }
    
    private void drawer(){
    	float curScale = distCurrent/dist0;
    	
    	if (curScale < 0.1){
    		curScale = 0.1f;	
    	}   	   
    	int newHeight = (int) (bmpHeight * curScale);
    	int newWidth = (int) (bmpWidth * curScale);
    	
    	Bitmap resizedBitmap; 
    	
    	resizedBitmap = Bitmap.createScaledBitmap(bitmap, newWidth, newHeight, false);
    	myImageView.setImageBitmap(resizedBitmap);	
    }
    
    OnTouchListener MyOnTouchListener
    = new OnTouchListener(){

		@Override
		public boolean onTouch(View view, MotionEvent event) {
			float distx, disty;	
			switch(event.getAction() & MotionEvent.ACTION_MASK){
			case MotionEvent.ACTION_DOWN:
				touchState = TOUCH;
				break;
			case MotionEvent.ACTION_POINTER_DOWN:
				touchState = PINCH;
				distx = event.getX(0) - event.getX(1);
				disty = event.getY(0) - event.getY(1);
				dist0 = FloatMath.sqrt(distx * distx + disty * disty);
				break;
			case MotionEvent.ACTION_MOVE:
				if(touchState == PINCH){						
					distx = event.getX(0) - event.getX(1);
					disty = event.getY(0) - event.getY(1);
					distCurrent = FloatMath.sqrt(distx * distx + disty * disty);
					drawer();
				}	
				break;
			case MotionEvent.ACTION_UP:
				//A pressed gesture has finished.
				touchState = IDLE;
				break;
			case MotionEvent.ACTION_POINTER_UP:
				//A non-primary pointer has gone up.
				touchState = TOUCH;
				break;
			}
			return true;}};}

우선 코드는 이렇구요

 

줌인 줌아웃은 되는데 이미지를 확대하거나 축소한 뒤에 다시 줌이나 아웃을하면 이미지가 원상태로 초기화된 상태에서 줌인 줌아웃이 일어납니다. 문제점이 뭔지 알 수 있을까요? 

탄산우유 (160 포인트) 님이 2014년 11월 29일 질문

1개의 답변

0 추천

drawer  메소드에서

float curScale = distCurrent/dist0; 이 부분 때문에 항상 원본 사이즈 부터 시작하게 됩니다.

터치 리스너에서 터치다운(2개 손가락 다운) 이벤트가 일어나면

초기의 두 손가락의 거리를 dist0,

현재 두 손가락의 거리를 distCurrent에 저장합니다.

 

이렇게 되면 터치를 끝내고 다시 이미지를 줌 인/아웃 하려고 터치를 하려고 하면

curScale 값이 1.0에 근사한 값 부터 시작하게 됩니다.

 

이 부분 로직을 변경하셔야 합니다.

 

현재 확대/축소 비율 변수로 잡으시고 핀치 줌인/아웃 이벤트로 변경할 비율 변수 따로 잡아서

2변수를 더해서 최종 확대/축소 비율로 잡으셔야 합니다.

원조안드로이드 (58,190 포인트) 님이 2014년 12월 1일 답변
...