android:在布局大小内拖动视图(sceen size)

时间:2017-03-15 12:44:53

标签: android drag

我希望imageview仅在屏幕尺寸范围内可拖动。但是下面代码的问题是,只有左边和上边距会停止imageview,如何实现右边距和下边距的if语句,以便它阻止视图离开焦点。以下是代码,提前致谢

            public boolean onTouch(View view, MotionEvent event) {

            DisplayMetrics displaymetrics = new DisplayMetrics();
            getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
            float screenHeight = displaymetrics.heightPixels;
            float screenWidth = displaymetrics.widthPixels;

            final int x = (int) event.getRawX();
            final int y = (int) event.getRawY();

            if(view==image1){
                switch (event.getAction() & MotionEvent.ACTION_MASK) {

                    case MotionEvent.ACTION_DOWN:
                        LinearLayout.LayoutParams lParams = (LinearLayout.LayoutParams)
                                view.getLayoutParams();
                        xDelta = x - lParams.leftMargin;
                        yDelta = y - lParams.topMargin;
                        x1Delta = lParams.rightMargin;
                        y2Delta = lParams.bottomMargin;
                        break;

                    case MotionEvent.ACTION_UP:                        
                        break;

                    case MotionEvent.ACTION_MOVE:
                        LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) view
                                .getLayoutParams();
                         //below leftMargin , topMargin works fine
                        if((x - xDelta) > 0 && (x - xDelta) < screenWidth ){layoutParams.leftMargin = x - xDelta;}
                        if((y - yDelta) > 0 && (y - yDelta) < screenHeight){layoutParams.topMargin = y - yDelta;}
                        layoutParams.rightMargin = 0;//how to make this stops the imageview on rightMargin
                        layoutParams.bottomMargin = 0;//how to make this stops the imageview on bottomMargin
                            view.setLayoutParams(layoutParams);
                        break;
                }
                mainLayout.invalidate();
            }
            return true;
        }
    };

1 个答案:

答案 0 :(得分:1)

经过长时间的研究后,我自己找到了答案,并将LinearLayout更改为AbsoluteLayout ..

 @Override
        public boolean onTouch(View view, MotionEvent event) {

                switch (event.getAction() & MotionEvent.ACTION_MASK) {

                    case MotionEvent.ACTION_DOWN:
                        xDelta = event.getX();
                        yDelta = event.getY();
                        break;

                    case MotionEvent.ACTION_POINTER_DOWN:
                        oldDist = spacing(event);
                        if (oldDist > 10f) {
                            mode = ZOOM;
                        }

                    case MotionEvent.ACTION_UP:
                        break;

                    case MotionEvent.ACTION_MOVE:
                        x1Delta = event.getX() - xDelta ;
                        y2Delta = event.getY() - yDelta;

                        m_posX = m_prevX + x1Delta;
                        m_posY = m_prevY + y2Delta;

                        if (m_posX > 0 && m_posY > 0 && (m_posX + view.getWidth()) < mainLayout.getWidth() && (m_posY + view.getHeight()) < mainLayout.getHeight())
                        {
                            view.setLayoutParams(new AbsoluteLayout.LayoutParams(view.getMeasuredWidth(), view.getMeasuredHeight(), (int) m_posX, (int) m_posY));

                            m_prevX = m_posX;
                            m_prevY = m_posY;
                        }

                        break;
                }
                mainLayout.invalidate();
            return true;
        }
    };