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

Menambahkan Konfirmasi Email di Google Form

Template Gratis App Android Sederhana dengan Admob, Firebase dan In-app Purchase

Peringatan: Aksi Penipuan Skimming Melalui Aplikasi Android M-Pajak

Jasa Penjadwalan Semester, UTS dan UAS Perguruan Tinggi menggunakan Google Sheet

Menambahkan Random Key sebagai ID Pembeda di Google Sheet dengan Apps Script

Menyembunyikan Failed Load Images di Blogger

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

Menyikapi Ucapan AI Pejabat

Apps Script untuk Mengirimkan Notifikasi Approval