베짱이와 노는 개미

안드로이드 앱 프로그래밍#10 - 비트맵 버튼 본문

안드로이드 앱 프로그래밍

안드로이드 앱 프로그래밍#10 - 비트맵 버튼

jsistop16 2021. 8. 1. 21:08

오늘은 비트맵 버튼 만들기에 대해 포스팅해보겠다

일단 비트맵이라는것은

정말 간단하게 표현하자면 이미지포맷이다. 그 예로는 gif, png, jpeg 확장자가 있다.

즉 이미지를 메모리에 저장하는 형태 중 하나가 비트맵이라고 보면 될것같다.

비트맵 버튼이란 비트맵을 이용하여 버튼의 기능을 설정하는것이다.

예를들어 버튼을 눌렀을때의 배경색과 누르지 않았을때의 (기본) 배경색을 다르게 설정하고 싶다면

비트맵기능을 활용할 수 있다.

코드를 보자

package com.example.bitmapbutton;

import android.content.Context;
import android.graphics.Color;
import android.util.AttributeSet;
import android.view.MotionEvent;
import androidx.appcompat.widget.AppCompatButton;

public class BitmapButton extends AppCompatButton{
    public BitmapButton(Context context) {
        super(context);
        init(context);
    }

    public BitmapButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context);
    }

    private void init(Context context){
        setBackgroundResource(R.drawable.title_bitmap_button_normal);

        float size = getResources().getDimension(R.dimen.text_size);
        setTextSize(size);
        setTextColor(Color.WHITE);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        int action = event.getAction();

        switch(action) {
            case MotionEvent.ACTION_DOWN:
                setBackgroundResource(R.drawable.title_bitmap_button_clicked);
                break;

            case MotionEvent.ACTION_UP:
                setBackgroundResource(R.drawable.title_bitmap_button_normal);
                break;
        }

        invalidate();

        return true;
    }
}

일단 먼저 BitmapButton이라는 이름의 자바 클래스를 하나 create 해준다.

 

여기서 우리는 버튼 하나를 상속받아서 비트맵버튼을 만들어 볼것이다.

 

자바에서 상속을 받는다는것에 대해서 설명해보자면

 

A가 B를 상속받았다. -> A가 B의 속성을 그대로 받아들인 상태에서 코드를 짜겠다.

 

즉 A는 처음부터 B를 흡수한 상태로 시작하는것이다.

 

이 코드에서는 BitmapButton이라는 클래스가 AppCompatButton을 상속한것이다

 

검색을 해보니 AppCompatButton을 상속해야 버튼의 다양한 기능들을 지원받을 수 있다고 한다.

 

그리고 그 BitmapButton이라는 클래스에 생성자를 선언해줘야 하는데

 

생성자는 2개이다. xml코드에서 버튼을 끌어다 놓을때 생성되는 생성자와

 

자바코드에서 직접 버튼을 코딩할때 생성되는 생성자 

 

2가지를 모두 설정해야한다.

 

그 2가지 생성자 안에 init()메소드를 넣었다.

 

이제 init 메소드안에 기본배경과 텍스트 크기, 색을 설정해준다.

 

그리고 이제 그 버튼을 터치했을떄의 이벤트를

 

onTouchEvent로 설정해준다.

 

이떄 switch문을 구사했다.

 

switch문 밑에 invalidate()의 용도는 이미지를 다시 처음으로 돌려놓는(그려놓는)역할이다.

 

이 invalidate 메소드에 대해서는 추후에 자세히 다룰 예정이다.

 

자 그럼 이 코드는 버튼하나를 상속받아서 비트맵 버튼을 만든것이고

 

터치이벤트로 인해서 터치할때 배경색이 변하는 버튼을 만든것이다.

 

float size = getResources().getDimension(R.dimen.text_size)

 

이 문장의 뜻은 float로 선언된 변수 size에

 

res-dimens에서 text size로 지정된 값을 저장해라(size에 16dp를 저장해라) 이런 뜻이다.

 

이제 우리는 text사이즈를 dimens.xml파일에서 변경할수 있다.

 

자 그럼 이렇게 dimens.xml파일까지 만들어 놓으면 우리는 BitmapButton 클래스가 완성이 된것이다.

 

그럼 이 비트맵 클래스를 main.xml파일에 연결을 해줘야한다.

 

main xml파일을 보면

 

<BitmapButton>을 추가하면 안되고

 

패키지 이름까지 같이 써줘야한다.

 

<com.example.bitmapbutton.BitmapButton> 으로 써주면

 

Hello World!라는 텍스트를 담은 버튼이 생기고 

 

기본 배경, 터치 시 배경이 저장되어 있는것이다.

 

이제 에뮬레이터를 실행해보자

 

기본 화면이다.

 

이제 저 버튼을 클릭하면 우리가 onTouchEvent에서 설정해준 background 인 

 

title_bitmap_button_clicked 가 보여야 하고 클릭을 뗐을 시에는 다시 기본 배경으로 바껴야한다.

 

제대로 실행된것이다.

 

버튼을 상속받는것에 대해서 코드가 조금 어려울수있다.

 

연습해야겠다.