2011-02-07 21 views
23

Soy nuevo en la programación de Android y lo que estoy tratando de descubrir es esto;Android: dibujar un lienzo en un ImageView

En mi diseño tengo un TextView, ImageView y Button, todo en un LinearLayout orientado verticalmente.

Quiero dibujar círculos dinámicamente en ImageView, sin alterar el resto de mi diseño (vista de texto/botón). Intento crear un lienzo y utilizar la función drawcircle dentro del lienzo para establecer la ubicación del círculo. Y luego dibuje ese lienzo en mi imagen de alguna manera. No puedo hacer que esto funcione, ¿hay algún truco para esto? ¿O mi método es fundamentalmente erróneo? ¿Cómo voy a dibujar círculos en ImageView sin volver a crear todo el diseño?

Gracias!

Respuesta

0

Si tiene un xml con diseño con todos sus elementos dispuestos en orientación vertical.

Puede lograr lo que desea haciendo una clase en su paquete que amplíe Class View y anule su método onDraw. dibuja un círculo en él como quieras.

continuación, en lugar de añadir imageView en el diseño de añadir este a su propio punto de vista en el xml layout.like la siguiente

< LinearLayout>

< TextView> < /TextView> 

    < Button> < /Button> 

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

</LinearLayout>

Compruebe el siguiente enlace para Gráficos 2D Es un gran tutorial para leer.
http://organicandroid.blogspot.com/2010/08/starting-to-play-with-graphics.html
Esperanza esta ayuda:)

+0

Por favor, actualice el enlace. Blog eliminado –

0

Hay un par de maneras de hacer lo que quiere, pero utilizando un ImageView la forma en que describe no es uno de ellos. Una posibilidad es hacer que ImageView muestre un Drawable animado. A continuación, puede centrarse en hacer que su implementación Drawable dibuje los círculos. Otra es crear un nuevo mapa de bits cada vez que desee cambiar la imagen y configurar ImageView para mostrar el nuevo mapa de bits. La forma habitual de hacer esto, sin embargo, es crear una subclase de vista personalizada. El proyecto de ejemplo API Demos tiene un ejemplo de una vista personalizada, y puede encontrar muchos tutoriales con Google.

26

Tuve el mismo desafío y llegué a la conclusión de que sobrescribir OnDraw al menos en el caso general no funcionaría. My blog explica los motivos. Lo que funcionó muy bien para mí es el siguiente:

  1. Crea un nuevo mapa de bits de imagen y adjunta un lienzo nuevo.
  2. Dibuje el mapa de bits de la imagen en el lienzo.
  3. Dibuje todo lo que desee en el lienzo.
  4. Adjunte el lienzo a ImageView.

Aquí es un fragmento de código para esto:

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

Gracias, funciona bien – Lilo

+5

Solo una sugerencia, ya que me encontré con el mismo problema, en lugar de crear un nuevo mapa de bits, también podemos utilizar la función 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

y ¿qué sucede si quiero eliminar lienzo después de setImageBitmap? –

2

Creo que un mejor enfoque sería crear un ImageView costumbre y Reemplazar el método onDraw.Algo así como:

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

Sería una buena idea para poner en práctica algo de lógica que comprueba si hay un nuevo mapa de bits para adquirir a través del método de actualización(), por lo que el código dentro de onDraw no ejecutará cada vez y poner sobrecarga al sistema.

Y luego use su vista personalizada donde la necesite. La forma más fácil sería declarar directamente en el interior del activity_layout.xml como tal:

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

Y a continuación, el acceso está en su código como cualquier otra vista mediante el uso de:

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