获取圆角位图的方法主要的原理是,先画一个圆角矩形,然后设置画笔Porter-Duff规则的Mode.SRC_IN来控制Paint与已有的Canvas图像进行交互,即取两层绘制交集。显示上层。
运行效果图如下:
主要代码如下:
packagecom.example.roundedcornerbitmap;
importandroid.os.Bundle;
importandroid.app.Activity;
importandroid.graphics.Bitmap;
importandroid.graphics.Bitmap.Config;
importandroid.graphics.Canvas;
importandroid.graphics.Paint;
importandroid.graphics.PorterDuff.Mode;
importandroid.graphics.PorterDuffXfermode;
importandroid.graphics.Rect;
importandroid.graphics.RectF;
import android.graphics.drawable.BitmapDrawable;
importandroid.graphics.drawable.Drawable;
importandroid.view.Menu;
importandroid.widget.ImageView;
public classMainActivity extends Activity
{
ImageView originalImage;//原图
ImageView roundedCornerImage;//变成圆角显示后的图
@Override
protected void onCreate(BundlesavedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
originalImage=(ImageView)findViewById(R.id.originalImage);
roundedCornerImage=(ImageView) findViewById(R.id.RoundedCornerImage);
originalImage.setImageResource(R.drawable.me);//设置原图
Drawable drawable =getResources().getDrawable(R.drawable.me); //得到drawable图片
Bitmapbitmap=drawableToBitmap(drawable); //将drawable转换成bitmap
roundedCornerImage.setImageBitmap(toRoundCorner(bitmap,10));//将bitmap处理后设置到imageView
}
@Override
public boolean onCreateOptionsMenu(Menumenu)
{
getMenuInflater().inflate(R.menu.main,menu);
return true;
}
/**
* 获取圆角位图的方法 主要的原理是,先画一个圆角矩形,然后设置画笔Porter-Duff规则的Mode.SRC_IN来控制Paint与已有的Canvas图像进行交互
* 即取两层绘制交集。显示上层。
* @param bitmap 需要转化成圆角的位图
* @param roundPx 圆角的度数,数值越大,圆角越大
* @return 处理后的圆角位图
*/
public Bitmap toRoundCorner(Bitmap bitmap, float roundPx)
{
// 新建一个新的输出图片
Bitmap output =Bitmap.createBitmap(bitmap.getWidth(),
bitmap.getHeight(),Config.ARGB_8888);
//得到画布
Canvas canvas = newCanvas(output);
//得到与图像相同大小的区域 由构造的四个值决定区域的位置以及大小
Rect rect = new Rect(0, 0,bitmap.getWidth(), bitmap.getHeight());
RectF rectF = new RectF(rect); // 新建一个矩形
int color = 0xff424242; //这个颜色可以随便取
//初始化画笔
Paint paint = new Paint();
paint.setAntiAlias(true); //设置抗锯齿
canvas.drawARGB(0, 0, 0, 0); //绘制透明色,便于后面取圆角矩形和bitmap的交集
paint.setColor(color);
//drawRoundRect的第2,3个参数分别为x方向上的圆角半径,和y方向上的圆角半径。
//画一个圆角矩形
canvas.drawRoundRect(rectF, roundPx,roundPx, paint);
//PorterDuff.Mode.SRC_IN 取两层绘制交集。显示上层。
paint.setXfermode(newPorterDuffXfermode(Mode.SRC_IN));
//取圆角矩形和bitmap的交集显示bitmap
canvas.drawBitmap(bitmap, rect, rect,paint);
return output; //返回处理后的bitmap
}
/**
* @param drawable 需要转换的Drawable
* @return 转变后的Bitmap
*/
public Bitmap drawableToBitmap(Drawabledrawable)
{
BitmapDrawable bitmapDrawable =(BitmapDrawable) drawable;
Bitmap bitmap =bitmapDrawable.getBitmap();
return bitmap;
}
}