Deteksi Multitouch Android


Hampir seminggu penulis dipusingkan oleh masalah multitouch pada Android.

Permasalahannya adalah dalam pengindekan, terutama saat salah satu jari diangkat ke atas.

Hal ini menjadi penting, sebab akan sangat berpengaruh pada engine game 2D Android yang sedang penulis kembangkan.

Yaitu untuk keperluan saat menggeser object. Sehingga ketika digeser dan setelah itu jari diangkat, posisi object tidak melompat ke jari lain yang masih menempel.

Dibawah ini adalah cuplikan kode dari percobaan deteksi mouse yang penulis lakukan:

package com.uboizblog.multitouchtest;

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

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

public class CanvasView extends View
{
    public List<TouchInfo> MouseTouch=new ArrayList<TouchInfo>();
    private Paint mPaint;
    private int[] colors = { Color.BLUE, Color.GREEN, Color.MAGENTA,Color.BLACK, Color.CYAN, Color.GRAY, Color.RED, Color.DKGRAY,Color.LTGRAY, Color.YELLOW };

    public CanvasView(Context context) {
        super(context);

        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    }

    public boolean onTouchEvent(MotionEvent event) {
        int maskedAction = event.getActionMasked();
        switch (maskedAction) {

            case MotionEvent.ACTION_DOWN:
            case MotionEvent.ACTION_POINTER_DOWN: {
                int pointerIndex=event.getActionIndex();
                int pointerId = event.getPointerId(pointerIndex);
                if(pointerId==MouseTouch.size()){
                    TouchInfo m=new TouchInfo();
                    m.mLastTouchX = event.getX(pointerIndex);
                    m.mLastTouchY = event.getY(pointerIndex);
                    m.touched = true;
                    MouseTouch.add(m);
                }else{
                    MouseTouch.get(pointerId).mLastTouchX = event.getX(pointerIndex);
                    MouseTouch.get(pointerId).mLastTouchY = event.getY(pointerIndex);
                    MouseTouch.get(pointerId).touched=true;
                }

                break;
            }
            case MotionEvent.ACTION_MOVE: {
                for (int size = event.getPointerCount(), i = 0; i < size; i++) {
                    int pointerId = i;//event.getPointerId(i);
                    int pointerIndex=event.findPointerIndex(pointerId);
                    if(pointerId>=0 && pointerId<MouseTouch.size() && pointerIndex>=0 && pointerIndex<event.getPointerCount()) {
                        MouseTouch.get(pointerId).moved = true;
                        MouseTouch.get(pointerId).mLastTouchX = event.getX(pointerIndex);
                        MouseTouch.get(pointerId).mLastTouchY = event.getY(pointerIndex);
                    }
                }
                TouchInfo.MOUSEMOVED=true;

                break;
            }
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_POINTER_UP:
            case MotionEvent.ACTION_CANCEL: {
                int pointerIndex = (event.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
                int pointerId = event.getPointerId(pointerIndex);

                if(pointerId<MouseTouch.size()) {
                    MouseTouch.get(pointerId).touched = false;
                    MouseTouch.get(pointerId).moved = false;
                }

                break;
            }
        }
        invalidate();

        return true;
    }

    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        mPaint.setColor(Color.WHITE);
        canvas.drawRect(0,0,canvas.getWidth(),canvas.getHeight(),mPaint);

        for (int size = MouseTouch.size(), i = 0; i < size; i++) {
            mPaint.setColor(colors[i %colors.length]);
            canvas.drawRect(MouseTouch.get(i).getX()-25,MouseTouch.get(i).getY()-25,MouseTouch.get(i).getX()+25,MouseTouch.get(i).getY()+25, mPaint);
        }
    }
}

Kode di atas dibuat dengan Android Studio, yang dapat di download lengkap di link Github di bawah ini:


Project kecil ini adalah bagian dari project penulis, dalam mengembangkan library Greenfoot untuk Android dan telah meghasilkan aplikasi edukasi dengan nama developer Computational Lab di Play Store.

Komentar



Postingan populer dari blog ini

Kumpulan Source Code Greenfoot

Game TicTacToe dengan Greenfoot

Algorithma Coretan Abstrak dengan HTML5 Canvas

Cara Membuat Halaman HTML Sederhana

Honeycomb Style Wallpaper dengan HTML5 Canvas

Ganti Kartu ATM BNI yang Rusak

Mencoba Submit Theme di Wordpress.org

Cara Menentukan Arah Kiblat Menggunakan Google Maps

Kode Greenfoot Game Snake Sederhana

Melihat Alamat Berbentuk QR Code di Undangan Pernikahan