2011-01-29 21 views
11

Vorrei creare un aspetto di "carta millimetrata" per la bitmap che sto disegnando tramite una tela e cercando di capire il modo migliore per farlo.Piastrellatura di una bitmap su una tela

Non riesco a passare una bitmap di origine che contiene lo sfondo della carta millimetrata al costruttore Canvas, poiché sto recuperando la tela in SurfaceView tramite la chiamata .lockCanvas().

Alcune soluzioni che ho provato:

  • ho provato attuazione this solution in Thread.run di mio SurfaceView(), ma il problema credo sia quando il BitmapDrawable viene convertito in una bitmap ... perde le proprietà di piastrellatura.

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

  • Se utilizzo lo Canvas.drawBitmap method that takes a destination RectF as a parameter, sembra che la bitmap venga affiancata per riempire il RectF ... ma come posso dichiarare un RectF affidabile che riempie l'intera area di visualizzazione?

  • Anche l'impostazione dello sfondo Attività sull'aspetto desiderato della carta millimetrata non funziona, in quanto il layout bitmap/canvas è opaco e impedisce di essere visto.

Qualche idea su come raggiungere questo obiettivo?

risposta

27

Avete due soluzioni facili:

  • utilizzare una BitmapDrawable, ma invece di estrarre il bitmap, basta chiamare BitmapDrawable.draw (tela). Non dimenticare di impostare i limiti del drawable per riempire la tua area di disegno.
  • Creare un disegno con un BitmapShader e disegnare un rettangolo con esso (questo è fondamentalmente ciò che fa BitmapDrawable).
+2

Utilizzato il metodo BitmapDrawable.draw (Canvas), funziona perfettamente, grazie! –

+6

Forse notando che è necessario impostare myBitmapDrawable.setTileModeX (Shader.TileMode.RIPETERE); e myBitmapDrawable.setTileModeY (Shader.TileMode.REPEAT); in realtà disegnare piastrelle ... – bk138

+0

shader bitmap sono così cool !! – rupps

-3

Sono sicuro che c'è un modo per ottenere un effetto affiancato usando uno SurfaceView. Sfortunatamente, sembra che tu non possa usare BitmapDrawable con una tela. Quindi probabilmente dovresti implementare il tuo metodo di piastrellatura personalizzato creando la tua serie di Rect su Canvas e disegnando una bitmap ridimensionata a ciascuno di essi.

Onestamente non sarebbe così difficile. Basta ottenere la larghezza/altezza della vista e creare una serie di Rect basata su questi dati che verranno disegnati a Bitmap.

In alternativa, se non è necessario apportare modifiche allo sfondo piastrellato reale al volo, basta disegnarlo come sfondo e disegnare il SurfaceView sopra di esso. Quel post che hai collegato ha fornito più soluzioni per affiancare un BitmapDrawable che potresti implementare.

+2

È possibile utilizzare BitmapDrawable con una tela. Tutto ciò che devi fare è scrivere theDrawable.draw (canvas). –