1

描画可能な XML を使用して描画できないカスタム背景を持つカスタム EditText を使用しようとしています。

ここに私が今持っているものがあります

public class EMEditText extends EditText {
    private Bitmap framedBitmap;

    public EMEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
    }

    @Override
    protected void onDraw(Canvas canvas) {
        if(framedBitmap == null) {
            createDrawable(getWidth(), getHeight());
        }

        Paint paint = new Paint();
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
        // canvas.drawBitmap(framedBitmap, 0, 0, paint);
    }

    private void createDrawable(int width, int height) {
        // create a new bitmap of given size
        Bitmap start = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(start);

        RectF outerRect = new RectF(0, 0, width, height);

        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        paint.setColor(Color.WHITE);
        // paint.setStrokeWidth(1);
        // paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT));
        canvas.drawRoundRect(outerRect, height / 2, height / 2, paint);
        framedBitmap = start;
    }
}
4

1 に答える 1

2

コードでおそらく間違っているのは、メソッドで独自のオブジェクトを作成しているということですが、Canvasメソッドは図面に使用する必要がある権利を与えます。createDrawable()onDraw()Canvas

したがって、おそらく必要なのは、createDrawable(int width, int height)メソッドをに変更することcreateDrawable(int width, int height, Canvas c)です。コードは次のようになります。

@Override
protected void onDraw(Canvas canvas) {
    if(framedBitmap == null) {
        createDrawable(getWidth(), getHeight(), canvas);
    }

    Paint paint = new Paint();
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
    // canvas.drawBitmap(framedBitmap, 0, 0, paint);
}

private void createDrawable(int width, int height, Canvas c) {
    // create a new bitmap of given size
    Bitmap start = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    c.setBitmap(start);

    RectF outerRect = new RectF(0, 0, width, height);

    Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
    paint.setColor(Color.WHITE);
    // paint.setStrokeWidth(1);
    // paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT));
    c.drawRoundRect(outerRect, height / 2, height / 2, paint);
    framedBitmap = start;
}

ご覧のとおり、createDrawable()メソッドの本体も変更してCanvas、 fromを使用し、作成したものonDraw()に設定Bitmapします。

于 2013-01-22T10:45:25.420 に答える