본문 바로가기
컴퓨터 공학/Android

[ 안드로이드 ] 자바 소스로 커스텀 버튼 만들기

by hahehohoo 2020. 5. 22.
반응형

2020 안드로이드 스튜디오 자바 소스 파일로 커스텀 버튼(Custom Button) 만들기

 

xml 파일 없이 java 소스 파일로만 버튼을 상속 받아 새로운 버튼 객체를 만들 것입니다.

버튼을 클릭 시 배경색이 바뀌도록 설정합니다. 

 

STEP 1 자바 클래스 만들기

- 저는 클래스명을 CustomButton이라고 했습니다. 

- AppCompatButton를 상속받습니다. 

 

 

STEP 2 생성자 만들기

- 맥이라면 Cmd + N 단축키 눌러서 생성자를 쉽게 가져옵니다.

- 파라미터 Context만 받는 것과 Attribute랑 같이 받는 것 두 개를 불러 옵니다.

 

 

STEP 3 버튼 초기 모습을 설정하기 위해 init()메서드를 만듭니다.

 

3.1  res 폴더 - dimens xml 파일을 추가합니다.

<resources>
    <dimen name="textSize">16dp</dimen>
</resources>

 

 

3.2 init 메서드에 아래 코드를 입력해주세요. 

//폰트 크기는 16dp, 기본 배경은 파랑
    private void init(){
        float fontSize = getResources().getDimension(R.dimen.textSize);
        setTextSize(fontSize);
        setBackgroundColor(Color.BLUE);
    }

 

STEP 4 버튼이 터치되었을 때 실행할 메서드를 작성합니다. 

4.1 맥이라면 cmd + N 단축키를 눌러 오버라이딩 합니다. 

4.2 onTouchEvent를 찾아 클릭합니다.

 

4.3 아래 코드를 작성합니다. 

// 터치 시 빨강배경으로 바뀜
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        int action = event.getAction();
        if (action == MotionEvent.ACTION_DOWN){
            setBackgroundColor(Color.RED);
            setTextColor(Color.WHITE);
        }else {
            setBackgroundColor(Color.BLUE);
        }
        // 뷰 모양이 변경되고 뷰를 무효화하여 시스템이 다시 뷰를 그릴 수 있 호출해야하는 메서드
       invalidate();

        //true라고 해야 이벤트를 계속 발생할 수 있다. 성공했다 해야하니까
        return true;
    }

STEP 5 커스텀 버튼을 출력할 액티비티에 태그로 작성합니다. 

- 태그에는 패키지명까지 들어가야 합니다. 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#CDDC39">

    <com.boostcourse.practice0522.CustomButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="서브뷰"
        android:textSize="32sp" />
</LinearLayout>

 

STEP 6 애뮬레이터로 결과물을 확인합니다.

전체코드

package com.boostcourse.practice0522;

import android.content.Context;
import android.graphics.Color;
import android.util.AttributeSet;
import android.view.MotionEvent;

import androidx.appcompat.widget.AppCompatButton;

public class CustomButton extends AppCompatButton {
// 코드에서 View를 동적으로 만들 때 사용하는 간단한 생성자
public CustomButton(Context context) {
super(context);
init();
}

// xml에서 View를 전개(inflation) 할 때 호출되는 생성자
public CustomButton(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}

//폰트 크기는 16dp, 기본 배경은 파랑
private void init(){
float fontSize = getResources().getDimension(R.dimen.textSize);
setTextSize(fontSize);
setBackgroundColor(Color.BLUE);
}

// 터치 시 빨강배경으로 바뀜
@Override
public boolean onTouchEvent(MotionEvent event) {
int action = event.getAction();
if (action == MotionEvent.ACTION_DOWN){
setBackgroundColor(Color.RED);
setTextColor(Color.WHITE);
}else {
setBackgroundColor(Color.BLUE);
}
// 뷰 모양이 변경되고 뷰를 무효화하여 시스템이 다시 뷰를 그릴 수 있 호출해야하는 메서드
invalidate();

//true라고 해야 이벤트를 계속 발생할 수 있다. 성공했다 해야하니까
return true;
}
}

 

 

 

 

반응형


댓글