반응형
//View(Context context,AttributeSet attrs)를 오버라이딩
public MultiTouchView(Context context, AttributeSet attrs){
super (context,attrs);
initView(); //메소드와 뷰를 초기화
}
<MultiTouchview.java>
package com.example.a5_homework2;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
public class MultiTouchView extends View {
private static final int SIZE= 60;
final int MAX_POINTS =10;
float[] x = new float[MAX_POINTS];
float[] y = new float[MAX_POINTS];
boolean[] touching = new boolean[MAX_POINTS];
private Paint mPaint;
public MultiTouchView(Context context, AttributeSet attrs){
super (context,attrs);
initView();
}
private void initView() {
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint.setColor(Color.BLUE);
mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
}
public boolean onTouchEvent(MotionEvent event)
{
int index =event.getActionIndex();
int id = event.getPointerId(index);
int action = event.getActionMasked();
switch(action){
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_POINTER_DOWN:
x[id] =(int) event.getX(index);
y[id] =(int) event.getY(index);
touching[id] = true;
break;
case MotionEvent.ACTION_MOVE:
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP:
case MotionEvent.ACTION_CANCEL:
touching[id]=false;
break;
}
invalidate();
return true;
}
protected void onDraw(Canvas canvas){
super.onDraw(canvas);
for(int i=0;i<MAX_POINTS;i++)
{
if(touching[i]){
canvas.drawCircle(x[i],y[i],SIZE,mPaint);
}
}
}
}
[코드 해석]
private static final int SIZE= 60; //사이즈의 60을 상수화 및 상속 방지를 함
final int MAX_POINTS =10;
float[] x = new float[MAX_POINTS]; //x,y에 float형의 10개의 배열 생성
float[] y = new float[MAX_POINTS];
boolean[] touching = new boolean[MAX_POINTS]; //10개의 boolean형 배열 생성
//View(Context context,AttributeSet)의 매개변수를 가져와서 생성자 생성
public MultiTouchView(Context context, AttributeSet attrs){
super (context,attrs);
initView();
}
private void initView() {
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); //객체 생성시 안티에일리어싱을 한상태로 생성
mPaint.setColor(Color.BLUE); //객체의 색깔은 파란색
mPaint.setStyle(Paint.Style.FILL_AND_STROKE);//채우기도하고 윤곽도 같이 그림
}
* 안티에일리어싱 : 표면처리를 부드럽게 해주는 기술
//화면터치시 발생하는 이벤트 오버라이딩
public boolean onTouchEvent(MotionEvent event)
{
int index =event.getActionIndex(); //정수화된 이벤트를 index변수에 넣는다
int id = event.getPointerId(index); index변수
int action = event.getActionMasked(); //액션 정보 삽입
switch(action){
//한개의 포인트 혹은 두개 이상 포인트에 대한 Down을 얻을 때 x와 y의 배열은 x,y좌표값을 얻음
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_POINTER_DOWN:
x[id] =(int) event.getX(index);
y[id] =(int) event.getY(index);
touching[id] = true;
break;
case MotionEvent.ACTION_MOVE:
break;
//손을 때거나 하면 touching은 false를 얻음
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP:
case MotionEvent.ACTION_CANCEL:
touching[id]=false;
break;
}
invalidate(); 전체 뷰를 무효화 한다
return true;
}
- getActionEvent
발생한 이벤트의 정보를 통해 ACTION_POINTER_DOWN 또는 ACTION_POINTER_UP에 대한 정수값 반환
protected void onDraw(Canvas canvas){
super.onDraw(canvas); //부모의 onDraw메소드 실행
//화면 다시그리기 실행
for(int i=0;i<MAX_POINTS;i++)
{
if(touching[i]){ //true값이면 원 생성
canvas.drawCircle(x[i],y[i],SIZE,mPaint);
}
}
}
반응형
'안드로이드' 카테고리의 다른 글
[안드로이드] 여론조사앱 (0) | 2019.10.12 |
---|---|
[안드로이드]이벤트 처리 방법 (0) | 2019.10.07 |
[안드로이드] 사용자 인터페이스 기초 (0) | 2019.10.07 |
[안드로이드] 안드로이드 기초사항 (0) | 2019.10.07 |
[안드로이드] 별 평가(Rating Bar) (0) | 2019.10.03 |
댓글