我的目的是制作一张显示用户提供的文字的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()
方法?
答案 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
功能似乎对我而言。