Android 기술 Q&A 
Q&A 게시판에 질문을 남기신 글에 대한 답변/덧글/쪽글에 대한 Push 메일 서비스를 받고자 하시는 분들은
☞ Push 메일 서비스 공지를 필독하시기 바랍니다.
이미지뷰 확대 축소후에 선 그리기
작성자
작성일 2017-04-13 (목) 11:23
분 류 질문
ㆍ추천: 0  ㆍ조회: 2843      
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 안드로이드 에뮬레이터 속도 [2] 2008-03-04 16945
5002 개념설명 : "@+" syntax in layout xml 2008-03-04 11936
5001 Touch Screen Event [1] 2008-03-04 12778
5000 Webkit 관련 2008-03-04 11256
4999 P2P 관련 2008-03-04 12523
4998 에뮬레이터간 XMPP 메시징환경 설정 2008-03-04 10974
4997 SD Card 환경설정 [1]+1 2008-03-04 11682
4996 안드로이드 디버깅 로그 출력 2008-03-04 13597
4995 안드로이드(Android) Webkit 사양관련 2008-03-04 14678
4994 레이아웃 : TextView와 Scrollbar 2008-03-04 12328
4993 안드로이드 포팅 [8] 2008-03-04 46928
4992 [파노라마] WebKit에 대한 궁금한 점이.. [1] 2008-03-07 9109
4991 WebKit-GTK에 대하여. [1] 2008-03-07 11074
4990 프로그램을 만들다 난관에 부딧혀 질문올립니다... [2] 2008-03-07 9645
4989 웹 관련해서 질문이 있습니다. [3] 2008-03-11 8542
4988 Android와 OpenBinder에 대한 질문입니다. [3] 2008-03-13 11160
4987 ProgressBarDialog 컨트롤에 대해서.... [3] 2008-03-14 11033
4986 안드로이드 os안에 있는 이미지 파일을 출력하고자 합니다... 2008-03-15 9662
4985 webkit 구조 및 기능에 대한 질문입니다. 2008-03-18 12127
4984 [답변]webkit 구조 및 기능에 대한 질문입니다 [4] 2008-03-18 13930
4983 [답변] 안드로이드 os안에 있는 이미지 파일을 출력하고자 합.. [2] 2008-03-19 12799
4982 안드로이드와 피카사 관련 질문 2008-03-19 8988
4981 rotatedrawable을 어떻게 사용해야되는데요 [1] 2008-03-20 11693
4980 TI OMAP 보드 포팅 [4] 2008-03-21 10956
4979 xmpp를 이용하여 p2p 어플리케이션 제작하신분 계신가요??.. [4] 2008-03-24 9488
4978 포팅관련 질문을 올립니다 [2] 2008-03-24 9944
4977 JVM 관련해서 물어볼 곳이 여기밖에 없네요. [4] 2008-03-25 10181
4976 안녕하십니까 m5에 관한 질문좀 드릴께요 [2] 2008-03-25 9080
4975 다시한번 질문드립니다. [1] 2008-03-26 8501
4974 안드로이드 안에 있는 app데모중에.. [1] 2008-03-26 9658
4973 armadillo-500(arm1136jf-s) - USB Gadget 동작 [3] 2008-03-27 10403
4972 TI OMAP 보드 보팅 중 uboot관련 [5] 2008-03-27 9956
4971 맵 갱신을 하려고하는데요. 에러가 나네요. [2] 2008-03-27 12140
4970 다이얼 로그 질문 이에요.. [2] 2008-03-28 9084
4969 scroll bar 사용시에 터치패드로 움직이는 것을 막고 싶습니다.. 2008-03-28 9196
4968 안드로이드와 UMA/GAN의 조화 2008-03-31 9075
4967 안드로이드 플랫폼 개발과 관련하여 질문 [2] 2008-04-01 8929
4966 이거 만우절 장난인가요? 진짠가...?ㅜㅜ [2] 2008-04-01 9299
4965 안드로이드 포팅 관련 질문입니다[맨땅에 헤딩중입니다].. [2] 2008-04-03 10678
4964 안드로이드 플랫폼에 있는 [1] 2008-04-03 9460
4963 다이얼로그에 관련된 좋은 샘플을 구합니다. [2] 2008-04-04 9288
4962 Conversion to Dalvik format failed with error 1 [3] 2008-04-07 11153
4961 시스템 해킹 관련 [1] 2008-04-07 8787
4960 안드로이드 챌린지 제출방법에 대해서 궁금한점이 있습니다... [4] 2008-04-08 8722
4959 포커스에 관한것좀 여쭙겟습니다. [4] 2008-04-09 15578
4958 파일 관리에 대해 질문있습니다. [1] 2008-04-11 8512
4957 mp3플레이어 MusicDroid에 대해서.. [2] 2008-04-14 10015
4956 안드로이드의 CE제품 적용 [1] 2008-04-21 8664
4955 xml 디자인 관련 [3] 2008-04-21 9816
4954 파일 입출력 관련.. [2] 2008-04-24 9646
12345678910,,,101