实现分析:
依然是用到Paint的图层混合模式,
1、画一个你想要的形状 || 图片
2、修改Paint的图层混合模式,画图片。
3、然后就能得到你想要的形状的ImageView
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));设置模式
这2种模式都可以很简单的实现
SRC_IN:在两者相交的地方绘制源图像,并且绘制的效果会受到目标图像透明度的影响;
DST_IN :在两者相交的地方绘制目标图像,并且绘制的效果会受到源图像透明度的影响;
主要代码:
package com.example.roundimageview;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff.Mode;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.widget.ImageView;
/*
* 圆形ImageView的实现
* 1,先画一个圆
* 2.修改Paint的图层混合模式
* 3.最后在画Bitmap
*/
public class MyImageView extends ImageView {
public MyImageView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
//得到Drawable对象
Drawable drawable = getDrawable();
if (drawable == null) {
return;
}
if (getWidth() == 0 || getHeight() == 0) {
return;
}
// 得到图片
Bitmap b = ((BitmapDrawable) drawable).getBitmap();
if (b == null) {
return;
}
Bitmap bitmap = b.copy(Bitmap.Config.ARGB_8888, true);
int w = getWidth(), h = getHeight();
int diameter = w >= h ? h : w;
Bitmap roundBitmap = getCroppedBitmap(bitmap, diameter);
canvas.drawBitmap(roundBitmap, 0, 0, null);
}
/*
* 获取圆形图片 1.需要图片 2.图片宽高
*/
private Bitmap getCroppedBitmap(Bitmap bmp, int radius) {
Bitmap sbmp;
if (bmp.getWidth() != radius || bmp.getHeight() != radius)
sbmp = Bitmap.createScaledBitmap(bmp, radius, radius, false);
else
sbmp = bmp;
Bitmap output = Bitmap.createBitmap(sbmp.getWidth(), sbmp.getHeight(),
Config.ARGB_8888);
Canvas canvas = new Canvas(output);
final int color = 0xffa19774;
final Paint paint = new Paint();
final Rect rect = new Rect(0, 0, sbmp.getWidth(), sbmp.getHeight());
// 设置为true,则图像在动画进行中会滤掉对Bitmap图像的优化操作
// paint.setFilterBitmap(true);
// paint.setDither(true);
canvas.drawARGB(0, 0, 0, 0);
paint.setAntiAlias(true);
paint.setColor(Color.WHITE);
// 绘制目标图层
canvas.drawCircle(sbmp.getWidth() / 2, sbmp.getHeight() / 2,
sbmp.getWidth() / 2 - 6f, paint);
// 设置混合模式:在两者相交的地方绘制源图像
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
// 绘制源图层
canvas.drawBitmap(sbmp, rect, rect, paint);
// 绘制边框
drawCircleBorder(canvas, sbmp.getWidth() / 2 - 6f, color,
sbmp.getWidth() / 2, sbmp.getHeight() / 2);
return output;
}
// 外圆
private void drawCircleBorder(Canvas canvas, float radius, int color,
float defaultWidth, float defaultHeight) {
Paint paint = new Paint();
// 去锯齿
paint.setAntiAlias(true);
// 外圆颜色
paint.setColor(Color.BLACK);
// 设置paint的 style 为STROKE:空心
paint.setStyle(Paint.Style.STROKE);
// 设置paint的宽度
paint.setStrokeWidth(6.0f);
canvas.drawCircle(defaultWidth, defaultHeight, radius, paint);
}
}