펌 OK (출처 표시), 상업적 이용 NO, 컨텐츠 변경 NO

이 글에서는 

터치이벤트(TouchEvent)로 비트맵이미지 이동시키기

에서 발전하여 특정 영역 밖으로 이미지가 이동하지 않도록 하는 방법을 알아보겠다. 아주 간단하다.


화면 영역 밖으로 나가지 않게 하려면 단말기의 Height와 Width를 받아오면 되고, 특정 수치를 부여하려면

이런 과정이 필요없다.

Display dis = ((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay();

int width = dis.getWidth();

int height = dis.getHeighy();


그리고 다음과 같은 조건을 준다.

@Override

public boolean onTouchEvent(MotionEvent event) {

if (event.getAction() == MotionEvent.ACTION_DOWN) {

//디스플레이 영역 설정. 이미지X,Y는 이미지의 X좌표,Y좌표를 뜻함

if (이미지X >= 0 && 이미지X <= width && 이미지Y >= 0 && 이미지Y <= height) {

//그리기 실행

}

//여기

   }

}

이상태로 끝내버리면 위 조건이 false, 즉 화면영역 밖으로 좌표가 튀어나갔을경우 그리기가 멈춰버린다. 이미 값이

튀어 나갔기때문에 true가 들어오지 않는다. 그러므로

//여기 위치에서 이미지를 영역 안으로 새로고침해준다.

if (이미지X < 0) {

이미지X = 0;

}

if (이미지X > width) {

이미지X = width

}

if (이미지Y < 0) {

이미지Y = 0;

}

if (이미지Y > height) {

이미지Y = height

}


이렇게 해주면 이미지가 조건을 벗어나게 되더라도 새로고침하여 그 다음 입력이 true가 되므로,

실행을 이어서 할 수 있다.


단말 전체가아니라 특정 영역에서만 움직이게 하고싶다면 width,height는 상황에 맞게 조절하면 된다.


문의점은 댓글로 !

펌 OK (출처 표시), 상업적 이용 NO, 컨텐츠 변경 NO

요점은 ACTION_DOWN 이벤트 발생 시, 해당 좌표값 저장, 이후 MOVE 발생 시

다른 변수에 해당 값 저장. 둘의 값 비교 == 이동량

이미지를 기존 이미지 위치 - 이동량 하여 새로그려줌

그리고 처음 DOWN때 위치를 저장한 변수에 두번째 값을 넘겨주고

다시 MOVE 이벤트 발생시 값 갱신 하는식으로

MOVE시마다 이전값과 이후값의 차가 이동한 거리이므로 계속 새려그려주면 손가락을 따라 움직이는것처럼 표현된다.


float saveX, saveY;

float moveX, moveY;

float diffX, diffY;

@Override

public boolean onTouchEvent(MotionEvent event) {

if (event.getAction() == MotionEvent.ACTION_DOWN) {

saveX = event.getX();

saveY = event.getY();

}

if (event.getAction() == MotionEvent.ACTION_MOVE) {

moveX = event.getX();

moveY = event.getY();

diffX = saveX - moveX;

diffY = saveY - moveY;

// SurfaceViewView에 따라 그리는 방식은 달라짐. SurfaceView같은경우

canvas.canvas = mHolder.lockCanvas();

canvas.drawBitmap(img, 기존이미지X - diffX, 기존이미지Y - diffY, p);

holder.unlockCanvasAndPost(canvas);

//뷰같은경우 locakCanvas(); 대신 invalidate();로 재호출.

saveX = moveX;

saveY = moveY;

}

}


그리기 부분은 따로 설명하지 않았다. 새로운 포스트로 소개할듯 싶지만,

그 전에 궁금한부분이 있으면 댓글주기바람