首页 > 解决方案 > 屏幕上可拖动视图的约束

问题描述

现在按钮垂直超出范围。

它应该只能垂直移动,但不能离开屏幕。在水平方向上,我限制了它的移动。

 @Override
   public boolean onTouch(View view, MotionEvent event) {
    switch (event.getActionMasked()) {
        case MotionEvent.ACTION_DOWN:
            dX = view.getX() - event.getRawX();
            dY = view.getY() - event.getRawY();
            lastAction = MotionEvent.ACTION_DOWN;
            break;

        case MotionEvent.ACTION_MOVE:
            view.setY(event.getRawY() + dY);
           //view.setX(event.getRawX() + dX); (restricted horizontal movement)
            lastAction = MotionEvent.ACTION_MOVE;

            break;

        case MotionEvent.ACTION_UP:
            if (lastAction == MotionEvent.ACTION_DOWN)
           break;

我希望在我的视图上垂直添加自定义约束。

标签: androidviewdraggable

解决方案


您需要计算总屏幕尺寸并在触发触摸事件时跟踪视图的初始坐标,然后计算新坐标并更新视图在屏幕上的位置。像这样的东西:

       @Override
       public boolean onTouch(View v, MotionEvent event) {
         switch (event.getAction()) {
           case MotionEvent.ACTION_DOWN:

                   //remember the initial position.
                   initialX = params.x;
                   initialY = params.y;

                   //get the touch location
                   initialTouchX = event.getRawX();
                   initialTouchY = event.getRawY();
                   return true;
               case MotionEvent.ACTION_UP:
                   int Xdiff = (int) (event.getRawX() - initialTouchX);
                   int Ydiff = (int) (event.getRawY() - initialTouchY);


                   //The check for Xdiff <10 && YDiff< 10 because sometime elements moves a little while clicking.
                   //So that is click event.
                   if (Xdiff < 10 && Ydiff < 10) {
                       if (isViewCollapsed()) {
                           //When user clicks on the image view of the collapsed layout,
                           //visibility of the collapsed layout will be changed to "View.GONE"
                           //and expanded view will become visible.
                           collapsedView.setVisibility(View.GONE);
                           expandedView.setVisibility(View.VISIBLE);
                       }
                   }
                   return true;
               case MotionEvent.ACTION_MOVE:
                   //Calculate the X and Y coordinates of the view.
                   params.x = initialX + (int) (event.getRawX() - initialTouchX);
                   params.y = initialY + (int) (event.getRawY() - initialTouchY);


                   //Update the layout with new X & Y coordinate
                   mWindowManager.updateViewLayout(mFloatingView, params);
                   return true;
           }
           return false;
       }

阅读本教程,它将帮助您在视图上应用自定义约束。


推荐阅读