CircleImageView-方式2

简介: 写一个圆形的ImageView 之前有一个通过paint.setXfermode方式去实现的,今天写一个更好地实现方式,国际惯例先看效果。先看原图搜狗截图20160730020147.

写一个圆形的ImageView 之前有一个通过paint.setXfermode方式去实现的,今天写一个更好地实现方式,国际惯例先看效果。

  • 先看原图
搜狗截图20160730020147.png

CropType.leftTop

004.png

CropType.centerTop

002.png

CropType.center

003.png

最后看代码 其实很简单,有错误请指出,谢谢

<pre>
package github.alex.circleimageview;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Shader;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.widget.ImageView;

/**
* 作者:alex
* 时间:2016/7/29 13:48
* 博客地址:http://www.jianshu.com/users/c3c4ea133871/subscriptions
*/
public class CircleImageView extends ImageView {
/**
* 绘图的Paint
*/
private Paint paint;
/**
* 圆角的半径
*/
private int radius;
/**
* 3x3 矩阵,主要用于缩小放大
*/
private Matrix matrix;
/**
* 渲染图像,使用图像为绘制图形着色
*/
private BitmapShader bitmapShader;
/**
* view的宽度
*/
private int width;

private String cropType;

public CircleImageView(Context context) {
    super(context);
    initView();
}

public CircleImageView(Context context, AttributeSet attrs) {
    super(context, attrs);
    initView();
}

/\*\*
 \* 初始化 视图
 \*/
private void initView() {
    matrix = new Matrix();
    paint = new Paint();
    paint.setAntiAlias(true);
    radius = (int) dp2Px(10);
    cropType = CropType.centerTop;
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    width = Math.min(getMeasuredWidth(), getMeasuredHeight());
    radius = width / 2;
    setMeasuredDimension(width, width);
}

@Override
protected void onDraw(Canvas canvas) {
    // super.onDraw(canvas);
    if (getDrawable() == null) {
        return;
    }
    initBitmapShader();
    canvas.drawCircle(radius, radius, radius, paint);
}

/\*\*
 \* 初始化BitmapShader
 \*/
private void initBitmapShader() {
    Drawable drawable = getDrawable();
    if (drawable == null) {
        return;
    }

    Bitmap bmp = drawable2Bitmap(drawable);
    bitmapShader = new BitmapShader(bmp, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
    
    int bSize = Math.min(bmp.getWidth(), bmp.getHeight());
    float scale = width \* 1.0f / bSize;
    matrix.setScale(scale, scale);
    bitmapShader.setLocalMatrix(matrix);
    paint.setShader(bitmapShader);
}

/\*\*
 \* drawable转bitmap
 \*
 \* @param drawable
 \* @return
 \*/
private Bitmap drawable2Bitmap(Drawable drawable) {
    int w = drawable.getIntrinsicWidth();
    int h = drawable.getIntrinsicHeight();
    Bitmap bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    drawable.setBounds(0, 0, w, h);
    if ((w >= h) && CropType.centerTop.equals(cropType)) {
        canvas.translate((h - w) \* 0.5F, 0);
    } else if ((w >= h) && CropType.center.equals(cropType)) {
        canvas.translate((h - w) \* 0.5F, 0);
    } else if ((w < h) && CropType.center.equals(cropType)) {
        canvas.translate(0, (w - h) \* 0.5F);
    }
    drawable.draw(canvas);
    return bitmap;
}

public static final class CropType {
    public static final String leftTop = "起点在左上角";
    public static final String centerTop = "起点水平居中&垂直置顶";
    public static final String center = "起点在图片中心";
}

/\*\*
 \* 数据转换: dp---->px
 \*/
private float dp2Px(float dp) {
    return dp \* getContext().getResources().getDisplayMetrics().density;
}

}

</pre>

目录
相关文章
|
2月前
文件存取方式
顺序存取方式和随机存取方式: 顺序存取就是从上往下,一笔一笔读取文件的内容。写入数据时,将数据附加在文件的末尾。这种存取方式常用于文本文件。 随机存取方式多半以二进制文件为主。它会以一个完整的单位来进行数据的读取和写入,通常以结构为单位。
|
2月前
.文件存取方式
顺序存取方式和随机存取方式: 顺序存取就是从上往下,一笔一笔读取文件的内容。写入数据时,将数据附加在文件的末尾。这种存取方式常用于文本文件。 随机存取方式多半以二进制文件为主。它会以一个完整的单位来进行数据的读取和写入,通常以结构为单位。
|
3月前
|
JavaScript 前端开发 开发者
JS继承方式
【10月更文挑战第8天】
13 2
|
4月前
|
JavaScript 前端开发
JS继承简单的理解方式
文章通过代码示例详细解释了JavaScript中的多种继承方式,包括原型链继承、构造函数继承、组合继承、寄生组合继承和类继承,并讨论了它们的特点和适用场景。
15 0
|
8月前
|
存储 XML 文件存储
Android数据存储的五种方式1
Android数据存储的五种方式
147 2
|
8月前
|
存储 Android开发
Android数据存储的五种方式3
Android数据存储的五种方式
51 0
|
8月前
|
存储 SQL 数据库
Android数据存储的五种方式2
Android数据存储的五种方式
81 0
|
人工智能 自动驾驶 新能源
“以终为始”的正确使用方式
“以终为始”的正确使用方式
162 0