マイペースなプログラミング日記

DTMやプログラミングにお熱なd-kamiがマイペースに書くブログ

マルチタッチを試す

前回のタッチイベントを試すでは1箇所しか反応がなかったが、HTC Desireはマルチタッチ対応なので複数箇所の反応ができるので試してみた。たまに1つめのX座標と2つめのX座標(もしくは両方のY座標)が入れ替わるときがあるっぽいが、何か間違えたのだろうか?何か条件があるのかな?そして3箇所以上押しても2箇所までしか反応しないらしい

package touch.test;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.View;
import android.view.MotionEvent;

import java.util.List;
import java.util.ArrayList;

public class TouchView extends View{
    private List<Point> pointList;
	
    private static final int SIZE = 64;
    private static final int HALF_SIZE = TouchView.SIZE / 2;
	
    public TouchView(Context context){
        super(context);
        setBackgroundColor(Color.WHITE);
        setFocusable(true);
    	
        pointList = new ArrayList<Point>();
    }
    
    @Override
    public void onDraw(Canvas canvas){
        for(Point point : pointList){
           int rectX = point.x >= HALF_SIZE ? point.x - HALF_SIZE : 0;
           int rectY = point.y >= HALF_SIZE ? point.y - HALF_SIZE : 0;
           rectX = rectX + SIZE < getWidth() ? rectX : getWidth() - SIZE;
           rectY = rectY + SIZE < getHeight() ? rectY : getHeight() - SIZE;
    	
           canvas.drawRect(rectX, rectY, rectX + TouchView.SIZE, rectY + TouchView.SIZE, new Paint());
    	}
    }
    
    @Override
    public boolean onTouchEvent(MotionEvent event){
        int pointerCount = event.getPointerCount();
        pointList.clear();

        for(int i = 0; i < pointerCount; i++){
    	    int x = (int)event.getX(i);
    	    int y = (int)event.getY(i);
	
    	    pointList.add(new Point(x, y));
    	}
    	
        invalidate();
    	
        return true;
    }
    
    private static class Point{
        private final int x;
        private final int y;
    	
        private Point(int x, int y){
    	    this.x = x;
    	    this.y = y;
        }
    }
}