2011-01-29 15 views
11

Chciałbym stworzyć "papier milimetrowy" do bitmapy, którą rysuję za pomocą płótna, i próbuję znaleźć najlepszy sposób, aby to zrobić.Układanie bitmapy na płótnie

Nie mogę przekazać źródłowej bitmapy zawierającej tło wykresu do konstruktora Canvas, ponieważ przesyłam płótno w SurfaceView za pomocą wywołania .lockCanvas().

Niektóre rozwiązania próbowałem:

  • Próbowałem wykonawczych this solution w moim SurfaceView za Thread.run(), ale problem moim zdaniem jest, gdy BitmapDrawable jest konwertowany na bitmapę ... traci właściwości płytek.

    canvas = mSurfaceHolder.lockCanvas (null); BitmapDrawable TileMe = new BitmapDrawable (BitmapFactory.decodeResource (getResources(), R.drawable.editor_graph)); TileMe.setTileModeX (Shader.TileMode.REPEAT); TileMe.setTileModeY (Shader.TileMode.REPEAT);

    Bitmap b = TileMe.getBitmap(); canvas.drawBitmap (b, 0, 0, null);

  • Jeśli korzystam z Canvas.drawBitmap method that takes a destination RectF as a parameter, wygląda na to, że bitmapa zostanie wypełniona płytkami w celu wypełnienia RectF ... ale jak zadeklarować RectF niezawodnie, który wypełnia cały obszar widoku?

  • Ustawienie tła działań na pożądany wygląd papieru wykresu również nie działa, ponieważ układ mapy bitowej/płótna jest nieprzezroczysty, a bloki nie są widoczne.

Jakieś pomysły, jak to osiągnąć?

Odpowiedz

27

Masz dwa proste rozwiązania:

  • użyć do BitmapDrawable, ale zamiast wydobywania Bitmap, zadzwoń BitmapDrawable.draw (płótnie). Nie zapomnij ustawić granic ciągnięcia, aby wypełnić obszar rysowania.
  • Utwórz Paint za pomocą BitmapShader i narysuj za nim prostokąt (w zasadzie to robi BitmapDrawable).
+2

Używana metoda BitmapDrawable.draw (Canvas), działa doskonale, dzięki! –

+6

Być może zauważając, że musisz ustawić myBitmapDrawable.setTileModeX (Shader.TileMode.POWTARZAĆ); i myBitmapDrawable.setTileModeY (Shader.TileMode.REPEAT); aby właściwie narysować kafelki ... – bk138

+0

Shadery bitmapowe są takie fajne !! – rupps

-3

Jestem pewien, że istnieje sposób, aby uzyskać efekt kafelkowy za pomocą SurfaceView. Niestety wygląda na to, że nie możesz użyć BitmapDrawable z płótnem. Więc prawdopodobnie musisz zaimplementować własną niestandardową metodę układania kafelków, tworząc własną serię Rect na Canvas i rysując skalowaną bitmapę do każdej z nich.

Szczerze mówiąc nie byłoby tak trudno. Po prostu uzyskaj szerokość/wysokość widoku i utwórz tablicę z Rect opartą na tych danych, do których narysujesz Bitmap.

Ewentualnie, jeśli nie trzeba modyfikować faktycznego kafelkowego tła w locie, po prostu narysuj je jako tło i narysuj na nim SurfaceView. Ten wpis, który podłączyłeś, dostarczył wielu rozwiązań do układania kafelków, które możesz zastosować.

+2

Możesz użyć BitmapDrawable z Canvas. Wszystko, co musisz zrobić, to napisaćDrawable.draw (canvas). –