Limit viewing of children within parent boundaries

I create a rectangular box and place an image in it that can be moved around. While doing onMove I noticed that the imageView is going out of bounds of its parent view, which I don't want. I want to constrain an imageView within its parent view. How to do it.

Here is the xml:    

<FrameLayout
    android:layout_width="400dp"
    android:layout_height="400dp"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
    android:id="@+id/objContainer"
    android:background="@android:color/holo_blue_bright" >
 <ImageView
        android:id="@+id/iv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@android:drawable/btn_default" />
</FrameLayout>

</RelativeLayout>

      

And the code for the handletouch event:

@Override
public boolean onTouch(View view, MotionEvent event) {
    switch (event.getAction() & MotionEvent.ACTION_MASK) {
        case MotionEvent.ACTION_DOWN:
            final float x = event.getRawX();
            final float y = event.getRawY();

            // Remember where we started
            mLastTouchX = x;
            mLastTouchY = y;

            break;
        case MotionEvent.ACTION_UP:
            break;
        case MotionEvent.ACTION_POINTER_DOWN:
            break;
        case MotionEvent.ACTION_POINTER_UP:
            break;
        case MotionEvent.ACTION_MOVE:


            final float x1 = event.getRawX();
            final float y1 = event.getRawY();

            // Calculate the distance moved
            final float dx = x1 - mLastTouchX;
            final float dy = y1 - mLastTouchY;

            // Move the object
            mPosX += dx;
            mPosY += dy;
            view.setX(mPosX);
            view.setY(mPosY);

            // Remember this touch position for the next move event
            mLastTouchX = x1;
            mLastTouchY = y1;

            // Invalidate to request a redraw
            root.invalidate();
            break;
    }
    return true;
}}

      

+3


source to share


1 answer


Inside your overridden, onTouch

you need to check if the next move will contain ImageView

inside its container.

In other words, you need to check if the ImageView

rectangle remains inside the parent after being moved with dx, dy.

Here's an example:



case MotionEvent.ACTION_MOVE:
    ...
    // Calculate the distance moved
    final float dx = x1 - mLastTouchX;
    final float dy = y1 - mLastTouchY;

    // Make sure we will still be the in parent container
    Rect parent = new Rect(0, 0, root.getWidth(), root.getHeight());

    int newLeft = (int) (iv.getX() + dx),
            newTop = (int) (iv.getY() + dy),
            newRight = newLeft + iv.getWidth(),
            newBottom = newTop + iv.getHeight();

    if (!parent.contains(newLeft, newTop, newRight, newBottom)) {
        Log.e(TAG, String.format("OOB @ %d, %d - %d, %d",
                newLeft, newTop, newRight, newBottom));
        break;
    }
    ...

      

Note that you don't need to invalidate the container as setX / setY invalidates itself ImageView

.

+6


source







All Articles