안드로이드 그림판 제작중입니다.
기능 추가로 이모티콘을 구현 중입니다.
일단 그림판에 그림을 그리고 난 뒤 이모티콘을 선택하면 이모티콘 이동과 크기 조절이 가능합니다.
허나 이모티콘 선택 시 기존에 그려놓아둔 이미지가 잠시 안보이게 되며, 이모티콘 삽입 이후에는 이전에 그려둔 그림이 다 보입니다. 제 생각으론 이모티콘 이동 가능한 거리전체에 배경을 흰색으로 둔거 같은데, 이것을 투명색으로 가능한건가요?
이모티코은 Bitmap형식으로 불러와 Rect형태로 전송됩니다.
이해가 안되실 수 도 있으니 소스코드 일부입니다.
// Image를 인자로 받는다.
public MovingUnit(Bitmap Image) {
// TODO Auto-generated constructor stub
this.Image = Image;
setSize(Image.getHeight(), Image.getWidth());
setXY(200, 300);
}
public void TouchProcess(MotionEvent event) {
int act = event.getAction();
switch (act & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN: // 첫번째 손가락 터치
if (InObject(event.getX(), event.getY())) {// 손가락 터치 위치가 이미지 안에 있으면
// DragMode가 시작된다.
posX1 = (int) event.getX();
posY1 = (int) event.getY();
offsetX = posX1 - X;
offsetY = posY1 - Y;
Log.d("zoom", "mode=DRAG");
mode = DRAG;
}
break;
case MotionEvent.ACTION_MOVE:
if (mode == DRAG) { // 드래그 중이면, 이미지의 X,Y값을 변환시키면서 위치 이동.
X = posX2 - offsetX;
Y = posY2 - offsetY;
posX2 = (int) event.getX();
posY2 = (int) event.getY();
if (Math.abs(posX2 - posX1) > 20
|| Math.abs(posY2 - posY1) > 20) {
posX1 = posX2;
posY1 = posY2;
Log.d("drag", "mode=DRAG");
}
} else if (mode == ZOOM) { // 핀치줌 중이면, 이미지의 거리를 계산해서 확대를 한다.
newDist = spacing(event);
if (newDist - oldDist > 20) { // zoom in
float scale = FloatMath
.sqrt(((newDist - oldDist) * (newDist - oldDist))
/ (Height * Height + Width * Width));
Y = Y - (Height * scale / 2);
X = X - (Width * scale / 2);
Height = Height * (1 + scale);
Width = Width * (1 + scale);
oldDist = newDist;
} else if (oldDist - newDist > 20) { // zoom out
float scale = FloatMath
.sqrt(((newDist - oldDist) * (newDist - oldDist))
/ (Height * Height + Width * Width));
scale = 0 - scale;
Y = Y - (Height * scale / 2);
X = X - (Width * scale / 2);
Height = Height * (1 + scale);
Width = Width * (1 + scale);
oldDist = newDist;
}
}
break;
case MotionEvent.ACTION_UP: // 첫번째 손가락을 떼었을 경우
case MotionEvent.ACTION_POINTER_UP: // 두번째 손가락을 떼었을 경우
mode = NONE;
break;
case MotionEvent.ACTION_POINTER_DOWN:
// 두번째 손가락 터치(손가락 2개를 인식하였기 때문에 핀치 줌으로 판별)
mode = ZOOM;
newDist = spacing(event);
oldDist = spacing(event);
Log.d("zoom", "newDist=" + newDist);
Log.d("zoom", "oldDist=" + oldDist);
Log.d("zoom", "mode=ZOOM");
break;
case MotionEvent.ACTION_CANCEL:
default:
break;
}
}