para - manual de programacion android pdf
¿Cómo hacer una vista para dibujar en el lienzo? (1)
Sí, puedes hacer esto. Tenga en cuenta que, dado que no lo está adjuntando a un diseño, deberá diseñarlo manualmente antes de dibujarlo:
view.layout(0, 0, viewWidth, viewHeight);
Y a menos que simplemente sepa exactamente lo que quiere para esos parámetros de ancho y alto, es posible que también desee medirlo primero:
int widthSpec = MeasureSpec.makeMeasureSpec (ViewGroup.LayoutParams.WRAP_CONTENT, MeasureSpec.UNSPECIFIED;
int heightSpec = MeasureSpec.makeMeasureSpec (400, MeasureSpec.UNSPECIFIED;
view.measure(widthSpec, heightSpec);
view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
EDITAR:
Si ya conoce el ancho y la altura que necesita:
//Lay the view out with the known dimensions
view.layout (0, 0, rect.width(), rect.height());
//Translate the canvas so the view is drawn at the proper coordinates
canvas.save();
canvas.translate(rect.left, rect.top);
//Draw the View and clear the translation
view.draw(canvas);
canvas.restore();
EDITAR de nuevo:
Sí, probado. Puedes probar esto tú mismo:
public class DrawingActivity extends Activity {
public void onCreate (Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//Set a Rect for the 200 x 200 px center of a 400 x 400 px area
Rect rect = new Rect();
rect.set(100, 100, 300, 300);
//Allocate a new Bitmap at 400 x 400 px
Bitmap bitmap = Bitmap.createBitmap(400, 400, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
//Make a new view and lay it out at the desired Rect dimensions
TextView view = new TextView(this);
view.setText("This is a custom drawn textview");
view.setBackgroundColor(Color.RED);
view.setGravity(Gravity.CENTER);
//Measure the view at the exact dimensions (otherwise the text won''t center correctly)
int widthSpec = View.MeasureSpec.makeMeasureSpec(rect.width(), View.MeasureSpec.EXACTLY);
int heightSpec = View.MeasureSpec.makeMeasureSpec(rect.height(), View.MeasureSpec.EXACTLY);
view.measure(widthSpec, heightSpec);
//Lay the view out at the rect width and height
view.layout(0, 0, rect.width(), rect.height());
//Translate the Canvas into position and draw it
canvas.save();
canvas.translate(rect.left, rect.top);
view.draw(canvas);
canvas.restore();
//To make sure it works, set the bitmap to an ImageView
ImageView imageView = new ImageView(this);
imageView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
setContentView(imageView);
imageView.setScaleType(ImageView.ScaleType.CENTER);
imageView.setImageBitmap(bitmap);
}
}
Tengo una breve pregunta:
Supongamos que tengo un mapa de bits (mutable) que necesito modificar (agregar imágenes, textos, etc.).
En lugar de jugar con muchas clases especiales para dibujar en el lienzo (pintura, lienzo, matrices, etc.), estaba pensando por qué no usar las clases integradas de Android para esta tarea y solo si necesito operaciones realmente personalizadas todavía podría usar el lienzo?
Así que, por ejemplo, para mostrar cualquier tipo de vista (que no tenga ningún padre, por supuesto) en el mapa de bits, podría llamar a la siguiente función:
public void drawViewToBitmap(Bitmap b, View v, Rect rect) {
Canvas c = new Canvas(b);
// <= use rect to let the view to draw only into this boundary inside the bitmap
view.draw(c);
}
¿Es posible tal cosa? tal vez esa sea la forma en que funciona detrás de escena?
¿Qué debo escribir en la parte entre el dibujo y la creación del lienzo?
EDITAR: He intentado el siguiente código, pero no funcionó:
public void drawFromViewToCanvas(final View view, final Rect rect, final Canvas canvas) {
final int widthSpec = View.MeasureSpec.makeMeasureSpec(rect.width(), View.MeasureSpec.EXACTLY);
final int heightSpec = View.MeasureSpec.makeMeasureSpec(rect.height(), View.MeasureSpec.EXACTLY);
view.measure(widthSpec, heightSpec);
// Lay the view out with the known dimensions
view.layout(0, 0, rect.width(), rect.height());
// Translate the canvas so the view is drawn at the proper coordinates
canvas.save();
canvas.translate(rect.left, rect.top);
// Draw the View and clear the translation
view.draw(canvas);
canvas.restore();
}
ejemplo de uso:
final int imageSize = 50;
rect = new Rect(35, 344 , 35 + imageSize, 344 + imageSize);
final ImageView imageView = new ImageView(mContext);
imageView.setImageBitmap(bitmap);
imageView.setScaleType(ScaleType.CENTER_CROP);
drawFromViewToCanvas(imageView, getRect(), canvas);
EDITAR: hay una muestra en el sitio web de Sony :
int measureWidth = View.MeasureSpec.makeMeasureSpec(bitmapWidth, View.MeasureSpec.EXACTLY);
int measuredHeight = View.MeasureSpec.makeMeasureSpec(bitmapHeight, View.MeasureSpec.EXACTLY);
view.measure(measureWidth, measuredHeight);
view.layout(0, 0, bitmapWidth, bitmapHeight);
view.draw(canvas);
pregunto si funciona