1

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

调用 TextView.setText()and后TextView.invalidate()TextView并没有像我预期的那样更新。它仍然在Canvas.

@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()方法?

4

3 回答 3

1

我找到了解决方案...(可能是解决方案)

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

tv.layout(0, 0, screenWidth, screenHeight);

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

于 2012-07-05T07:49:14.260 回答
0

无效意味着它只是一种刷新。一旦您尝试使用离开并带到前面,它应该可以工作。例如:

// Try this ...
tv.setVisibility(View.GONE);
tv.bringToFront();
tv.setVisibility(View.VISIBLE);
于 2012-07-03T08:47:15.607 回答
0

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

于 2012-07-03T09:06:49.853 回答