Android - move an ImageView on screen (Like dragging)

前端 未结 6 1288
灰色年华
灰色年华 2021-02-05 15:34

I\'m trying to create an app that can move an ImageView on your device like dragging and when I put like 75% of the ImageView out of the screen show a

6条回答
  •  萌比男神i
    2021-02-05 16:29

    Your routine works for the most part. In the following code, I have commented out sections that are not needed and made notations for those parts that need some explanation. Here is what the finished product looks like:

    This graphic explains how the left margin is calculated. The same type of calculation applies to the top margin.

    MainActivity.java

    public class MainActivity extends AppCompatActivity implements View.OnTouchListener {
    
        int windowwidth; // Actually the width of the RelativeLayout.
        int windowheight; // Actually the height of the RelativeLayout.
        private ImageView mImageView;
        private ViewGroup mRrootLayout;
        private int _xDelta;
        private int _yDelta;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            // We are interested when the image view leaves its parent RelativeLayout
            // container and not the screen, so the following code is not needed.
    //        DisplayMetrics displaymetrics = new DisplayMetrics();
    //        this.getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
    //        windowwidth = displaymetrics.widthPixels;
    //        windowheight = displaymetrics.heightPixels;
            mRrootLayout = (ViewGroup) findViewById(R.id.root);
            mImageView = (ImageView) mRrootLayout.findViewById(R.id.im_move_zoom_rotate);
    
            // These these following 2 lines that address layoutparams set the width
            // and height of the ImageView to 150 pixels and, as a side effect, clear any
            // params that will interfere with movement of the ImageView.
            // We will rely on the XML to define the size and avoid anything that will
            // interfere, so we will comment these lines out. (You can test out how a layout parameter
            // can interfere by setting android:layout_centerInParent="true" in the ImageView.
    //        RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(150, 150);
    //        RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(150, 150);
    //        mImageView.setLayoutParams(layoutParams);
            mImageView.setOnTouchListener(this);
    
            // Capture the width of the RelativeLayout once it is laid out.
            mRrootLayout.post(new Runnable() {
                @Override
                public void run() {
                    windowwidth = mRrootLayout.getWidth();
                    windowheight = mRrootLayout.getHeight();
                }
            });
        }
    
        // Tracks when we have reported that the image view is out of bounds so we
        // don't over report.
        private boolean isOutReported = false;
    
        public boolean onTouch(View view, MotionEvent event) {
            final int X = (int) event.getRawX();
            final int Y = (int) event.getRawY();
    
            // Check if the image view is out of the parent view and report it if it is.
            // Only report once the image goes out and don't stack toasts.
            if (isOut(view)) {
                if (!isOutReported) {
                    isOutReported = true;
                    Toast.makeText(this, "OUT", Toast.LENGTH_SHORT).show();
                }
            } else {
                isOutReported = false;
            }
            switch (event.getAction() & MotionEvent.ACTION_MASK) {
                case MotionEvent.ACTION_DOWN:
                    // _xDelta and _yDelta record how far inside the view we have touched. These
                    // values are used to compute new margins when the view is moved.
                    _xDelta = X - view.getLeft();
                    _yDelta = Y - view.getTop();
                    break;
                case MotionEvent.ACTION_UP:
                case MotionEvent.ACTION_POINTER_DOWN:
                case MotionEvent.ACTION_POINTER_UP:
                    // Do nothing
                    break;
                case MotionEvent.ACTION_MOVE:
                    RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) view
                        .getLayoutParams();
                    // Image is centered to start, but we need to unhitch it to move it around.
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
                        lp.removeRule(RelativeLayout.CENTER_HORIZONTAL);
                        lp.removeRule(RelativeLayout.CENTER_VERTICAL);
                    } else {
                        lp.addRule(RelativeLayout.CENTER_HORIZONTAL, 0);
                        lp.addRule(RelativeLayout.CENTER_VERTICAL, 0);
                    }
                    lp.leftMargin = X - _xDelta;
                    lp.topMargin = Y - _yDelta;
                    // Negative margins here ensure that we can move off the screen to the right
                    // and on the bottom. Comment these lines out and you will see that
                    // the image will be hemmed in on the right and bottom and will actually shrink.
                    lp.rightMargin = view.getWidth() - lp.leftMargin - windowwidth;
                    lp.bottomMargin = view.getHeight() - lp.topMargin - windowheight;
                    view.setLayoutParams(lp);
                    break;
            }
            // invalidate is redundant if layout params are set or not needed if they are not set.
    //        mRrootLayout.invalidate();
            return true;
        }
    
        private boolean isOut(View view) {
            // Check to see if the view is out of bounds by calculating how many pixels
            // of the view must be out of bounds to and checking that at least that many
            // pixels are out.
            float percentageOut = 0.50f;
            int viewPctWidth = (int) (view.getWidth() * percentageOut);
            int viewPctHeight = (int) (view.getHeight() * percentageOut);
    
            return ((-view.getLeft() >= viewPctWidth) ||
                (view.getRight() - windowwidth) > viewPctWidth ||
                (-view.getTop() >= viewPctHeight) ||
                (view.getBottom() - windowheight) > viewPctHeight);
        }
    }
    

    activity_main.xml

    
    
        
    
    
    

提交回复
热议问题