2015-01-21 5 views
5

드래그 가능한 뷰는 처음부터 뷰의 맨 위에 직접 배치해야하는 요구 사항이 있습니다. 즉, 터치 포인트와 관련하여 전체 뷰를 덮는 것입니다. .View.DragShadowBuilder.onProvideShadowMetrics에서 캔버스를 배치하는 방법

저는이 서브 클래스 인 View.DragShadowBuilder으로이 작업을 수행하려고했지만 모든 행운이 없었습니다. drawRect을 사용하면 직사각형 점을 지정하여 내 사각형과 같은 직사각형에 그릴 수 있기를 기대했지만 캔버스가 그려지지 않습니다.

그러나 단지 canvas.drawColor(Color.CYAN)을 사용하면 사각형이 그려지지만 터치 지점과 관련됩니다. 여기

내 시도는 drawRect을 사용하고 있습니다 : 여기
private class VideoDragShadowBuilder extends View.DragShadowBuilder { 

    public VideoDragShadowBuilder(View v) { 
     super(v); 
    } 

    @Override 
    public void onProvideShadowMetrics (Point size, Point touch) { 
     int width, height; 

     width = getView().getWidth(); 
     height = getView().getHeight(); 

     size.set(width, height); 
     touch.set(width/2, height/2); 
    } 

    @Override 
    public void onDrawShadow(Canvas canvas) { 
     //canvas.drawColor(Color.CYAN); 

     Paint paint = new Paint(); 
     paint.setAntiAlias(true); 
     paint.setAlpha(45); 
     paint.setStyle(Paint.Style.FILL); 
     paint.setColor(Color.CYAN); 

     canvas.drawRect(getView().getLeft(), getView().getTop(), getView().getRight(), getView().getBottom(), paint); 
    } 
} 

이 파란색 사각형이 약간 아래에 있기 때문에 내가 감동 곳의 전망과 잘못 정렬되어있다 -에 관계없이 위치를 사용자의 터치 내가 완전히 뷰를 포함 할 .

enter image description here

+0

게시, 그렇지 않은 경우는 실제로 제안을 – pskink

+0

@pskink 감사를 달성하기 위해 원하는 것을 이야기하기 어려운,이 같은 질문 –

+0

뭔가를 수정했습니다. co.kr/3KuF8EmZ? action이 ACTION_DOWN 일 때 onTouchEvent와 같이이 빌더를 작성하십시오. DragShadowBuilder builder = new DSB (this, event); – pskink

답변

2

다음은 @ pskink의 제안을 사용하여 해결 한 솔루션입니다. drawRect를 전혀 사용할 필요가 없었습니다. 핵심은 onTouchEvent를 사용하지 않았기 때문에 이전에 가지고 있지 않은 터치 포인트를 설정하는 것이 었습니다. 동일한 문제가있는 사람에게이 정보를 추가합니다. HTTP : // 페이스트 빈 필요한 결과 이미지

private Point lastTouch; 

public DraggableFrameLayout(Context context, AttributeSet attrs) { 
    super(context, attrs); 

    dragListener = new View.OnLongClickListener() { 

     @Override 
     public boolean onLongClick(View v) { 
      View.DragShadowBuilder videoShadow = new DragShadowBuilder(v); 
      v.startDrag(draggableData, videoShadow, null, 0); 
      return true; 
     } 
    }; 
} 

@Override 
public boolean onTouchEvent (MotionEvent ev) { 
    lastTouch = new Point((int) ev.getX(), (int) ev.getY()) ; 
    return super.onTouchEvent(ev); 
} 

private class DragShadowBuilder extends View.DragShadowBuilder { 

    public VideoDragShadowBuilder(View v) { 
     super(v); 
    } 

    @Override 
    public void onProvideShadowMetrics (Point size, Point touch) { 
     super.onProvideShadowMetrics(size, touch); 

     // The touch point must be set in order for the canvas to properly fit the view 
     if (lastTouch != null) { 
      touch.set(lastTouch.x, lastTouch.y); 
     } 
    } 

    @Override 
    public void onDrawShadow(Canvas canvas) { 
     super.onDrawShadow(canvas); 
     canvas.drawColor(Color.CYAN); 
    } 
} 
+0

완벽하게 작동합니다. DnD가 다른 방식으로 작동한다는 것은 의미가 없습니다. – m1k3t

1

공공 무효의 drawRect (오른쪽 떠, 최고를 떠 왼쪽으로 떠 바닥, 페인트 페인트 플로트) 지정된 페인트를 사용하여 API 레벨 1

그리기 지정된 사각형에 추가합니다. 사각형은 으로 페인트의 스타일을 기반으로 채워지거나 프레임됩니다. 왼쪽 매개 변수 그릴 직사각형의 왼쪽 상단 오른쪽 그릴의 상단면 그려진 사각형의 오른쪽면 그려지는 사각형의 아래쪽 도장 직사각형을 그립니다.

취향 : here.

당신은 x1, y1x2, y2, 당신은 통과 안 x2y2 점 좌표로와 drawRect를 호출합니다. 그러나 종점과 시작점의 차이로 원하는 결과가 나오므로 y2 대신 x2y2 - y1 대신 x2 - x1을 전달해야합니다.

이유 : right은 좌표가 아니지만 넓이는 bottom은 좌표가 아니라 높이입니다.

+0

감사합니다. @Lajos, 나는 내 부분에 대한 큰 오해를 해결 했으므로 대답을 upvoted했습니다. 그러나 제안 된 변경을 한 후에는 테스트 할 때 여전히 그림자가 나타나지 않습니다. 내가 놓친 다른 것이 있습니까? 보기보기 = getView(); \t canvas.drawRect (view.getLeft(), view.getTop(), view.getLeft() + view.getWidth(), view.getTop() + view.getHeight(), paint); –

관련 문제