问题上的布局图的位图

问题描述:

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

其中i创建(可变的?)位图查看:

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而不是w,h(屏幕的宽度和高度)一个小数字例如:bitmap = bm.createBitmap(20,20,Config.ARGB_8888);它创建了一个小图片。但是如果我把w和h放在一起,那么就不是画出所有的布局,而只是画出一小部分。 (即使我尝试:bitmap = bm.createBitmap(800,1080,Config.ARGB_8888);它仍然占用一小部分,而不是所有的屏幕,我应该怎么做?

这解决了这个问题:

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

    } 

看起来像是回收您Bitmap somwhere中的代码。有个问题。

是的,你应该recycle它,但它始终是一个有点冒险。

编辑

看起来你正在绘制到Bitmap。如果这不是你想要做的,那么你不应该打电话给onDraw手动。如果您想重新绘制视图,请拨打invalidate()

+0

好吧,我设法逃脱的错误,但是我的位图不会出现在布局,我编辑了代码 –

+0

@rosualin我编辑了我的答案 –

+0

但是我不手动调用onDraw,但是我明白了你的观点,我忘记了调用invalidate。叫它,但仍然没有运气,我做对了吗? (代码编辑(再次)) –

您需要添加这样一个Options数据:

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

mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.smoke, options); 
+0

它必须是Api 8(2.2)。而我设法让它变化,没有错误,但它仍然没有显示我的布局图片 –

+0

@rosualin然后问题是你的布局。试着画一个蓝色,让它在屏幕上看到,然后你就可以看到图像了。也玩路径和油漆 –

+0

我有一个图片的布局。和一个空的布局(孩子)所以我尝试在第二个布局显示另一张图片。所以在未来,当我点击某处时,应用程序将删除该图片点击的部分。这是我的想法,但如果你知道如何以更简单或优雅的方式来做到这一点,请帮助 –