Android:タッチイベントについて

android-touch.png

マウス(タッチ)の動き編

一方OpenGLではmouse関数とmove関数が別になっているが、OpenGL ESではGLSurfaceViewクラスの拡張クラスを作って、OnTouchEventで一括管理されている。
Android(java)のonTouchEvent OpenGL WebGL(javascript)
触った MotionEvent.ACTION_DOWN: GLUT_DOWN window.document.onclick or onmousedown
移動中 MotionEvent.ACTION_MOVE move() window.document.onmousemove
離した MotionEvent.ACTION_UP: GLUT_UP window.document.onmouseup
再描画要求 requestRender(); glutPostRedisplay(); 自作??(再帰関数にするとかにより)
  • javascriptの場合、canvas要素の中でのxy座標の取得は
var x=event.offsetX;
var y=event.offsetY;

だよ。
SurfaceViewクラスを拡張したものがタッチイベントを支配する。
主に View::onTouchEvent(MotionEvent e)でタッチイベントを認識する。
  • View::onTouchEvent(MotionEvent e)
  • View.OnTouchListener::onTouch(View v, MotionEvent event) という方法もある

タッチで3Dオブジェクトの回転!コード

    @Override
    public boolean onTouchEvent(MotionEvent e) {
            miffygestureDetector.onTouchEvent(e);// ピンチアウト・ピンチインのため
            float zoomincrement = (miffygestureDetector.getCurrentSpan() - miffygestureDetector.getPreviousSpan()) / 1000.0f;
            if (e.getPointerCount() > 1&& Math.abs(lastzoomincrement - zoomincrement) > 0.01) {
                mRenderer.mZoom += zoomincrement;
            }
            lastzoomincrement = zoomincrement;
        float x = e.getX();
        float y = -e.getY();
        int id = 0;
        switch (e.getActionMasked()) {// getActionでタッチアクション情報を取得する
            case MotionEvent.ACTION_MOVE:// 移動中
                float dx = x - mPreviousX;
                float dy = y - mPreviousY;
                dx = dx * 1.0f / getWidth();
                dy = dy * 1.0f / getHeight();
                if (mode == ROTATION) {
                    // クォータニオンの長さ
                    float length = (float) Math.sqrt(dx * dx + dy * dy);
                    if (length != 0.0) {
                        // M_PIは適当な換算係数 piにしておくと、画面いっぱい動かした時にちょうど一回転になる
                        double radian = length * Math.PI;
                        float theta = (float) (Math.sin(radian)) / length;
                        Quaternion after = new Quaternion((float) Math.cos(radian),
                                dy * theta, dx * theta, 0.0f);// 回転後の姿勢
                        float[] rotation_matrix = new float[16];
                        target_quaternion = after.multiply(current_quaternion);
                        target_quaternion.GetRotationMatrix(rotation_matrix);
                        for (int i = 0; i < rotation_matrix.length; i++) {
                            mRenderer.mRotationMatrix[i] = rotation_matrix[i];
                        }
                    }
                } else if (mode == TRANSLATION) {
                    mRenderer.mTranslationMatrix[12] += -translate_speed
                            * (x - mPreviousX);
                    mRenderer.mTranslationMatrix[13] += translate_speed
                            * (y - mPreviousY);// yは上下逆
                    mPreviousX = x;
                    mPreviousY = y;
 
                }
                break;
            case MotionEvent.ACTION_DOWN:// 0
                // 画面がタッチされたときの動作
                mPreviousX = x;
                mPreviousY = y;
                mode=ROTATION;
                break;
            case MotionEvent.ACTION_UP:// 1
                if (mode == ROTATION) {
                    current_quaternion = target_quaternion;
                } else {
                    if (mode == TRANSLATION) {
                        mRenderer.mTranslationMatrix[12] += -translate_speed
                                * (x - mPreviousX);
                        mRenderer.mTranslationMatrix[13] += translate_speed
                                * (y - mPreviousY);// yは上下逆
                    }
                }
                break;
            case MotionEvent.ACTION_POINTER_DOWN:// 5:画面の1点以上をタッチしている状態でさらに画面をタッチした際に発生する。
                int action = e.getAction();
                if (action == 261) {
                    mode = SCALE;
                } else if (action == 517) {
                    mode = TRANSLATION;
                }
                break;
            case MotionEvent.ACTION_POINTER_UP:// 6:画面の2点以上をタッチしている状態でその内の1点を離した際に発生する。
                mode=ROTATION;
                break;
 
        }
        requestRender();
        return true;
    }

input

サポートサイト Wikidot.com input