缩小一个drawable在网上很容易找到答案,不过变大一个drawable就不是那么好找的了。
public static Bitmap createBitmap(Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter) { checkXYSign(x, y); checkWidthHeight(width, height); if (x + width > source.getWidth()) { throw new IllegalArgumentException("x + width must be <= bitmap.width()"); } if (y + height > source.getHeight()) { throw new IllegalArgumentException("y + height must be <= bitmap.height()"); } // check if we can just return our argument unchanged if (!source.isMutable() && x == 0 && y == 0 && width == source.getWidth() && height == source.getHeight() && (m == null || m.isIdentity())) { return source; } int neww = width; int newh = height; Canvas canvas = new Canvas(); Bitmap bitmap; Paint paint; Rect srcR = new Rect(x, y, x + width, y + height); RectF dstR = new RectF(0, 0, width, height); Config newConfig = Config.ARGB_8888; final Config config = source.getConfig(); // GIF files generate null configs, assume ARGB_8888 if (config != null) { switch (config) { case RGB_565: newConfig = Config.RGB_565; break; case ALPHA_8: newConfig = Config.ALPHA_8; break; //noinspection dePRecation case ARGB_4444: case ARGB_8888: default: newConfig = Config.ARGB_8888; break; } } if (m == null || m.isIdentity()) { bitmap = createBitmap(neww, newh, newConfig, source.hasAlpha()); paint = null; // not needed } else { final boolean transformed = !m.rectStaysRect(); RectF deviceR = new RectF(); m.mapRect(deviceR, dstR); neww = Math.round(deviceR.width()); newh = Math.round(deviceR.height()); bitmap = createBitmap(neww, newh, transformed ? Config.ARGB_8888 : newConfig, transformed || source.hasAlpha()); canvas.translate(-deviceR.left, -deviceR.top); canvas.concat(m); paint = new Paint(); paint.setFilterBitmap(filter); if (transformed) { paint.setAntiAlias(true); } } // The new bitmap was created from a known bitmap source so assume that // they use the same density bitmap.mDensity = source.mDensity; bitmap.setHasAlpha(source.hasAlpha()); bitmap.setPremultiplied(source.mRequestPremultiplied); canvas.setBitmap(bitmap); canvas.drawBitmap(source, srcR, dstR, paint); canvas.setBitmap(null); return bitmap; }这个方法很容易看出,无法创建比原图片大的图片,可以缩小,但是无法放大。if (x + width > source.getWidth()) { throw new IllegalArgumentException("x + width must be <= bitmap.width()"); } if (y + height > source.getHeight()) { throw new IllegalArgumentException("y + height must be <= bitmap.height()"); }换思路:利用canvas
大体看了一下Bitmap的诸多方法,貌似都不行,那就试着用canvas重新画一个bitmap了,直接上代码public static Drawable createDrawable(Context context, int width, int height, Drawable drawable) { if (drawable == null || width <= 0 || height <= 0) { return null; }Bitmap newBitmap = null;try {newBitmap = Bitmap.createBitmap(width, height, config); } catch (OutOfMemoryError e) { e.printStackTrace(); }if (newBitmap == null) {return null;}Canvas canvas = new Canvas(); canvas.setBitmap(newBitmap); drawable.setBounds(new Rect(0, 0, width, height)); drawable.draw(canvas); return new BitmapDrawable(context.getResources(), newBitmap); }width和height就是需要的宽和高,当然,如果放大的话,事先算好了就可以。代码很简单,不过最后转出来的drawable变成了bitmapdrawable。注意最后的地方:new BitmapDrawable的时候,一定要传resource,否则会使用DisplayMetrics.DENSITY_DEFAULT的值。
新闻热点
疑难解答