-
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