2015-01-21 11 views
5

Mam wymaganie, gdy widok przeciągalny wymaga, aby cień był początkowo umieszczony bezpośrednio nad widokiem - to znaczy, że obejmuje cały widok, a nie odnosi się do punktu dotyku .Jak pozycjonować płótno w View.DragShadowBuilder.onProvideShadowMetrics

Próbowałem wszystkich rodzajów, aby to działało z moją podklasą View.DragShadowBuilder, ale bez powodzenia. Miałem nadzieję, że użycie drawRect pozwoli mi określić punkty prostokąta, tak aby były rysowane w tym samym prostokącie co mój widok, ale powoduje to, że nie zostanie narysowane żadne płótno.

Jednak po prostu za pomocą canvas.drawColor(Color.CYAN) rysuje prostokąt, ale w stosunku do punktu dotyku.

Oto moja próba korzystania 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); 
    } 
} 

Tutaj niebieski prostokąt jest lekko przesunięte z widokiem spodu powodu gdzie dotknąłem - Chcę, aby całkowicie pokryć pogląd, niezależnie od tego, gdzie dotyka użytkowników .

enter image description here

+0

zamieścić zdjęcie z wymaganego wyniku, w przeciwnym razie trudno jest powiedzieć, co właściwie chcemy osiągnąć – pskink

+0

@pskink Dzięki za sugestię, mam edytowane pytanie –

+0

coś takiego: http: // pastebin. com/3KuF8EmZ? utwórz tego buildera na przykład w onTouchEvent, gdy akcją jest ACTION_DOWN: DragShadowBuilder builder = new DSB (this, event); – pskink

Odpowiedz

2

Oto rozwiązanie, które otrzymałem dzięki sugestiom @ pskinka. W ogóle nie musiałem używać drawRect, kluczem było ustawianie punktu, którego wcześniej nie miałem, ponieważ nie korzystałem z narzędzia onTouchEvent. Dodanie tego dla każdego, kto może mieć ten sam problem.

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

To działa idealnie. Nie ma sensu, żeby DnD działał w jakikolwiek inny sposób. – m1k3t

1

public void drawRect (lewy pływak, float górę, pływak prawo, float dno, farba) Dodane w poziomie API 1

Draw określony Rect użyciu określonego farby. Prostokąt będzie wypełniony lub obramowany w oparciu o styl w farbie. Pozostawione parametry Lewa strona prostokąta do narysowania w górnej części Górna strona prostokąta do narysowania w prawo Prawa strona prostokąta do pobrania dół Dolna strona prostokąta do narysowania farbą farba używana do narysuj linię prostą:

Zaczerpnięte z here.

jeśli chcesz zadzwonić drawRect z x1, y1, x2, y2, nie należy przechodzić x2 i y2 jako współrzędne punktu. Jednak różnica między punktem końcowym i punktem początkowym daje pożądany wynik, więc zamiasti y2 - y1 należy podać zamiast y2 zamiast x2 i y2 - y1.

Powód: right nie jest współrzędną, ale szerokość, bottom nie jest współrzędną, ale wysokością.

+0

Dzięki @Lajos, przegłosowałem twoją odpowiedź, ponieważ wyjaśniło mi to duże nieporozumienie z mojej strony, jednak po tym, jak zasugerowałem zmianę, wciąż nie pojawia się cień, kiedy testuję. Czy jest coś jeszcze, czego mi brakuje? Widok widoku = getView(); \t canvas.drawRect (view.getLeft(), view.getTop(), view.getLeft() + view.getWidth(), view.getTop() + view.getHeight(), paint); –