Android 文本视图可以';调用setText()和invalidate()后,无法在画布上正确绘制

Android 文本视图可以';调用setText()和invalidate()后,无法在画布上正确绘制,android,bitmap,android-canvas,textview,android-view,Android,Bitmap,Android Canvas,Textview,Android View,我的目的是制作一个位图图像,显示用户提供的文本,然后图像可以保存到缓存中 调用TextView.setText()和TextView.invalidate()后,TextView没有按照我的预期进行更新。它仍然在画布上绘制以前的文本 @Override public void onClick(View v) { // tv is a TextView and et is an EditText. tv.setText(et.getText().toString()); t

我的目的是制作一个
位图
图像,显示用户提供的文本,然后图像可以保存到缓存中

调用
TextView.setText()
TextView.invalidate()
后,
TextView
没有按照我的预期进行更新。它仍然在
画布上绘制以前的文本

@Override
public void onClick(View v) {
    // tv is a TextView and et is an EditText.
    tv.setText(et.getText().toString());
    tv.invalidate();
    // if measure() isn't called, getMeasuredWidth() returns previous value.tv.measure(0, 0);

    int screenWidth = (int) tv.getMeasuredWidth();
    int screenHeight = (int) tv.getMeasuredHeight();

    if (screenHeight * screenWidth != 0) {
        LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
                                                    screenWidth, screenHeight);
        Bitmap testB;

        testB = Bitmap.createBitmap(screenWidth, screenHeight, Bitmap.Config.ARGB_8888);
        Canvas c = new Canvas(testB);

        tv.draw(c);
        // tv draws previous String on Canvas c.

        iv = (ImageView) findViewById(R.id.image);
        iv.setLayoutParams(layoutParams);
        iv.setBackgroundColor(Color.RED);
        iv.setImageBitmap(testB);
    }
}
文件说

public void invalidate()

使整个观点无效。如果视图可见,
onDraw(android.graphics.Canvas)
将在 未来。这必须从UI线程调用。从非UI调用 线程,调用
postInvalidate()


这是否意味着我应该重写
onDraw()
方法?

无效意味着这只是一种刷新。一旦你尝试使用gone并将其带到前台,它就会起作用。例如:

// Try this ...
tv.setVisibility(View.GONE);
tv.bringToFront();
tv.setVisibility(View.VISIBLE);

无效意味着它只是一种更新。一旦你尝试使用gone并将其带到前台,它就会起作用。例如:

// Try this ...
tv.setVisibility(View.GONE);
tv.bringToFront();
tv.setVisibility(View.VISIBLE);

我认为应该更新它,您甚至不需要调用
invalidate()
。也许代码中的其他地方有问题。您的
onClick
函数对我来说似乎是正确的。

我认为它应该更新,您甚至不需要调用
invalidate()
。也许代码中的其他地方有问题。您的
onClick
功能对我来说似乎很正确。

我找到了解决方案。。。(可能是一个解决方案)

在调用draw()之前需要添加此行:

我认为宽度和高度尚未更新,因为getWidth()返回以前的值。

我找到了解决方案。。。(可能是一个解决方案)

在调用draw()之前需要添加此行:

我认为宽度和高度还没有更新,因为getWidth()返回以前的值