2015-05-28 2 views
3

Я создаю прямоугольную коробку и помещаю изображение в нее, которое можно перемещать. Выполняя onMove, я заметил, что imageView выходит из границ его родительского представления, которое я не хочу. Я хочу ограничить изображениеView в пределах его родительского представления. Как это сделать.Ограничение просмотра дочерних элементов в пределах родительских границ

Вот 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> 

И код handletouch событие:

@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; 
}} 

ответ

5

Внутри изменённые onTouch вам нужно проверить, если следующий шаг будет держать ImageView внутри контейнера ,

Другими словами, вы должны проверить, останется ли прямоугольник ImageView внутри родителя после перемещения по dx, dy.

Вот пример:

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's 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; 
    } 
    ... 

Заметим также, что вам не нужно аннулировать контейнер, так как Setx/SetY обесценивает сам ImageView.

+0

Работал как очарование. Благодарю. – user531069

Смежные вопросы