【问题标题】:Using states to manage onTouchEvent使用状态管理 onTouchEvent
【发布时间】:2019-10-10 20:15:19
【问题描述】:

我正在制作一个简单逻辑电路的单屏应用程序。我正在使用onTouchEvent 来处理用户交互。我现在正在使用ACTION_UP、ACTION_MOVE 和ACTION_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”等,然后我的第二次触摸完成想要的动作。我还希望能够触摸我放置在屏幕上的组件,然后触摸另一个组件,以便将它们连接在一起。

【问题讨论】:

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


    【解决方案1】:

    默认情况下,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;
    }
    

    }

    【讨论】:

    • 这不是我想要做的。我想在我的程序中执行其他需要初始触摸和目标触摸的功能。我不只是使用触摸来绘制图像。
    【解决方案2】:

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

    @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;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-14
      • 1970-01-01
      • 2021-02-10
      • 2013-08-15
      • 1970-01-01
      • 2020-09-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多