縮小一個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的值。
新聞熱點
疑難解答