CircleImageView
package com.cainiao5.cainiaoheadimg; import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.drawable.BitmapDrawable;
import android.util.AttributeSet;
import android.widget.ImageView; /**
* Created by Administrator on 2016/2/21 0021.
*/
public class CircleImageView extends ImageView { // 设置外圈的宽度
private int outCircleWidth;
// 设置外圈的颜色
private int outCircleColor ; private int viewWidth;
private int viewHeight; private Bitmap image;
private Paint paintBorder;//背景画笔 public CircleImageView(Context context) {
super(context);
setup(context,null);
} public CircleImageView(Context context, AttributeSet attrs) {
super(context, attrs);
setup(context,attrs);
} public CircleImageView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
setup(context, attrs);
} private void setup(Context context,AttributeSet attrs) {
//2.获取属性
if (null != attrs){
TypedArray array = context.obtainStyledAttributes(attrs,R.styleable.CircleImageView); int len = array.getIndexCount();
for (int i = 0; i < len; i++) {
int attr = array.getIndex(i); switch (attr){
case R.styleable.CircleImageView_outCircleColor:
this.outCircleColor = array.getColor(R.styleable.CircleImageView_outCircleColor,Color.WHITE);
break;
case R.styleable.CircleImageView_outCircleWigth:
this.outCircleWidth = (int)array.getDimension(R.styleable.CircleImageView_outCircleWigth,5);
break;
default: break;
}
}
} //初始化背景画笔
paintBorder = new Paint();
//设置背景颜色
paintBorder.setColor(outCircleColor);
//抗锯齿
paintBorder.setAntiAlias(true);
}
//3.测量
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int width = measureWidth(widthMeasureSpec);
int height = measureHeight(heightMeasureSpec); viewWidth = width - (outCircleWidth * 2);
viewHeight = height -(outCircleWidth * 2); setMeasuredDimension(width,height); } private int measureHeight(int heightMeasureSpec) {
int result = 0;
int mode = MeasureSpec.getMode(heightMeasureSpec);
int size = MeasureSpec.getSize(heightMeasureSpec); if (mode == MeasureSpec.EXACTLY){
result = size;
}else {
result = viewHeight;
}
return result;
} private int measureWidth(int widthMeasureSpec) {
int result = 0;
int mode = MeasureSpec.getMode(widthMeasureSpec);
int size = MeasureSpec.getSize(widthMeasureSpec); if (mode == MeasureSpec.EXACTLY){
result = size;
}else {
result = viewWidth;
} return result;
} // 设置底图颜色
public void setBorderColor(int borderColor) {
if (paintBorder != null)
paintBorder.setColor(borderColor); this.invalidate();
} // 设置外圈的宽度
public void setBorderWidth(int outCircleWidth) {
this.outCircleWidth = outCircleWidth; this.invalidate();
} //4.测量 @Override
protected void onDraw(Canvas canvas) {
//加载图片
loadBitmap(); if (image != null){
int min = Math.min(viewWidth,viewHeight); int circleCenter = min/2; image = Bitmap.createScaledBitmap(image,min,min,false); canvas.drawCircle(circleCenter + outCircleWidth,circleCenter + outCircleWidth,circleCenter + outCircleWidth,paintBorder); canvas.drawBitmap(createCircleImage(image, min), outCircleWidth, outCircleWidth, null);
}
} private Bitmap createCircleImage(Bitmap source, int min) { Paint paint = new Paint();
paint.setAntiAlias(true);
Bitmap target = Bitmap.createBitmap(min, min, Bitmap.Config.ARGB_8888);
/**
* 产生一个同样大小的画布
*/
Canvas canvas = new Canvas(target);
/**
* 首先绘制圆形
*/
canvas.drawCircle(min / 2, min / 2, min / 2, paint);
/**
* 使用SRC_IN,参考上面的说明
*/
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
/**
* 绘制图片
*/
canvas.drawBitmap(source, 0, 0, paint);
return target; } private void loadBitmap() {
BitmapDrawable bitmapDrawable = (BitmapDrawable) this.getDrawable(); if (bitmapDrawable != null){
image = bitmapDrawable.getBitmap();
}
}
}
CircleImageView的更多相关文章
- 圆形图片CircleImageView
github源码路径: https://github.com/hdodenhof/CircleImageView 第一步:将CircleImageView复制 第二步:将attrs.xml复制 第三步 ...
- [原创]android开源项目源码解析(一)----CircleImageView的源码解析
CircleImageView的代码很简洁,因此先将此工程作为源码解析系列的第一篇文章. 解析说明都在代码里了. /* * Copyright 2014 - 2015 Henning Dodenhof ...
- 自定义控件--CircleImageView(类似于QQ、微信圆形头像自定义控件)
现在基本上所有的需要用户注册的APP都有一个需要用户上传头像的需求,上传的头像基本都是类似于QQ.微信等社交应用圆形头像.最近,正在做的一个社交应用多处需要用到这种圆形头像的处理,总不能每次都对图片做 ...
- Android Glide+CircleImageView实现加载圆形图片列表
需求:要在列表中实现圆形图片的显示,控件可能和加载库会存在冲突 先上代码,至于其中源码,以后有空再分析 MainActivity public class MainActivity extends A ...
- Android源码分析--CircleImageView 源码详解
源码地址为 https://github.com/hdodenhof/CircleImageView 实际上就是一个圆形的imageview 的自定义控件.代码写的很优雅,实现效果也很好, 特此分析. ...
- CircleImageView自定义圆形控件的使用
1.自定义圆形控件github地址: https://github.com/hdodenhof/CircleImageView 主要的类: package de.hdodenhof.circleima ...
- CircleImageView 圆形图片头像实现
package com.view.drop; import android.content.Context; import android.content.res.TypedArray; import ...
- android开源系列:CircleImageView采用圆形控制它们的定义
1.定义自己的圆形控制github住址:https://github.com/hdodenhof/CircleImageView 基本的类: package de.hdodenhof.circleim ...
- Android之CircleImageView使用
文章大纲 一.什么是CircleImageView二.代码实战三.项目源码下载 一.什么是CircleImageView 圆角 ImageView,在我们的 App 中这个想必是太常见了,也许我们 ...
随机推荐
- python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例
python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例 新浪爱彩双色球开奖数据URL:http://zst.aicai.com/ssq/openInfo/ 最终输出结果格 ...
- React,js实现分页的案列
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...
- 图论$\cdot$2-SAT问题
2-SAT问题是这样的:有$n$个布尔变量$x_i$,另有$m$个需要满足的条件,每个条件的形式都是“$x_i$为真/假或者$x_j$为真/假”.比如:"$x_1$为真或者$x_3$为假“. ...
- Unix网络编程--卷二:FAQ
1.编译unpipc库. 执行./configure时报错: checking host system type... Invalid configuration `x86_64-pc-linux-g ...
- sql server中如何查看执行效率不高的语句
sql server中,如果想知道有哪些语句是执行效率不高的,应该如何查看呢?下面就将为您介绍sql server中如何查看执行效率不高的语句,供您参考. 在测量功能时,先以下命令清除sql se ...
- ubuntu下安装、启动和卸载SSH
想往VMWare虚拟机上的Ubuntu里面拷贝代码,发现之前安装好的secureCRT链接不上.发现是ssh安装配置出了问题,于是就把openssh-server卸载后重装,发现又是与openssh- ...
- 史上最"恐怖"的12生肖图,绝对超猛
史上最“恐怖”的十二生肖图,绝对超猛!图片依次是:鼠 牛 虎 兔 龙 蛇 马 羊 猴 鸡 狗 猪!
- php中的json_encode()和json_decode()函数的一些说明
一,json语法( php中的json_decode($json)中的$json要符合json语法格式 ) ① JSON可以表示三种类型的值 1,简单值.包括整型,字符串型,布尔值和null.例如:5 ...
- 在代码中调用gdb
转载:http://blog.csdn.net/hanchaoman/article/details/5583457 在SIGSEGV的handler中调用gdb, 命令gdb [exec file] ...
- Beginning Windows Azure Development Guide
目 录 一 初始化Windows Azure 二 云应用程序的编写. 2.1云应用程序的创建. 2.2一个简单的云应用程序. 2.3 托管云程序. 三 云程序的数据库操作. 3.1通过Cloud平台 ...