选择列表项:如何检测点击来自触摸屏还是dpad点击?

时间:2015-05-18 08:23:26

标签: android xamarin

我有一个包含很多列表视图的业务应用程序。可以使用触摸屏或硬件按钮滚动(和选择)此列表视图中的项目。我的问题是:有没有办法检测选择是通过触摸还是使用硬件(dpad)输入按钮?

一些额外的信息。我需要确定这一点,因为我的目标设备(一个intermec CN51)有一个电阻触摸屏,在滚动很可能时会意外选择。我必须实现一些代码,用于检测何时使用触摸屏进行选择,并要求用户验证选择是否正确。

1 个答案:

答案 0 :(得分:0)

这里是android开发者网站: https://developer.android.com/training/game-controllers/controller-input.html#dpad

处理方向键输入部分 将Dpad类添加到项目中

public class Dpad {
final static int UP       = 0;
final static int LEFT     = 1;
final static int RIGHT    = 2;
final static int DOWN     = 3;
final static int CENTER   = 4;

int directionPressed = -1; // initialized to -1

public int getDirectionPressed(InputEvent event) {
    if (!isDpadDevice(event)) {
       return -1;
    }

    // If the input event is a MotionEvent, check its hat axis values.
    if (event instanceof MotionEvent) {

        // Use the hat axis value to find the D-pad direction
        MotionEvent motionEvent = (MotionEvent) event;
        float xaxis = motionEvent.getAxisValue(MotionEvent.AXIS_HAT_X);
        float yaxis = motionEvent.getAxisValue(MotionEvent.AXIS_HAT_Y);

        // Check if the AXIS_HAT_X value is -1 or 1, and set the D-pad
        // LEFT and RIGHT direction accordingly.
        if (Float.compare(xaxis, -1.0f) == 0) {
            directionPressed =  Dpad.LEFT;
        } else if (Float.compare(xaxis, 1.0f) == 0) {
            directionPressed =  Dpad.RIGHT;
        }
        // Check if the AXIS_HAT_Y value is -1 or 1, and set the D-pad
        // UP and DOWN direction accordingly.
        else if (Float.compare(yaxis, -1.0f) == 0) {
            directionPressed =  Dpad.UP;
        } else if (Float.compare(yaxis, 1.0f) == 0) {
            directionPressed =  Dpad.DOWN;
        }
    }

    // If the input event is a KeyEvent, check its key code.
    else if (event instanceof KeyEvent) {

       // Use the key code to find the D-pad direction.
        KeyEvent keyEvent = (KeyEvent) event;
        if (keyEvent.getKeyCode() == KeyEvent.KEYCODE_DPAD_LEFT) {
            directionPressed = Dpad.LEFT;
        } else if (keyEvent.getKeyCode() == KeyEvent.KEYCODE_DPAD_RIGHT) {
            directionPressed = Dpad.RIGHT;
        } else if (keyEvent.getKeyCode() == KeyEvent.KEYCODE_DPAD_UP) {
            directionPressed = Dpad.UP;
        } else if (keyEvent.getKeyCode() == KeyEvent.KEYCODE_DPAD_DOWN) {
            directionPressed = Dpad.DOWN;
        } else if (keyEvent.getKeyCode() == KeyEvent.KEYCODE_DPAD_CENTER) {
            directionPressed = Dpad.CENTER;
        }
    }
    return directionPressed;
}

public static boolean isDpadDevice(InputEvent event) {
    // Check that input comes from a device with directional pads.
    if ((event.getSource() & InputDevice.SOURCE_DPAD)
         != InputDevice.SOURCE_DPAD) {
         return true;
     } else {
         return false;
     }
 }}

关于班级的例子 初始化Dpad类

Dpad mDpad = new Dpad();

然后在ListView GenericMotionEvent列表器

上使用它
@Override
public boolean onGenericMotionEvent(MotionEvent event) {
    // Check if this event if from a D-pad and process accordingly.
    if (Dpad.isDpadDevice(event)) {

       int press = mDpad.getDirectionPressed(event);
       switch (press) {
            case LEFT:
                // Do something for LEFT direction press
                ...
                return true;
            case RIGHT:
                // Do something for RIGHT direction press
                ...
                return true;
            case UP:
                // Do something for UP direction press
                ...
                return true;
            ...
        }
    }

    // Check if this event is from a joystick movement and process accordingly.
    ...
}