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

Apps Script untuk Cetak Sertifikat

Kebodohan Karyawan Menyalahkan Sistem

Kode Apps Script MailApp untuk Form Mengirimkan Email

Checking Data yang Belum Dimasukkan dalam Daftar Menggunakan Query Google Sheet

Generate Karakter Acak dan Menempatkannya di Sel Google Sheets dengan Apps Script

Menyembunyikan Failed Load Images di Blogger

Algorithma Bilangan Prima dengan Javascript

Apps Script untuk Mengirimkan Notifikasi Approval

Mencoba Submit Theme di Wordpress.org

Menghapus Baris di Google Sheets yang Memiliki Sel Kosong dengan Apps Script