2013-03-28 1 views
2

하위보기와 상위보기 사이에 끌어서 놓기를 수행하는 방법이 필요합니다. 그래서 나는 더 나은 설명에 대한 이미지를 넣어 것입니다 :Android보기를 드래그하여 그의 부모를 변경하십시오.

enter image description here

노란색 RelativeLayout의를 확장하는 클래스를 나타냅니다. 블랙 화이트 레드가

그래서 나는 노란색보기에 화이트 블록 (ImageViews를) 삭제할 필요가보기를 나타냅니다 ImageViews 나타내는 뷰 그룹 를 확장하는 클래스를 나타내지 만 이미지 뷰는 같은 ​​BlackView을 가지고 있기 때문에 난 단지, 블랙 뷰를 통해 드래그 아버지, 그래서 지금 내 해결책은 아버지의 드래그 뷰를 변경하는 것입니다.하지만 YellowView에서 뷰를 추가하면 드래그 이벤트가 취소되므로 뷰를 변경할 때 드래그를 계속해야합니다. 참고로 TouchView와 White View가 RedView White 블록에서 멀어지면 BlackView로 다시 돌아갈 수있는 유일한 방법은 RedView에있는 WhiteView입니다.

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

그래서 내가 듭니다 조금 dificult 생각하지만, 어느 하나가 나를 노란색에 검은 색에서 WhiteView을 변경하고 내가 뵙죠 것 끌려 유지하는 데 도움이 :이 코드를 사용하여 그래서

, 나는 웹에서 얻을 .

감사합니다.

+0

을 사용하고 코드를 포함 당신을 지금 사용하고 있습니까? – FoamyGuy

+0

@FoamyGuy ok, 코드 조각을 넣었습니다. 자세한 정보가 필요하면 다시 편집 해 보겠습니다. – Ricardo

답변

0

사용 ViewDragHelper! 여기

u는 문서를 찾을 수 있습니다 :이

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

같은 https://developer.android.com/reference/android/support/v4/widget/ViewDragHelper.html

재정 UR onTouch 이벤트가 다음 질문을 편집 할 수 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; 
       } 
} 
관련 문제