2013-03-28 2 views
2

Мне нужен способ сделать перетаскивание между дочерним видом и родительским представлением. Так что я положил изображение для лучшего объяснения:Android Перетащите вид и измените его родительский

enter image description here

Желтый представляют собой класс, который расширяет RelativeLayout. Black представляют собой класс, который расширяет ViewGroup White представляет ImageViews Red представляет собой вид

Так что мне нужно сбросить белые блоки (ImageViews) на желтом View, но я только перетащить Black View, потому что ImageView имеет BlackView как отец, поэтому мое решение на данный момент - это перетаскивание взгляда отца, но когда я добавляю представление о YellowView, отмените мое событие перетаскивания, поэтому мне нужно продолжить перетаскивание, когда я переключаюсь между Views. Обратите внимание: для WhiteView есть единственный способ размещения в RedView, если Touch Up и White вид далеко от RedView White, вернутся к BlackView.

Итак, я использую этот код, я получаю от сети:

public boolean onTouch(View v, MotionEvent event) { 
    int action = event.getAction(); 
    switch (action & MotionEvent.ACTION_MASK) { 
     case MotionEvent.ACTION_DOWN: 
      touchDown(event); 
      break; 
     case MotionEvent.ACTION_MOVE: 
      touchMove(event); 
      break; 
     case MotionEvent.ACTION_UP: 
      touchUp(event); 
      break; 
    } 
    if (aViewIsDragged()) 
     return true; 
    return false; 
} 
private void touchDown(MotionEvent event) { 
    initialX = (int)event.getRawX(); 
    initialY = (int)event.getRawY(); 
    lastTouchX = (int)event.getRawX() + (gridPageWidth); 
    lastTouchY = (int)event.getRawY(); 
} 

public boolean onLongClick(View v) {   
    if(positionForView(v) != -1) { 
     movingView = true; 
     dragged = positionForView(v); 
     return true; 
    } 
    return false; 
} 
private void touchMove(MotionEvent event) { 

    if (movingView && aViewIsDragged()) { 
     lastTouchX = (int) event.getX(); 
     lastTouchY = (int) event.getY(); 

     moveDraggedView(lastTouchX, lastTouchY); 
     manageSwapPosition(lastTouchX, lastTouchY); 
     manageEdgeCoordinates(lastTouchX); 
     manageDeleteZoneHover(lastTouchX, lastTouchY); 
    } 
} 
private void moveDraggedView(int x, int y) { 
    ImageView child = null; 
    View childAt = getChildAt(dragged); 
    int width = childAt.getMeasuredWidth(); 
    int height = childAt.getMeasuredHeight(); 
    int left = x - (1 * width/2); 
    int t = y - (1 * height/2); 
    childAt.layout(left, t, left + width, t + height); 
    //TODO at this point if left less than 0, I detect part of view is out and I need to change this view to Yello 
    if (left <0){ 
      child = (ImageView) childAt; 
      ViewGroup parent = (ViewGroup) getParent(); 
      cloneimage = new ImageView(getContext()); 
      cloneimage.setBackgroundDrawable(child.getDrawable()); 
      parent.addView(cloneimage);    
    } 
} 

Так что я думаю, что it'sa немного dificult, но если какой-либо один помочь мне изменить WhiteView от черного до желтого и держать тащили я apreciate ,

Thank's!

+0

Можете ли вы изменить свой вопрос, и включают в себя код, который вы теперь используются? – FoamyGuy

+0

@FoamyGuy хорошо, я положил кусок кода. Если вам нужна дополнительная информация, я снова отредактирую. – Ricardo

ответ

0

использование ViewDragHelper!

здесь и можно найти в документации: https://developer.android.com/reference/android/support/v4/widget/ViewDragHelper.html

Override ур onTouch события, как эта

@Override 
public boolean onInterceptTouchEvent(MotionEvent ev) { 
    final int action = ev.getActionMasked(); 
    if (action == MotionEvent.ACTION_CANCEL || action == MotionEvent.ACTION_UP) { 
     mDragHelper.cancel(); 
     return false; 
    } 
    return mDragHelper.shouldInterceptTouchEvent(ev); 
} 

@Override 
public boolean onTouchEvent(MotionEvent ev) { 
    mDragHelper.processTouchEvent(ev); 
    return true; 
} 

затем использовать viewDragViewHelper

ViewDragHelper.create(DragCoordinatorLayout.this, 1.0f, new ViewDragHelper.Callback() { 

       @Override 
       public boolean tryCaptureView(View child, int pointerId) { 
        return true; 
       } 

       @Override 
       public int clampViewPositionHorizontal(View child, int left, int dx) { 
        return left; 
       } 

       @Override 
       public int clampViewPositionVertical(View child, int top, int dy) { 
        return top; 
       } 
}