[转载]Android缩放drawable

  (2012-04-10 16:51:57)
标签: 

转载

分类: 技术
原文地址:Android缩放drawable 作者:雨点点

一、  相关概念

1.        Drawable就是一个可画的对象,其可能是一张位图(BitmapDrawable),也可能是一个图形(ShapeDrawable),还有可能是一个图层(LayerDrawable),我们根据画图的需求,创建相应的可画对象

2.        Canvas画布,绘制的目的区域,用于绘图

3.        Bitmap位图,用于图的处理

4.        Matrix矩阵,此例中用于操作图片

二、  步骤

1.        drawable画到位图对象上

2.        对位图对象做缩放(或旋转等)操作

3.        把位图再转换成drawable

三、示例
         static Bitmap drawableToBitmap(Drawable drawable)// drawable 转换成bitmap
         {
                   int width = drawable.getIntrinsicWidth();  
 //
 drawable的长宽
                   int height = drawable.getIntrinsicHeight();
                 Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888:Bitmap.Config.RGB_565;        
 // drawable的颜色格式
                   Bitmap bitmap = Bitmap.createBitmap(width, height, config);    
 // 建立对应bitmap
                   Canvas canvas = new Canvas(bitmap);        
 //
 建立对应bitmap的画布
                   drawable.setBounds(0, 0, width, height);
                   drawable.draw(canvas);     
 // drawable内容画到画布中
                   return bitmap;
         }

         static Drawable zoomDrawable(Drawable drawable, int w, int h)
         {
                   int width = drawable.getIntrinsicWidth();
                   int height= drawable.getIntrinsicHeight();
                   Bitmap oldbmp = drawableToBitmap(drawable);
// drawable转换成bitmap
                   Matrix matrix = new Matrix();  
 //
 创建操作图片用的Matrix对象
                   float scaleWidth = ((float)w / width);  
 // 计算缩放比例
                   float scaleHeight = ((float)h / height);
                   matrix.postScale(scaleWidth, scaleHeight);        
 // 设置缩放比例
                   Bitmap newbmp = Bitmap.createBitmap(oldbmp, 0, 0, width, height, matrix, true);      
 // 建立新的bitmap,其内容是对原bitmap的缩放后的图
                   return new BitmapDrawable(newbmp);      
 // bitmap转换成drawable并返回
         }
}

四、其它

import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Bitmap.Config;
import android.graphics.PorterDuff.Mode;
import android.graphics.drawable.Drawable;

public class FunctionUtil {

 
 public static Bitmap imageScale(Bitmap bitmap, int dst_w, int dst_h){
  
  int  src_w = bitmap.getWidth();
  int  src_h = bitmap.getHeight();
  float scale_w = ((float)dst_w)/src_w;
  float  scale_h = ((float)dst_h)/src_h;
  Matrix  matrix = new Matrix();
  matrix.postScale(scale_w, scale_h);
  Bitmap dstbmp = Bitmap.createBitmap(bitmap, 0, 0, src_w, src_h, matrix, true);
  
  return dstbmp;
 }

或者使用Bitmap.createScaledBitmap(bitmap, width, heigth, true);方法,

需要指定缩放后的图片大小尺寸。

 
 
 public static Bitmap drawabletoBitmap(Drawable drawable){
  
  int width = drawable.getIntrinsicWidth();
  int height = drawable.getIntrinsicWidth();
  
  Bitmap bitmap = Bitmap.createBitmap(width, height, drawable.getOpacity() != PixelFormat.OPAQUE ?
     Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565);
  Canvas canvas = new Canvas(bitmap);
  drawable.setBounds(0, 0, width, height);
  
  drawable.draw(canvas);
  
  return bitmap;
 }
 
 
 public static Bitmap getRCB(Bitmap bitmap, float roundPX) //RCB means Rounded Corner Bitmap
 {
  Bitmap dstbmp = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888);
  Canvas canvas = new Canvas(dstbmp);
  
  final int color = 0xff424242;
  final Paint paint = new Paint();
  final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
  final RectF rectF = new RectF(rect);
  paint.setAntiAlias(true);
  canvas.drawARGB(0, 0, 0, 0);
  paint.setColor(color);
  canvas.drawRoundRect(rectF, roundPX, roundPX, paint);
  paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
  canvas.drawBitmap(bitmap, rect, rect, paint);

  return dstbmp;
 }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值