1

私の目的は、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()メソッドをオーバーライドする必要があるということですか?

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 に答える