2

EditText を拡張するカスタム ビューに次のコードがあります。

protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

                int count = getLineCount();
                Canvas cvs= new Canvas();
                Drawable dr = this.getBackground();
                Rect r = mRect;
                Paint paint = mPaint;
                mTextPaint.setTextSize(this.getTextSize());
                Paint PaintText = mTextPaint;

                for (int i = 0; i < count; i++) {
                    int baseline = getLineBounds(i, r);
                    cvs.drawText(Integer.toString(i+1), r.left, baseline + 1, PaintText);
                    cvs.drawLine(r.left, baseline + 1, r.right, baseline + 1, paint); 
                }
                cvs.drawLine(PaintText.measureText(Integer.toString(count)), this.getTop(), PaintText.measureText(Integer.toString(count)), this.getBottom(), paint);
                dr.setBounds(0, 0, this.getRight(), this.getBottom());
                dr.draw(cvs);
                this.setBackgroundDrawable(dr);
            }

このビューの背景に何もな​​いのはなぜですか?

4

3 に答える 3

5
protected void onDraw(Canvas canvas) {
    Bitmap bitmap = Bitmap.createBitmap(this.getWidth(), this.getHeight(), Bitmap.Config.ARGB_8888);
    int count = getLineCount();
    Canvas cvs= new Canvas(bitmap);
    cvs.drawColor(Color.rgb(245, 245, 245));
    Rect r = mRect;
    Paint paint = mPaint;
    mTextPaint.setTextSize(this.getTextSize());
    Paint PaintText = mTextPaint;

    for (int i = 0; i < count; i++) {
        int baseline = getLineBounds(i, r);
        cvs.drawText(Integer.toString(i+1), 2, baseline + 1, PaintText);
        cvs.drawLine(2, baseline + 1, r.right, baseline + 1, paint); 
    }

    cvs.drawLine(PaintText.measureText(Integer.toString(count))+3, this.getTop(), PaintText.measureText(Integer.toString(count))+3, this.getBottom(), paint);

    this.setBackgroundDrawable(new BitmapDrawable(getContext().getResources(), bitmap));
    this.setPadding((int) (PaintText.measureText(Integer.toString(count))+7),3,3,3); 
    super.onDraw(canvas);
}
于 2011-03-27T08:17:36.317 に答える
3

もっと簡単にできることをしようとしていると思います。ただし、次の理由でコードが機能しません。

  1. オブジェクトに aBitmapを設定しません。Canvas
  2. Canvasのコンテンツをに移動したいと思いますDrawableが、実際にはコードは反対のアクションを実行します。実際にはDrawableCanvasオブジェクトに を描画します。これを試して:
    ビットマップ bitmap = Bitmap.createBitmap(this.getWidth(), this.getHeight(),
        Bitmap.Config.ARGB_8888);
    Canvas cvs = new Canvas(ビットマップ);
    // dr.setBounds() と dr.draw() のない描画要素
    this.setBackgroundDrawable(
        new BitmapDrawable(getContext().getResources(), ビットマップ));
于 2011-03-26T20:54:31.607 に答える
1

新しい Canvas オブジェクトを作成する必要はありません。onDraw が作成し、独自のビットマップに設定します。パラメーターで指定されたキャンバスの名前 (この場合は canvas) を使用するだけです。

onDraw は、ビューが作成されるか、invalidate() が呼び出されるたびに呼び出されます。onDraw() メソッドでは、新しいキャンバス オブジェクトを作成しています。このコードをグラフィカルに激しいもの (ゲームなど) に使用している場合は、メモリ リークが発生しています。ビューを 1 回しか描画しない場合でも、これは最良の方法ではありません。onDraw() パラメータで提供されるキャンバスを使用します。

于 2011-03-28T04:53:43.690 に答える