问题上的布局图的位图
我的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()
。
您需要添加这样一个Options
数据:
Options options = new Options();
options.isMutable = true; // works from api 11
mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.smoke, options);
它必须是Api 8(2.2)。而我设法让它变化,没有错误,但它仍然没有显示我的布局图片 –
@rosualin然后问题是你的布局。试着画一个蓝色,让它在屏幕上看到,然后你就可以看到图像了。也玩路径和油漆 –
我有一个图片的布局。和一个空的布局(孩子)所以我尝试在第二个布局显示另一张图片。所以在未来,当我点击某处时,应用程序将删除该图片点击的部分。这是我的想法,但如果你知道如何以更简单或优雅的方式来做到这一点,请帮助 –
好吧,我设法逃脱的错误,但是我的位图不会出现在布局,我编辑了代码 –
@rosualin我编辑了我的答案 –
但是我不手动调用onDraw,但是我明白了你的观点,我忘记了调用invalidate。叫它,但仍然没有运气,我做对了吗? (代码编辑(再次)) –