Android 기술 Q&A 
Q&A 게시판에 질문을 남기신 글에 대한 답변/덧글/쪽글에 대한 Push 메일 서비스를 받고자 하시는 분들은
☞ Push 메일 서비스 공지를 필독하시기 바랍니다.
이미지뷰 확대 축소후에 선 그리기
작성자
작성일 2017-04-13 (목) 11:23
분 류 질문
ㆍ추천: 0  ㆍ조회: 3936      
IP: 183.xxx.194
첨부#1 imageViewTest_qna.zip (3,816KB) (Down:2370)
갤러리에서 이미지를 가져와 ImageVeiw에 뿌려주고 손가락 드레그하면 선 그어주는 어플을 만들고 있는데요, 
이미지를 가져와서 선을 긋는거는 잘되는데 확대나 축소후에 그으면 엉뚱한곳에 선이 그어지네요, 혹시 왜그런지 도움좀 받을 수 있을까요?

아래는 해당 어플 전체 소스코드(java만) 입니다.
그리고 프로젝트 전체 파일 첨부파일 합니다. 도움 부탁드려요.
package com.example.imageviewtest;



import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore.Images;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
import uk.co.senab.photoview.PhotoViewAttacher;

public class MainActivity extends Activity {

	private static String tag = "[MainActivity]";
	
	final int REQ_CODE_SELECT_IMAGE=100;
	
	Bitmap copyBitmap;
	ImageView imageView;
	PhotoViewAttacher mAttacher;
	
	Button findBtn1;	//갤러리 여는 버튼
	Button saveBtn1;	//이미지 저장 버튼
	
	Canvas canvas;	//캔버스
	Paint paint;	//페인트
	Path path;		//페스
	
	float downx = 0, downy = 0, upx = 0, upy = 0;
		
	String mode = "none";
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}
	
	public void initJob()
	{
		paint = new Paint();
		paint.setColor(Color.RED); 
	 	paint.setStyle(Paint.Style.STROKE);
		paint.setStrokeWidth(15F);
		
		path = new Path();
		
		imageView = (ImageView)findViewById(R.id.imageView1);
		
		findBtn1 = (Button) findViewById(R.id.findBtn1);
		saveBtn1 = (Button) findViewById(R.id.saveBtn1);
	
		//갤러리 열기
		findBtn1.setOnClickListener(new Button.OnClickListener() {
	        @Override
	        public void onClick(View view) {
				Intent intent = new Intent(Intent.ACTION_PICK);                
				intent.setType(android.provider.MediaStore.Images.Media.CONTENT_TYPE);
				intent.setData(android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
				startActivityForResult(intent, REQ_CODE_SELECT_IMAGE); 
	        }
	    });
		
		//이미지 저장하기
		saveBtn1.setOnClickListener(new Button.OnClickListener() {
			  @Override
		        public void onClick(View view) {
				String extStorageDirectory  = Environment.getExternalStorageDirectory().getAbsolutePath().toString();
				
				Toast.makeText(getApplicationContext(), extStorageDirectory, Toast.LENGTH_SHORT).show();
				
				File mDir = new File(extStorageDirectory+"/DCIM/hyhTest");
				if(!mDir.exists())
				{
					mDir.mkdir();
				}
 
            	SimpleDateFormat formater = new SimpleDateFormat("yyyyMMdd_hhMMss",Locale.KOREA);
        		Date current = new Date();
        		String date = formater.format(current);
        		
        		String saveFile = mDir.toString()+"/test_"+date+".png";
        		  
                FileOutputStream out = null;
				try {
					out = new FileOutputStream(saveFile);
				} catch (FileNotFoundException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} 
								  
                copyBitmap.compress(Bitmap.CompressFormat.PNG, 90, out);
           
                Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
                File f = new File(saveFile);
                Uri contentUri = Uri.fromFile(f);
                mediaScanIntent.setData(contentUri);
                sendBroadcast(mediaScanIntent);
                     
                try {
					out.flush();
	                out.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
              
                Toast.makeText(getApplicationContext(), "저장완료", Toast.LENGTH_SHORT).show();
			  } 
		});
	}
	
	@Override
	public void onWindowFocusChanged(boolean hasFocus) {
		//초기 작업
		initJob();
	}
	

	@SuppressWarnings("deprecation")
	@Override 
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
	
		//앨범 선택 리턴
		if(requestCode == REQ_CODE_SELECT_IMAGE) 
		{ 
			if(resultCode==Activity.RESULT_OK) 
			{     
				try { 
				
					Bitmap bitmap1 = Images.Media.getBitmap(getContentResolver(), data.getData());
					Bitmap bitmap2 = Bitmap.createScaledBitmap(bitmap1, imageView.getWidth(), imageView.getHeight(), false);
					
					copyBitmap = bitmap2.copy(Bitmap.Config.ARGB_8888,true);
				 	  
					canvas = new Canvas(copyBitmap);

					imageView.setImageBitmap(copyBitmap);

					//줌 인 아웃
					mAttacher = new PhotoViewAttacher(imageView);
	
					//이미지뷰 터치 이벤트
					imageView.setOnTouchListener(new View.OnTouchListener() {
						   
					    public boolean onTouch (View v, MotionEvent event) {
					    	
					    	float x = event.getX(); 
							float y = event.getY();
							
					    	int pointerCount = event.getPointerCount();
					
					    	//두손가락 으로 터치시 줌 인 아웃 적용
					    	if(pointerCount >= 2)
					    	{
					    		mAttacher.onTouch(v, event);
					    	}  
					    	  
					    	int action = event.getAction();
							
							switch (action) {
								case MotionEvent.ACTION_DOWN:
									path.reset();
									path.moveTo(x, y);
								break;
							
								case MotionEvent.ACTION_POINTER_1_DOWN:
									mode = "zoom";
								break;
								
								case MotionEvent.ACTION_POINTER_2_DOWN:
									mode = "zoom";
								break; 
									
							    case MotionEvent.ACTION_MOVE:
							     	upx = event.getX(); 
							     	upy = event.getY();
							
							     	//줌 인 아웃이 아닐때, 손가락 드레그 선 그리기
								    if((upx>=4 || upy>=4) && mode.equalsIgnoreCase("none"))
								    {  
								    	path.lineTo(x, y);
										canvas.drawPath(path, paint);
										imageView.invalidate();
								    }
								  break;
								  
							    case MotionEvent.ACTION_UP:
							    	pointerCount = -1;
							    	mode = "none";
							      break;
							       
							    case MotionEvent.ACTION_CANCEL: 
							    	mode = "none";
							      break;
							      
							    default:
							      break;
							} 
							return true;
					    }
					     
					});
						
				} catch (FileNotFoundException e) { 
					// TODO Auto-generated catch block 
					e.printStackTrace(); 
				} catch (IOException e) { 
					// TODO Auto-generated catch block 
					e.printStackTrace();
					 
				}
				
				catch (Exception e)
				{
            		e.printStackTrace();
				} 
			}      
		}
		
	}
}
이름아이콘 코딩인헬
2018-03-13 17:37
이미지 Matrix가 변했기 때문에 그리기 좌표도 그에 따라 변경 되어야 합니다.

Matrix inverse = new Matrix();
imageView.getImageMatrix().invert(inverse);

float[] touchPoint = new float[] {x, y};
inverse.mapPoints(touchPoint);
float drawX = touchPoint[0];
float drawY = touchPoint[1];


ACTION_DOWN 시
...
path.moveTo(drawX, drawY);
...
ACTION_MOVE 시
...
path.lineTo(drawX, drawY);
...
   
 
덧글 쓰기 0
3500
※ 회원등급 레벨 0 이상 읽기가 가능한 게시판입니다.
    N     분류     제목    글쓴이 작성일 조회
5003 질문 앱에 sl4a 를 내장하는 방법 문의 2018-04-23 2149
5002 질문 액션캠( SJ4000 ) 연동 질문 2018-01-25 2557
5001 질문 얼굴(눈) 인식 라이브러리 문의 드립니다. 2017-07-26 3063
5000 질문 후행섹션에서는 컨텐츠가 허용되지 않습니다라는 오류.. 2017-07-04 3103
4999 gralloc 로그 출력 2014-10-16 3605
4998 질문 Android 버전에 따라 onActivityResult을 호출하는 순서가 다.. 2017-09-15 3634
4997 질문 녹음기능중 녹음종료에 대한 문의... 2010-10-05 3636
4996 질문 절판 된 안드로이드 개발서(안드로이드 미디어 프레임워크, 아.. 2017-06-10 3646
4995 질문 비트맵 화면 하단 기준으로 그리기 2015-01-01 3715
4994 질문 객체 내 객체가 있을 때 상위객체(?) 인스턴스 내 변수를 하위.. 2015-02-25 3746
4993 질문 kernel 블루투스 SCO 질문드립니다 2017-03-29 3756
4992 질문 설명이힘드네요.. 안드로이드 질문있습니다 2014-09-14 3765
4991 질문 공유기 사용시 로컬 공인 IP 주소 얻는 방법 2017-07-07 3766
4990 질문 터치 이벤트 자체를 받을수 있게할수있을까요?.. 2015-02-13 3807
4989 질문 JNI에 대한 질문입니다. 2014-07-15 3852
4988 질문 안드로이드 서비스 관련 질문입니다. 2015-01-05 3882
4987 안드로이드 플랫폼 빌드시 2015-01-13 3889
4986 질문 이미지뷰 확대 축소후에 선 그리기 2017-04-13 3936
4985 질문 안드로이드 기본 설정에서 app을 지울때 2014-11-28 3989
4984 질문 어플관련 질문입니다. 꼭 답변 부탁드립니다. 2011-10-30 4001
4983 질문 컴파일시 컴파일 순서 2015-01-06 4007
4982 버튼이벤트가 먹지 않아요... 2014-07-29 4012
4981 크래시문제 질문입니다 2014-08-13 4016
4980 질문 browser에 대해 질문이요..답변좀 부탁드립니다 2011-12-06 4042
4979 효성 cdn 에 이미지 올려보신분 계세요... 2014-12-04 4043
4978 쉘 스크립트 질문 하나 드리겠습니다. 2014-07-31 4057
4977 질문 안드로이드 빌드시 gapps 포함방법 2015-02-05 4058
4976 질문 ScreenCast에 이벤트제어에 대해서 알고 싶습니다... 2011-10-23 4060
4975 질문 Resource$NotfoundException 이 나는데요 2015-03-23 4069
4974 CTS Fail 수정 노하우좀 부탁 드립니다. 2014-05-15 4098
4973 permission 관련 질문 2012-01-19 4108
4972 CTS fial 원인과 해결방안 2014-12-30 4114
4971 질문 액티비티를 finish 하는것 질문 2011-12-06 4122
4970 컨퍼런스 커리큘럼 질문 사항 2011-10-21 4124
4969 질문 List<Size> sizes = parameters.getSupportedPreviewSiz.. 2015-03-24 4131
4968 질문 Email 네이티브 소스 문의사항 2012-02-29 4137
4967 독립적인 Widget 업데이트 2011-11-18 4139
4966 질문 홈스크린 digital clock 소스 구할 수 있는데 없을까요ㅠ_ㅠ.. 2011-12-01 4139
4965 궁금한게 있습니다. NDK에서 ... 2012-02-15 4140
4964 질문 ListView 를 분석하고 싶습니다. 2011-09-29 4142
4963 질문 JAVA 질문입니다. (synchronized) 2011-08-30 4143
4962 질문 웹서버 좀비 connection 2012-02-08 4143
4961 질문 허니콤 버젼 컴파일에대해 질문좀 드립니다 2011-11-01 4145
4960 질문 입력기 관련 질문입니다. 2011-09-23 4150
4959 질문 vmware, ubuntu 질문입니다. 2012-02-08 4150
4958 byte[] to bundle로 변환?? 2011-10-15 4151
4957 질문 eclipse 없이 jar 파일 생성하는 다른 방법이 없을까요?.. 2015-01-21 4151
4956 질문 db파일만 네트워크를 통해서 업데이트를 받으려고 합니다.. 2012-01-17 4152
4955 질문 안드로이드 계정관련 질문드립니다. 2012-03-01 4152
4954 질문 Handler 2011-10-04 4154
12345678910,,,101