선택한 탭에 적색 원이 나타나게 하는 예
프로그램 구성은 앞의 예와 동일하고 커스텀 뷰 파일인 MyView.java 만 아래와 같이 약간만 변경하였다.
MyView.java
package com.dearpeople.android.test.custom;
import java.util.ArrayList;
import android.content.Context;
import android.graphics.*;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
/*
* 사각형 3개를 그리고 사각형을 누를 때마다 눌린 사각형안에 적색 원을 그리고,
* 다른 사각형은 흰색으로 설정하는 예제
* 이 클래스를 좀더 확장하여 커스텀 탭으로 사용할 수도 있겠다.
* 이 뷰를 화면에 다수개 출력하려면 레이아웃 xml 파일에 다수개를 선언해 주면 된다.
*/
public class MyView extends View{
int onColor = Color.WHITE; //사각형의 바탕색을 설정할 때 사용됨
// 이 클래스의 객체가 다수개 생성되어 사용될 때 아래의 컬렉션에 참조를 저장해 두면
// 각 객체의 바탕색을 일괄적으로 설정할 수 있기 때문에 커스텀 탭을 구현할 때 응용할 수 있다.
static ArrayList<MyView> aList;
public MyView(Context context) {
super(context);
if(aList==null) aList = new ArrayList<MyView>();
aList.add(this);
}
/* xml 레이아웃파일에서 이 뷰를 사용하려면 이 생성자가 반드시 필요함*/
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
if(aList==null) aList = new ArrayList<MyView>();
aList.add(this);
}
/* 버튼으로 사용할 사각형을 그린다 */
@Override
protected void onDraw(Canvas canvas) {
canvas.drawColor(Color.WHITE);//바탕색 설정
Paint paint = new Paint();
paint.setStyle(Paint.Style.STROKE); //Paint.Style.FILL(속을 채운다)
paint.setColor(Color.BLACK);
paint.setStrokeWidth(1);
paint.setAntiAlias(true);
canvas.drawRect(0, 0, 100, 20, paint);
paint.setColor(onColor);
paint.setStyle(Paint.Style.FILL);
canvas.drawCircle(50, 10, 7, paint);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
setMeasuredDimension(100, 20);
}
/* 사각형을 누를 때마다 눌린 사각형에는 적색 원이 그려지고, 다른 사각형은 흰색으로 설정한다 */
@Override
public boolean onTouchEvent(MotionEvent event) {
//Toast.makeText(this.getContext(), "터치이벤트", Toast.LENGTH_SHORT).show();
onColor = Color.RED;
this.invalidate();
for(int i=0;i<aList.size();i++){
MyView v = aList.get(i);
if(v!=this){
v.onColor = Color.WHITE;
v.invalidate();
}
}
return super.onTouchEvent(event);
}
}