ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Button 을 상속하여 직접 만들기
    Android 2021. 7. 7. 21:16

    View : 화면에 표시되는 모든 구성요소 

    widget : 모양이 보이는 것 (button, textView 등)

    layout : 다른 View들을 담고 있는 것

     

    View를 직접 만들 수 있다. 그 중 Button(widget)을 상속하여 직접 만들어보자.

    MyButton.java 파일을 새로 만들자.

     

    public class MyButton extends AppCompatButton {
    
        public MyButton(Context context) {
            super(context);
            init(context);
        }
    
        public MyButton(Context context, AttributeSet attrs) {
            super(context, attrs);
            init(context);
        }
    
        public void init(Context context){
            setBackgroundColor(Color.CYAN); //background 색상
            setTextColor(Color.BLUE); //text 색상
            float textSize = getResources().getDimension(R.dimen.text_size); //픽셀 단위에서 sp 단위로 바꾸기 위해 dimen 폴더에 text_size를 가져온다.
            setTextSize(textSize);
        }
    
        @Override
        protected void onDraw(Canvas canvas) { //어떤 상황이 되면 직접 그릴 수 있도록 Canvas 객체가 전달된다.
            super.onDraw(canvas);
            Log.d("MyButton","onDraw 호출됨"); //호출되는 시점을 보기 위해 Log를 출력했다.  
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent event) { //손가락이 눌렀다가 떼어질 때 호출되는 메소드이다.
            Log.d("MyButton","onTouchEvent 호출됨");
    
            int action = event.getAction(); //MOtionEvent에 있는 getAction 메서드를 사용해서, 손가락이 눌렸는지, 눌린 상태로 드래그되는지 또는 손가락이 뗴어졌는지 알 수 있다. int 타입으로 반환한다.
            switch (action){
                case MotionEvent.ACTION_DOWN:
                    setBackgroundColor(Color.BLUE);
                    setTextColor(Color.GREEN);
                    break;
                case MotionEvent.ACTION_OUTSIDE:
                case MotionEvent.ACTION_CANCEL:
                case MotionEvent.ACTION_UP:
                    setBackgroundColor(Color.CYAN);
                    setTextColor(Color.BLUE);
                    break;
            }
            invalidate(); //화면에 보이는 것이 유효하지 않다는 의미이다. 이걸 호출하면 reDraw 해서 onDraw를 호출한다.
            return true;
        }
    }

     

    안드로이드는 기본적으로 UI 구성요소는 Context 객체를 받도록 한다. Context 객체란, 예를들어 button 이라면 button 을 담고있는 주변 환경 정보이다.

    첫 번째 MyButton은 소스코드에서 만들 때 호출된다.

     

    AttributeSet 은 속성이다. xml 레이아웃 안에 <MyButton ...> 으로 추가할 수 있는데 <> 안에 있는 속성들이 AttributeSet에 넘어온다.

    두 번째 MyButton은 레이아웃에 들어가서 inflation(버튼이 메모리에 만들어질 때) 될 때 호출된다.

     

    View를 상속해서 사용할 때에는 재정의할 수 있는 함수들이 있고,어떠한 상황이 되면 자동으로 실행된다.

    onMeasure()은 뷰가 스스로의 크기를 정할 때 자동으로 호출되는 메서드이다.

    onDraw()는 스스로를 레이아웃에 맞게 그랠 때 자동으로 호출되는 메서드이다.

    onClickEvent()는 사용자가 터치했을 때 사용하는 메서드이다.

     

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout 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">
    
        <org.techtown.view.MyButton //내가 만든 Button 을 호출한다.
            android:id="@+id/button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="확인" />
    </LinearLayout>

     

     

     

    728x90

    'Android' 카테고리의 다른 글

    RecyclerView를 이용해서 list 만들기  (0) 2021.07.08
    LinearLayout 상속하여 직접 만들기  (0) 2021.07.07
    setTextSize()  (0) 2021.07.07
    Animation  (0) 2021.07.06
Designed by Tistory.