본문 바로가기
개발/android

Surface View에서 간단한 이미지버튼 손수 만들기

by 매몰 2014. 10. 19.

앱을 제작할때에는 버튼 클래스가 기본적으로 제공된다..

하지만 SurfaceView 기반의 게임을 만들때는 그렇지 않기 때문에 손수 만들어야 한다..

 

빠른 이해를 위해 모든 군더더기는 다 빼고 이미지로만 이루어진 버튼 클래스를 만들어 보겠다..

 

 

 

클래스

 

public class GraphicButton {

public static final int IMAGE_UP = 0;

public static final int IMAGE_DOWN = 1;

 

private Bitmap[] mImage;

private Rect mRect;

public

 

int

 mImageNum;

 

public GraphicButton(Rect rect) {

mRect = rect;

mImage = new Bitmap[2];

mImageNum = IMAGE_UP;

}

 

public void setImages(Bitmap upimage, Bitmap downimage) {

//이미지를 눌린 상태 및 아닌 상태 두가지로 저장한다 

mImage[IMAGE_UP] = upimage;

mImage[IMAGE_DOWN] = downimage;

}

 

public boolean touch(int tx, int ty) {

//이미지 좌표와 터치 좌표를 비교한다

Rect rect = mRect;

if((rect.left < tx && rect.right > tx) && (rect.top < ty && rect.bottom > ty))

return true;

 

return false;

}

 

public void setPress(boolean press) {

//버튼의 이미지를 변경하여 눌린 상태 및 아닌 상태를 표시한다

mImageNum = press ? IMAGE_DOWN : IMAGE_UP;

}

 

public void draw(Canvas canvas) {

//이미지 번호대로 이미지를 출력한다

int imagenum = mImageNum;

if(mImage[imagenum] != null)

canvas.drawBitmap(mImage[imagenum], null, mRect, null);

}

 

}  

 

 

 

 

사용법

 

private GraphicButton mButton;

private GameThread mThread;

 

public GameView(Context context, AttributeSet attrs) {

 

super(context, attrs);

 

SurfaceHolder holder = getHolder();

 

holder.addCallback(this);

 

//버튼을 원하는 위치에 생성

mButton = new GraphicButton(new Rect(100, 100, 300, 200));

 

//버튼 이미지 설정

Bitmap upimage = BitmapFactory.decodeResource(context.getResources(), R.drawable.upbutton);

Bitmap downimage = BitmapFactory.decodeResource(context.getResources(), R.drawable.downbutton);

mButton.setImages(upimage, downimage);

 

mThread = new GameThread(holder);

}

 

class GameThread extends Thread {

 

private SurfaceHolder mSurfaceholder;

 

public GameThread(SurfaceHolder surfaceHolder) {

 

mSurfaceholder = surfaceHolder;

}

 

@Override

 

public void run() {

SurfaceHolder surfaceHolder = mSurfaceholder;

 

Canvas c = null;

 

while(true) {

//게임 로직

//...

 

try{

c = surfaceHolder.lockCanvas(null);

synchronized(surfaceHolder) {

if(c != null)

doDraw(c);

}

 

sleep(mDelay);

 

}catch(InterruptedException e) {

e.printStackTrace();

}

finally {

if(c != null)

surfaceHolder.unlockCanvasAndPost(c);

 

}

}

}

}

 

 

private boolean doDraw(Canvas canvas) {

//배경 및 오브젝트 출력

//...

 

//버튼 출력

mButton.draw(canvas);

}

 

@Override

public boolean onTouchEvent(MotionEvent event) {

int touchx = (int)event.getX();

int touchy = (int)event.getY();

 

switch(event.getAction()) {

case MotionEvent.ACTION_CANCEL:

mButton.setPress(false);    //버튼 상태 초기화

break;

 

case MotionEvent.ACTION_UP:

mButton.setPress(false);    //버튼 상태 초기화

if(mButton.touch(touchx, touchy)) {

//버튼 클릭 행동

//...

}

break;

 

case MotionEvent.ACTION_MOVE:

//버튼 상태 변경

mButton.setPress(mButton.touch(touchx, touchy));

break;

 

case MotionEvent.ACTION_DOWN:

//버튼 상태 변경

mButton.setPress(mButton.touch(touchx, touchy));

} 

} 

 

 

 

 

 

게임에서는 버튼이 움직이는 등의 애니메이션이 많이 들어 간다.

그러기 위해서는 클래스를 확장하여 좀 더 알맞게 고쳐야 할 것이다.

 

 

사업자 정보 표시
주식회사 머리말 | 고영진 | 서울특별시 송파구 중대로 135 서관 10층 (가락동, 아이티벤처타워) | 사업자 등록번호 : 524-88-00727 | TEL : 010-9990-3674 | Mail : gyjmeba@hanmail.net | 통신판매신고번호 : 2017-서울강남-03941호 | 사이버몰의 이용약관 바로가기