代码之家  ›  专栏  ›  技术社区  ›  Gionne Lapuz

自定义视图上的Ontouch侦听器

  •  1
  • Gionne Lapuz  · 技术社区  · 7 年前

    我有一个自定义视图,可以在屏幕上拖动,点击它会显示另一个视图,在模拟器中使用时一切正常。但是,在实际设备上,自定义视图不会在单击时显示新视图。我很难理解为什么。

    我认为这就是问题所在 : 当我将视图放在屏幕最左侧时,另一个视图仅在点击时显示,但如果我更改标志 > < 现在可以从最右侧打开视图,但不能从左侧打开。

     case MotionEvent.ACTION_MOVE:
                        if(motionEvent.getRawX() > 120 && motionEvent.getRawY() > 120){
                            params.x = initialX + (int) (motionEvent.getRawX() - initialTouchX);
                            params.y = initialY + (int) (motionEvent.getRawY() - initialTouchY);
                            mWindowManager.updateViewLayout(entireLayout, params);
    
                            moving = true;
                        }
    

      collapsedLayout.setOnTouchListener(new View.OnTouchListener() {
            private int initialX;
            private int initialY;
            private float initialTouchX;
            private float initialTouchY;
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                switch (motionEvent.getAction()){
                    case MotionEvent.ACTION_DOWN:
                        initialX = params.x;
                        initialY = params.y;
                        initialTouchX = motionEvent.getRawX();
                        initialTouchY = motionEvent.getRawY();
    
                        return true;
    
                    case MotionEvent.ACTION_MOVE:
                        if(motionEvent.getRawX() > 120 && motionEvent.getRawY() > 120){
                            params.x = initialX + (int) (motionEvent.getRawX() - initialTouchX);
                            params.y = initialY + (int) (motionEvent.getRawY() - initialTouchY);
                            mWindowManager.updateViewLayout(entireLayout, params);
    
                            moving = true;
                        }
                        return true;
    
                    case MotionEvent.ACTION_UP:
    
                        if(moving){
                            if (params.x > 0) {
                                params.x = (int) dpWidth;
                            } else if (params.x < 0) {
                                params.x = (int) dpWidth * -1;
                            }
                            mWindowManager.updateViewLayout(entireLayout, params);
                            moving = false;
                        }else {
                            collapsedLayout.setVisibility(View.GONE);
                            expandedLayout.setVisibility(View.VISIBLE);
                        }
                        return true;
                }
                return false;
            }
        });
    

    提前感谢您的帮助!

    1 回复  |  直到 7 年前
        1
  •  0
  •   Gionne Lapuz    7 年前

    感谢RobVoisey,我找到了如何做的方法。我实现了一个用于拖动视图的Ontouch侦听器和一个用于在点击时显示视图的点击侦听器。我用了这个解决方案 how to use both Ontouch and Onclick for an ImageButton?

    对于实现,对于任何想看到答案的人来说都是这样的:

       private GestureDetector gestureDetector;
    
       public void displayOverlay() {
       gestureDetector = new GestureDetector(this, new SingleTapConfirm());
    
       @Override
            public boolean onTouch(View v, MotionEvent event) {
    
                if (gestureDetector.onTouchEvent(event)) {
    
                    return true;
                } else {
                    switch (event.getAction()) {
                        case MotionEvent.ACTION_DOWN:
                            initialX = params.x;
                            initialY = params.y;
                            initialTouchX = event.getRawX();
                            initialTouchY = event.getRawY();
                            return true;
    
                        case MotionEvent.ACTION_UP:
                            if (params.x > 0) {
                                params.x = (int) dpWidth;
                            } else if (params.x < 0) {
                                params.x = (int) dpWidth * -1;
                            }
                            mWindowManager.updateViewLayout(entireLayout, params);
                            return true;
    
                        case MotionEvent.ACTION_MOVE:
                            params.x = initialX + (int) (event.getRawX() - initialTouchX);
                            params.y = initialY + (int) (event.getRawY() - initialTouchY);
                            mWindowManager.updateViewLayout(entireLayout, params);
                            return true;
                    }
                }
                return false;
            }
        });
       }
    
    
     private class SingleTapConfirm extends GestureDetector.SimpleOnGestureListener {
        @Override
        public boolean onSingleTapUp(MotionEvent event) {
            collapsedLayout.setVisibility(View.GONE);
            expandedLayout.setVisibility(View.VISIBLE);
    
            return true;
        }
    }