본문 바로가기
안드로이드

[Android] 멀티 터치 (Multi Touch)

by 호아나트 2019. 10. 7.
반응형
//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);
            }
        }
    }

반응형

댓글