调用setText()和invalidate()后,TextView无法在Canvas上正确绘制

时间:2012-07-03 08:14:14

标签: android bitmap android-canvas textview android-view

我的目的是制作一张显示用户提供的文字的Bitmap图片,以后可以将图片保存到缓存中。

致电TextView.setText()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()方法?

3 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:0)

无效意味着它只是一种刷新的东西。一旦你尝试离开并带到前面它应该工作。例如:

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

答案 2 :(得分:0)

我认为应该更新,你甚至不需要拨打invalidate()。也许在您的代码中的某些其他位置存在问题。您的onClick功能似乎对我而言。