【问题标题】:How to draw a TextView into a Bitmap (without ever being drawn on the display)如何将 TextView 绘制到位图中(无需在显示器上绘制)
【发布时间】:2011-11-10 00:49:31
【问题描述】:

很多帖子都是根据“将TextView截图成Bitmap”这个主题找到的。

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

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

这是已经在工作的基础配置。单击 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 中创建一个 TextView,我希望将其直接绘制到位图中。在此之后,我将其设置为 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() 也不起作用。

【问题讨论】:

    标签: android canvas bitmap textview


    【解决方案1】:

    这里有两种方法如何将 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
    

    【讨论】:

    • textView.setDrawingCacheEnabled(true) 自 API 28 起已弃用。现在首选的方法是将视图绘制到画布上,就像任何其他类型的视图一样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    • 2014-04-11
    • 1970-01-01
    相关资源
    最近更新 更多