2011-09-04 8 views
9

Se encuentran muchas publicaciones de acuerdo con el tema "captura de pantalla una vista de texto en un mapa de bits".Cómo dibujar una vista de texto en un mapa de bits (sin dibujar nunca en la pantalla)

Bueno, la diferencia con mi problema es que primero se dibuja la vista en la pantalla (con todo el trabajo de disposición y medición ya hecho) y luego se dibuja en un Lienzo conectado a un Mapa de Bits.

Solo quiero crear un TextView desde cero sin que se muestre nunca en la pantalla que se representa en un mapa de bits.

Esta es la configuración base que ya está funcionando. Un clic en TextView se dibuja en un mapa de bits y lo establece en un ImageView.

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" android:layout_height="fill_parent" 
    android:orientation="vertical" android:background="#fff"> 

    <TextView android:id="@+id/tv" android:layout_width="wrap_content" 
     android:layout_height="wrap_content" android:text="The Quick Brown Fox Jumps Over The Lazy Dog." 
     android:textSize="20dip" android:background="#abcdef" 
     android:textColor="#000" android:padding="10dip" 
     android:layout_margin="10dip" /> 

    <ImageView android:id="@+id/iv" android:layout_width="449px" 
     android:layout_height="47px" android:background="#56789a" 
     android:layout_margin="10dip" /> 
</LinearLayout> 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    findViewById(R.id.tv).setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      Bitmap bmp = Bitmap.createBitmap(449, 47, Bitmap.Config.ARGB_8888); 
      Canvas canvas = new Canvas(bmp); 

      v.draw(canvas); 

      ImageView iv = (ImageView) findViewById(R.id.iv); 
      iv.setImageBitmap(bmp); 
     } 
    }); 
} 

Ahora viene la parte problemática. Crearé un TextView en Java y quiero que este se dibuje directamente en un mapa de bits. Después de esto, estableceré esto en un ImageView. Nunca tuve este espectáculo de correr :(

Bitmap bmp = Bitmap.createBitmap(449, 47, Bitmap.Config.ARGB_8888); 
Canvas canvas = new Canvas(bmp); 

TextView tv = new TextView(this); 
tv.setText("THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG"); 
tv.setTextSize(55f); 
tv.setTextColor(this.getResources().getColor(android.R.color.black)); 
tv.draw(canvas); 

ImageView iv = (ImageView) findViewById(R.id.iv); 
iv.setImageBitmap(bmp); 

Esto no funciona ni en onCreate ni en un OnClickListener. Experimentando con setDrawingCacheEnabled(), medida() y requestLayout() no funcionó bien.

Respuesta

19

Aquí hay dos métodos para dibujar un TextView en un lienzo que pertenece a una vista o se deriva de un mapa de bits:

//method 1 
TextPaint tp = new TextPaint(TextPaint.ANTI_ALIAS_FLAG); 
tp.setColor(Color.WHITE); 
tp.setTextSize(30); 
tp.setShadowLayer(5, 2, 2, Color.CYAN); 
StaticLayout sl=new StaticLayout("This is the first sample text 
     which will be wrapped within the text box.",tp,300, 
     Layout.Alignment.ALIGN_NORMAL, 1f,0f,false); 

canvas.save(); 
canvas.translate(50, 20); //position text on the canvas 
sl.draw(canvas); 
canvas.restore(); 

//method 2 
TextView textView = new TextView(StartActivity.this); 
textView.layout(0, 0, 300, 500); //text box size 300px x 500px 
textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, 30); 
textView.setTextColor(Color.WHITE); 
textView.setShadowLayer(5, 2, 2, Color.CYAN); //text shadow 
textView.setText("This is the second sample 
     text which will be wrapped within the text box."); 
textView.setDrawingCacheEnabled(true); 
canvas.drawBitmap(textView.getDrawingCache(), 50, 200, null); 
    //text box top left position 50,50 
+0

Me ayudó mucho. –

Cuestiones relacionadas