Android 기술 Q&A 
Q&A 게시판에 질문을 남기신 글에 대한 답변/덧글/쪽글에 대한 Push 메일 서비스를 받고자 하시는 분들은
☞ Push 메일 서비스 공지를 필독하시기 바랍니다.
이미지뷰 확대 축소후에 선 그리기
작성자 홍윤호
작성일 2017-04-13 (목) 11:23
분 류 질문
ㆍ추천: 0  ㆍ조회: 836      
IP: 183.xxx.194
첨부#1 imageViewTest_qna.zip (3,816KB) (Down:2016)
갤러리에서 이미지를 가져와 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();
				} 
			}      
		}
		
	}
}
덧글 쓰기 0
3500
※ 회원등급 레벨 0 이상 읽기가 가능한 게시판입니다.
    N     분류     제목    글쓴이 작성일 조회
5001 질문 얼굴(눈) 인식 라이브러리 문의 드립니다. 찌누 2017-07-26 137
5000 질문 공유기 사용시 로컬 공인 IP 주소 얻는 방법 [1]+1 찌누 2017-07-07 243
4999 질문 후행섹션에서는 컨텐츠가 허용되지 않습니다라는 오류.. leo.choi 2017-07-04 258
4998 질문 절판 된 안드로이드 개발서(안드로이드 미디어 프레임워크, 아.. 시쿠시쿠 2017-06-10 485
4997 질문 이미지뷰 확대 축소후에 선 그리기 홍윤호 2017-04-13 836
4996 질문 kernel 블루투스 SCO 질문드립니다 플래그 2017-03-29 838
4995 질문 블르투스 스피커 접속 & 해제 하는 방법 문의 드립니다.. 카르페디앰 2017-03-23 911
4994 질문 안드로이드 무전기앱 좋은 오픈소스가 있을까요?.. 녹트 2017-01-30 20451
4993 안드로이드 웹뷰 페이지 로딩문제 연신내막차 2017-01-23 25285
4992 통화녹음 관련하여 질문드립니다. 뽀죠 2017-01-16 30806
4991 질문 전화받기 기능 구현-Marshmallow 6.0.1 이상 와우92 2017-01-04 16675
4990 Adapter newView bindView 를 작업스레드에서 실행 할 순 없나.. 찌누 2016-12-12 11391
4989 질문 메소드 생성 관련 질문입니다. 노타이 2016-12-09 6420
4988 실행 디바이스 선택시 문제 노타이 2016-12-03 4827
4987 질문 Re.. 자답 찌누 2016-11-29 2531
4986 질문 한글 깨지는 문제 문의 찌누 2016-11-29 2789
4985 질문 안드로이드 OS별 저장 공간 관련. [2] 날펭 2016-11-22 2956
4984 질문 안드로이드 실무개발? 질문입니다. [1] 액션바 2016-11-03 2617
4983 질문 AOSP 초보 질문 [1]+1 찌누 2016-11-02 2537
4982 질문 안드로이드 6.0(마쉬멜로우)에서 Doze모드 파인드로이드 2016-10-29 2733
4981 오디오패스(스피커,이어잭)를 동시에 2개 사용 가능한가요?.. [2] J하늘리스 2016-10-17 3126
4980 JNI로 CPP 변수 변경하기 문의드립니다. jaebro 2016-10-11 2639
4979 질문 안드로이드 폰 오디오 신호 받기 RealTimeCh 2016-09-29 3066
4978 질문 Re..해결했습니다. 호루스 2016-08-31 2994
4977 질문 안드로이드 스튜디오에서 옵션메뉴가 나오질 않네요.. 호루스 2016-08-30 3731
4976 질문 블루투스 통신에서 고속의 데이터 수신 중 중간에 데이터 유실.. [3] 프로 2016-08-15 3671
4975 블루투스 에서 remote device가 강제로 연결을 끊었다는 것을 .. [1] bonjoy 2016-07-19 3499
4974 material 관련 라이선스 문의 bro 2016-06-27 3467
4973 질문 안드로이드 키보드 테마 작업 완봉 2016-05-25 3877
4972 질문 USB 이용한 오디오(통화) 관련 질문 드립니다. 주너 2016-05-24 3750
4971 질문 안드로이드 다른 어플 사이즈 조절 문제 kulman 2016-05-13 3880
4970 질문 변수 설정을 어떻게 해야할지 모르겠어요 [1] 배우러왔어요 2016-05-08 3606
4969 파일시스템 Read-Only에서 Read Write로 변경 어떻게하나요.. [1] windy21 2016-05-06 3947
4968 질문 아이피 바꾸어 가면서 특정 웹 사이트 접속하기.. 다클 2016-05-04 4010
4967 질문 RTSP 영상 스트리밍 플레이어 개발 관련 문의 후니후니훈2 2016-04-08 4126
4966 질문 Android MarshMallow에서 노말한 퍼미션은 어떻게 권한을 획득.. 툴체인 2016-04-07 4469
4965 질문 미디어컨트롤러 위에 이미지나 선으로 표시를 하고 싶은데..... kkk111 2016-03-25 3840
4964 질문 eth0 IP 변경 [2] 럽어페어 2015-12-16 5938
4963 카드게임과 자동 로그인 문의 [1] 찌누 2015-11-22 6835
4962 질문 고수님들.! 두가지 기능(블루투스, 영상처리) 를 어떻게 넣어.. parkch12 2015-11-06 5868
4961 질문 시스템 서비스 등록 크크크 2015-11-03 4752
4960 질문 slattach 기능을 안드로이드에서 이용할 수 있는 방법 문의드.. 엘카이저 2015-11-02 4974
4959 질문 루팅 관련 질문입니다. [2] 비둘기 2015-10-05 5458
4958 각각 이미지 확대 문제.. [1] fly 2015-10-03 5494
4957 질문 textview id 오류 질문합니다 [1] 어그래너 2015-10-02 4925
4956 질문 질문있습니다., [2] veronica 2015-10-02 4911
4955 게시판 자료가 다운로드 후 깨집니다. [5]+1 리로 2015-10-01 5319
4954 질문 안드로이드 개발 pc 추천 부탁드려요 [1] 레트 2015-09-18 5872
4953 external 에 추가하려고 하는 방법 질문드립니다... [1] 비둘기 2015-09-15 5082
4952 질문 초보 개발자 입니다. 초짜3 2015-09-04 5298
12345678910,,,101