如何绘制一个TextView到一个位图(没有在绘图中显示)

根据“将TextView截图到位图”主题find许多post。

那么,我的问题的区别是,首先在显示器上绘制视图(所有布局和测量工作已经完成),然后绘制到连接到位图的canvas上。

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

这一个是已经在工作的基础configuration。 点击TextView将自己绘制成一个Bitmap并将其设置为一个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中创build一个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(),measure()和requestLayout()做实验也没有效果。

Solutions Collecting From Web of "如何绘制一个TextView到一个位图(没有在绘图中显示)"

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

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