2011-09-04 70 views
9

根据主题“将TextView截屏到位图”中找到许多帖子。如何将TextView绘制到位图中(无需在显示屏上绘制)

好吧,与我的问题不同的是,首先在显示器上绘制视图(所有布局和测量工作已完成),然后绘制到连接到位图的Canvas中。

我只是想从头开始创建一个TextView,而不会显示在呈现为位图的显示器上。

这一个是已经在工作的基础配置。点击TextView将自己绘制成一个位图并将其设置为一个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); 
     } 
    }); 
} 

现在出现问题的部分。我将在Java中创建一个TextView,并且我希望这个被直接绘制成一个Bitmap。在此之后,我将把它设置为ImageView。我从来没有得到这个运行:(

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

这并不既不的onCreate也不在一个OnClickListener工作。与setDrawingCacheEnabled(),测量()和requestLayout()进行实验也不能工作。

回答

19

以下是如何将TextView绘制到属于视图的画布或从位图派生的两种方法:

//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

帮了我很多。 –