0

onCreateでプログラムでレイアウトを作成します。

new Handler().postDelayed(new Runnable() {

        @Override
        public void run() {
            myView = new MyView(SketchActivity.this, layout.getWidth(), layout.getHeight());

            layout2.addView(myView);
            layout2.bringToFront();

        }
    }, 50);

(可変?)ビットマップを作成するビュー:

public MyView(Context c, int width, int height) {
        super(c);

        WindowManager wm = (WindowManager) c.getSystemService(Context.WINDOW_SERVICE);
        Display display = wm.getDefaultDisplay();
        int w = display.getWidth(); // deprecated
        int h = display.getHeight();
        setFocusable(true);
        setBackgroundResource(R.drawable.download);

        // setting paint
        mPaint = new Paint();
        mPaint.setAlpha(0);
        mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
        mPaint.setAntiAlias(true);

        // getting image from resources
        Resources r = this.getContext().getResources();

        Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.smoke);

        // converting image bitmap into mutable bitmap

        bitmap = bm.createBitmap(w, h, Config.ARGB_8888);
        mCanvas = new Canvas();
        mCanvas.setBitmap(bitmap); // drawXY will result on that Bitmap
        mCanvas.drawBitmap(bm, 0, 0, null);

    }

私のonDraw関数:

 @Override
    protected void onDraw(Canvas canvas) {
        mCanvas.drawCircle(x, y, r, mPaint);

        canvas.drawBitmap(bitmap, 0, 0, null);

        super.onDraw(canvas);

    }

OnTouchEvent:

@Override
    public boolean onTouchEvent(MotionEvent event) {
        x = (int) event.getX();
        y = (int) event.getY();

        r = 20;
        // Atlast invalidate canvas
        invalidate();

        return true;
    }

LogCatエラーなし問題はmyViewにあります。ビットマップビットマップを作成するとき=bm.createBitmap(w、h、Config.ARGB_8888); w、h(画面の幅と高さ)の代わりに小さな数値を入力した場合例:bitmap = bm.createBitmap(20、20、Config.ARGB_8888); それは小さな絵を作ります。しかし、wとhを入力すると、すべてのレイアウトに描画するのではなく、小さな部分にしか描画しません。(試してみても:bitmap = bm.createBitmap(800、1080、Config.ARGB_8888);画面全体ではなく、小さな部分に描画されます。どうすればよいですか?

4

3 に答える 3

1

これはそれを解決しました:

public Bitmap getResizedBitmap(Bitmap bm, int newHeight, int newWidth) {
    int width = bm.getWidth();
    int height = bm.getHeight();
    float scaleWidth = ((float) newWidth) / width;
    float scaleHeight = ((float) newHeight) / height;
    // CREATE A MATRIX FOR THE MANIPULATION
    Matrix matrix = new Matrix();
    // RESIZE THE BIT MAP
    matrix.postScale(scaleWidth, scaleHeight);
    // RECREATE THE NEW BITMAP
    Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, false);
    return resizedBitmap;
}

public MyView(Context c, int width, int height) {
        super(c);

        WindowManager wm = (WindowManager) c.getSystemService(Context.WINDOW_SERVICE);
        Display display = wm.getDefaultDisplay();
        int w = display.getWidth(); // deprecated
        int h = display.getHeight();
        setFocusable(true);
        setBackgroundResource(R.drawable.download);

        // setting paint
        mPaint = new Paint();
        mPaint.setAlpha(0);
        mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
        mPaint.setAntiAlias(true);
        mPaint.setMaskFilter(new BlurMaskFilter(8, BlurMaskFilter.Blur.NORMAL));

        // getting image from resources
        Resources r = this.getContext().getResources();

        Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.smoke);
        Bitmap bm2 = getResizedBitmap(bm, h, w);

        // converting image bitmap into mutable bitmap

        bitmap = bm2.createBitmap(w, h, Config.ARGB_8888);
        mCanvas = new Canvas();
        mCanvas.setBitmap(bitmap); // drawXY will result on that Bitmap
        mCanvas.drawBitmap(bm2, 0, 0, null);

    }
于 2012-08-30T08:59:17.250 に答える
0

Bitmapコード内のどこかでリサイクルしているようです。問題がある。

はい、そうすべきですがrecycle、それは常に少し危険です。

編集

に描画しているように見えますBitmap。それがあなたがやろうとしていることではない場合は、onDraw手動で呼び出すべきではありません。代わりinvalidate()に、ビューを再描画するときに呼び出します。

于 2012-08-30T06:52:08.907 に答える
0

Options次のようなデータを追加する必要があります。

Options options = new Options();
options.isMutable = true; // works from api 11

mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.smoke, options);
于 2012-08-30T07:18:26.027 に答える