【问题标题】:Android multi-touch support安卓多点触控支持
【发布时间】:2011-02-10 09:22:00
【问题描述】:

我想知道Android多点触控支持是否可靠?我读过它存在一些问题。

我也想知道,如何定义自定义多点触控手势?喜欢:3 个手指旋转或 3 个手指保持静止而第四个手指在移动。

我遇到了一些资源(developer.android.com 上的 Gestures 或 MotionEvent),但没有明确说明。

问候,

兹德内克

【问题讨论】:

    标签: android multi-touch


    【解决方案1】:

    我在 API 中进行了研究,并找到了一种执行捏合/反向捏合等手势的方法,因此我相信您描述的手势是可能的 - 只需弄清楚如何对其进行编码。下面我粘贴了我实施的反向捏合的示例。我希望捏只有在水平方向时才能注册。它不是很干净或可重用的代码,但它应该可以帮助您继续前进。它适用于 Android 2.0.x。我读过多点触控可能在早期版本上存在问题。该示例是我从活动的onTouchEvent 中调用的一个类,将事件转发给该类。

    public class HorizontalReversePinchDetector {
    
        public boolean onTouchEvent(MotionEvent e) {
    
            int pointerCount = e.getPointerCount();
    
            if(pointerCount != 2) {
                Log.d(GESTURE, "not pinching - exactly 2 fingers are needed but have " + pointerCount);
                clearPinch();
                return false;
            }
    
            int firstIndex = e.getX(0) < e.getX(1) ? 0: 1;
            int secondIndex = e.getX(0) < e.getX(1) ? 1: 0;
    
            Finger currentLeftFinger = new Finger(e.getX(firstIndex), e.getY(firstIndex));
            Finger currentRightFinger = new Finger(e.getX(secondIndex), e.getY(secondIndex));
    
            float yDifference = Math.abs(currentLeftFinger.getY() - currentRightFinger.getY());
            if(yDifference > 80) {
                Log.d(GESTURE, "not pinching - fingers too vertically-oriented");
                clearPinch();
                return false;
            }
    
            if(initialLeftFinger == null) {
                initialLeftFinger = currentLeftFinger;
                initialRightFinger = currentRightFinger;
                Log.d(GESTURE, "not pinching, but might be starting a pinch...");
                return false;
            }
    
            float leftFingerDistance = initialLeftFinger.getX() - currentLeftFinger.getX();
            float rightFingerDistance = currentRightFinger.getX() - initialRightFinger.getX();
    
            float xDistanceBetweenFingers = Math.abs(currentLeftFinger.getX() - currentRightFinger.getX());
            if(xDistanceBetweenFingers < minimumDistanceBetweenFingers) {
                Log.d(GESTURE, "pinching, but fingers are not far enough apart...");
                return true;
            }
    
            if(leftFingerDistance < minimumDistanceForEachFinger) {
                Log.d(GESTURE, "pinching, but left finger has not moved enough...");
                return true;
            }
            if(rightFingerDistance < minimumDistanceForEachFinger) {
                Log.d(GESTURE, "pinching, but right finger has not moved enough...");
                return true;
            }
    
            pinchCompleted();
            return true;
        }
    
        private void pinchCompleted() {
            Log.d(GESTURE, "pinch completed");
            if(pinchListener != null) pinchListener.onPinch();
            clearPinch();
        }
    
        public static interface OnPinchListener {
            void onPinch();
        }
    
        private void clearPinch() {
            initialLeftFinger = null;
            initialRightFinger = null;
        }
    
        public void setPinchListener(OnPinchListener pinchListener) {
            this.pinchListener = pinchListener;
        }
    
        private static class Finger {
    
            private Finger(float x, float y) {
                this.x = x;
                this.y = y;
            }
    
            public float getX() {
                return x;
            }
    
            public float getY() {
                return y;
            }
    
            private float x;
            private float y;
        }
    
        private Finger initialLeftFinger;
        private Finger initialRightFinger;
        private OnPinchListener pinchListener;
        private static final float minimumDistanceForEachFinger = 30;
        private static final float minimumDistanceBetweenFingers = 50;
    }
    

    关于可靠性,这段代码是完全可靠的。同样,仅在 Android 2.0.x 上。我没有在平台的其他版本上测试过。

    【讨论】:

    • 太棒了!感谢您的回复,这正是我一直在寻找的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多