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);

    }

OnTouch事件:

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

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

        return true;
    }

没有 LogCat 错误问题出在 myView 中。当我创建位图 bitmap = 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

您需要添加这样的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 回答
0

看起来你正在回收Bitmap代码中的某个地方。这儿存在一个问题。

是的,你应该recycle这样做,但它总是有点冒险。

编辑

看起来你正在绘制Bitmap. 如果这不是您想要做的,那么您不应该onDraw手动调用。而是invalidate()在您想重绘视图时调用。

于 2012-08-30T06:52:08.907 回答