使用状态来管理onTouchEvent

时间:2019-10-10 20:15:19

标签: java android android-studio state touch-event

我正在做一个简单的逻辑电路的单屏应用。我正在使用onTouchEvent处理用户交互。我现在正在使用ACTION_UPACTION_MOVEACTION_DOWN,但这只允许我使用一个手势。我希望能够在我的UI中选择一个选项,例如“ AND”门。我想使用一次触摸来选择我要执行的操作,然后使用下一次触摸来将门放置在屏幕上。取而代之的是,我的onTouchEvent仅允许我触摸所需的组件,并且必须将手指放在屏幕上才能将其拖动到要放置的位置。这不是我想要的。

我尝试研究如何实现某种状态变量以允许onTouchEvent等待下一次触摸,但是我认为我不正确地理解如何实现它。

@Override
    public boolean onTouchEvent(MotionEvent motionEvent) {
        Log.d("Debugging", "In onTouchEvent");

        if((motionEvent.getAction() & MotionEvent.ACTION_MASK) == MotionEvent.ACTION_DOWN) {
            Touch.horizontalTouched = (int)motionEvent.getX()/ grid.getBlockSize();
            Touch.verticalTouched = (int)motionEvent.getY()/ grid.getBlockSize();
            whatWasTouched = whatWasTouched(Touch.horizontalTouched, Touch.verticalTouched);

        }else if((motionEvent.getAction() & MotionEvent.ACTION_MASK) == MotionEvent.ACTION_MOVE){
            //do nothing, finger is moving on screen
        }
        else if((motionEvent.getAction() & MotionEvent.ACTION_MASK) == MotionEvent.ACTION_UP){
            Touch.secondHorizontalTouch = (int)motionEvent.getX()/ grid.getBlockSize();
            Touch.secondVerticalTouch = (int)motionEvent.getY()/ grid.getBlockSize();
            placeComponent();
            draw();
        }
        return true;
    }

我希望我在屏幕上的第一次触摸能够选择一个选项,例如:“ AND”,“ OR”,“ NOT”,“ SWITCH”,“ EDIT”等,然后我的第二次触摸完成所需的动作。我还希望能够触摸我放在屏幕上的组件,然后触摸另一个组件,以便可以将它们连接在一起。

2 个答案:

答案 0 :(得分:0)

默认情况下,Android中的事件监听器正在等待-您无需提供任何延迟。

只需在ImageView上设置onTouchEvent(...)侦听器并显示第一个位图。触摸ImageView时,显示下一个位图,依此类推。您所要做的就是保持已触摸的次数计数,以便知道要显示的图像(图像1、2、3、4等)。

示例...

public class LoadImage extends Activity {

int imageNumber = 1;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_load_image);

    //get an image and create a bitmap from it

    ImageView imageView = (ImageView) findViewById(R.id.imageView);
    imageView.setImageBitmap(bitmap);

}

@Override
public boolean onTouchEvent(MotionEvent evt) {
    if (evt.getAction() == MotionEvent.ACTION_DOWN) {
        imageNumber++;
        switch (imageNumber) {
            case 2:
                // show image 2
                break;
            case 3:
                // show image 3
                break;
            ...
        }
        return true;
    }
    return false;
}

}

答案 1 :(得分:0)

我能够通过使用一个静态类来解决这个问题,该类将处理我的触摸状态。

@Override
    public boolean onTouchEvent(MotionEvent motionEvent) {
        Log.d("Debugging", "In onTouchEvent");
        if (placeState.getState() == false) {
            if ((motionEvent.getAction() & MotionEvent.ACTION_MASK) == MotionEvent.ACTION_UP) {
                Touch.horizontalTouched = (int) motionEvent.getX() / grid.getBlockSize();
                Touch.verticalTouched = (int) motionEvent.getY() / grid.getBlockSize();
                whatWasTouched = whatWasTouched(Touch.horizontalTouched, Touch.verticalTouched);
                if(whatWasTouched.equals("DELETE")){
                    visualComponents.clear();
                    logicalComponents.clear();
                }
                placeState.toggleState();//sets to true
                draw();
            }

        }else if (placeState.getState() == true) {
            Touch.secondHorizontalTouch = (int) motionEvent.getX() / grid.getBlockSize();
            Touch.secondVerticalTouch = (int) motionEvent.getY() / grid.getBlockSize();
            placeComponent();
            placeState.toggleState();//sets to false
            draw();
        }
        return true;
    }