안드로이드 이론 빡공 18
본문 바로가기
안드로이드(Android)

안드로이드 이론 빡공 18

by KyeongMin 2020. 7. 1.
728x90
반응형

뷰를 만드는법

**MyButton.java**

위의 클래스를 하나 생성을 해줍니다.

package com.example.myview;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;

import androidx.appcompat.widget.AppCompatButton;
//대게 안드로이드는 ui 구성 요소가 있으면 무조건 Context 객체를 가짐
//버튼이 있으면 버튼의 정보를 가진것
public class MyButton extends AppCompatButton{
    public MyButton(Context context) {
        super(context);
        init(context);

    }
//AttributSet은 이버튼을 가지고 new mybutton 소스코드를 가지고
    //버튼객체를 직접 메모리에 만들수 있지만
    //그것말고 xml 레이아웃안에다 < > 이런 표시를해서 mybutton을 추가 할 수 있다.
    //그때의 android : layoutwidth, height 등의 이런 정보가  AttributeSet으로 넘어온다.
    public MyButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context);
    }
    public void init(Context context){
        setBackgroundColor(Color.CYAN);
        setTextColor(Color.BLACK);

        //getResources는 res폴더안에 있는 리소스의미
        //이렇게 하면 sp 단위로 받아서 쓸 수 있다.
      float textSize =  getResources().getDimension(R.dimen.text_size);
        setTextSize(textSize); //여기서는 sp 단위로 못하고 픽셀단위로 가능한데 sp단위로 하려면
        //res 폴더안의 values 폴더 에
    }

    //재정의 하는 함수
    //버튼의 크기를 지정함
   /* @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
    */
   //onDraw 특정 무엇을 그릴때
   //onTouchEvent 의 경우 사용자 터치시 사요


    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        Log.d("MyButton","onDraw 호출됨");
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        Log.d("MyButton","onTouchEvent 호출됨");
        int action = event.getAction();
        switch (action){
            // 손가락으로 누른경우
            case MotionEvent.ACTION_DOWN:
                setBackgroundColor(Color.BLUE);
                setTextColor(Color.RED);
                break;
                //손가락 떼는경우
            case MotionEvent.ACTION_OUTSIDE:
            case MotionEvent.ACTION_CANCEL:
            case MotionEvent.ACTION_UP:
                setBackgroundColor(Color.CYAN);
                setTextColor(Color.BLACK);
                break;
        }
            invalidate(); // 우리 화면에 보이는것이 유효하지 않다는 것
        //이때 onDraw가 호출되서 다시 그려준다.
            return true;
    }
}

**dimens.xml**

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name = "text_size">30sp</dimen>
</resources>

**activity_main.xml**

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <com.example.myview.MyButton
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="확인"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

 

이미지 출처 : Do it! 안드로이드 앱 프로그래밍 [개정7판]

728x90
반응형

'안드로이드(Android)' 카테고리의 다른 글

안드로이드 이론 빡공 20  (0) 2020.07.03
안드로이드 이론 빡공 19  (0) 2020.07.01
안드로이드 이론 빡공 17  (0) 2020.06.29
안드로이드 이론 빡공 16  (0) 2020.06.24
안드로이드 이론 빡공 15  (0) 2020.06.23

댓글