2011-02-07 5 views
23

Sono nuovo nella programmazione Android e quello che sto cercando di capire è questo;Android: disegno di una tela su ImageView

Nel mio layout ho un TextView, ImageView e Button, il tutto su un LinearLayout orientato verticalmente.

Desidero essere in grado di disegnare dinamicamente i cerchi in ImageView, senza disturbare il resto del layout (vista testo/pulsante). Sto cercando di creare una tela e utilizzare la funzione drawcircle all'interno della tela per impostare la posizione del cerchio. E poi disegnare quella tela alla mia visione d'immagine in qualche modo. Non riesco a farlo funzionare, c'è un trucco per questo? O il mio metodo è fondamentalmente sbagliato? Come faccio a disegnare cerchi in ImageView senza ricreare il mio intero layout?

Grazie!

risposta

0

Se si dispone di un XML con layout con tutti gli elementi disposti in orientamento verticale.

È possibile ottenere ciò che si desidera creando una classe nel pacchetto che estende Class View e sovrascrive il metodo onDraw. Disegna il cerchio come vuoi.

poi invece di aggiungere ImageView nel layout Aggiungi il tuo punto di vista nel xml layout.like il seguente

< LinearLayout>

< TextView> < /TextView> 

    < Button> < /Button> 

    <com.prac.MyView> </ com.prac.MyView> 

</LinearLayout>

Controllare il seguente link per Grafica 2D. È un ottimo tutorial da leggere.
http://organicandroid.blogspot.com/2010/08/starting-to-play-with-graphics.html
Spero che questo aiuto:)

+0

Si prega di aggiornare il collegamento. Il blog è stato rimosso –

0

Ci sono un paio di modi per fare ciò che si vuole, ma utilizzando un ImageView il modo di descrivere non è uno di loro. Una possibilità è far visualizzare a ImageView un Drawable animato. Puoi quindi concentrarti sul fatto che la tua implementazione Drawable possa disegnare le cerchie. Un altro è creare una nuova Bitmap ogni volta che vuoi che l'immagine cambi e impostare ImageView per visualizzare la nuova Bitmap. Il solito modo di farlo è creare una sottoclasse Vista personalizzata. Il progetto di esempio API Demos ha un esempio di visualizzazione personalizzata e puoi trovare numerosi tutorial con Google.

26

Ho avuto la stessa sfida e sono giunto alla conclusione che la sovrascrittura suDraw, almeno nel caso generale, non funziona. My blog spiega i motivi. Ciò che ha funzionato molto bene per me è il seguente:

  1. Creare una nuova immagine bitmap e allegare una nuova tela ad esso.
  2. Disegna la bitmap dell'immagine nell'area di disegno.
  3. Disegna tutto il resto desiderato nella tela.
  4. Collegare la tela al ImageView.

Ecco un frammento di codice per questo:

import android.graphics.Bitmap; 
import android.graphics.Canvas; 
import android.graphics.Paint; 
import android.graphics.RectF; 
import android.graphics.drawable.BitmapDrawable; 

ImageView myImageView = ... 
Bitmap myBitmap = ... 
Paint myRectPaint = ... 
int x1 = ... 
int y1 = ... 
int x2 = ... 
int y2 = ... 

//Create a new image bitmap and attach a brand new canvas to it 
Bitmap tempBitmap = Bitmap.createBitmap(myBitmap.getWidth(), myBitmap.getHeight(), Bitmap.Config.RGB_565); 
Canvas tempCanvas = new Canvas(tempBitmap); 

//Draw the image bitmap into the cavas 
tempCanvas.drawBitmap(myBitmap, 0, 0, null); 

//Draw everything else you want into the canvas, in this example a rectangle with rounded edges 
tempCanvas.drawRoundRect(new RectF(x1,y1,x2,y2), 2, 2, myPaint); 

//Attach the canvas to the ImageView 
myImageView.setImageDrawable(new BitmapDrawable(getResources(), tempBitmap)); 
+0

Grazie, funziona bene – Lilo

+5

Solo un suggerimento visto che mi sono imbattuto nello stesso problema, invece di creare un nuovo BitmapDrawable, possiamo utilizzare anche la funzione myImageView.setImageBitmap (tempBitmap)! – balachandarkm

20
 ImageView imageView=(ImageView) findViewById(R.id.image); 
     Bitmap bitmap = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);  
     Canvas canvas = new Canvas(bitmap); 
     Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); 
     paint.setColor(Color.BLACK); 
     canvas.drawCircle(50, 50, 10, paint); 
     imageView.setImageBitmap(bitmap); 
+0

e cosa succede se voglio cancellare il canvas dopo setImageBitmap? –

2

penso che un approccio migliore sarebbe quello di creare un ImageView personalizzato e l'override del metodo OnDraw.Qualcosa di simile:

public class CustomView extends ImageView { 

public CustomView(Context context) { 
    super(context); 
} 

public CustomView(Context context, AttributeSet attrst) { 
    super(context, attrst); 
} 

public CustomView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
} 

MyBitmapFactory bitMapFac = null; 
public void setBitmapFactory(MyBitmapFactory bitMapFac) 
{ 
    this.bitMapFac = bitMapFac; 
} 

@Override 
public void onDraw(Canvas canvas) { 

    canvas.drawColor(Color.TRANSPARENT); 
    /*instantiate a bitmap and draw stuff here, it could well be another 
    class which you systematically update via a different thread so that you can get a fresh updated 
    bitmap from, that you desire to be updated onto the custom ImageView. 
    That will happen everytime onDraw has received a call i.e. something like:*/ 
    Bitmap myBitmap = bitMapFac.update(); //where update returns the most up to date Bitmap 
    //here you set the rectangles in which you want to draw the bitmap and pass the bitmap   
    canvas.drawBitmap(myBitMap, new Rect(0,0,400,400), new Rect(0,0,240,135) , null); 
    super.onDraw(canvas); 
    //you need to call postInvalidate so that the system knows that it should redraw your custom ImageView 
    this.postInvalidate(); 
} 
} 

Sarebbe una buona idea di implementare una logica che controlla se v'è una bitmap fresco di acquisire tramite il metodo update(), in modo che il codice all'interno OnDraw non verrà eseguito ogni volta e mettere in testa al sistema.

E quindi utilizzare la vista personalizzata ovunque ne abbiate bisogno. Il modo più semplice sarebbe quella di dichiarare direttamente all'interno del activity_layout.xml in quanto tale:

<com.mycustomviews.CustomView 
     android:id="@+id/customView" 
     android:layout_centerInParent="true" 
     android:layout_height="135dp" 
     android:layout_width="240dp" 
     android:background="@android:color/transparent"/> 

E poi l'accesso è nel codice come qualsiasi altra vista utilizzando:

customView = (CustomView) findViewById(R.id.customView);