개발/android

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

매몰 2014. 10. 19. 22:16

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

하지만 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호 | 사이버몰의 이용약관 바로가기