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 中这个想必是太常见了,也许我们 ...
随机推荐
- nodejs框架express准备登录
目录: 安装模板 静态资源 添加视图 渲染视图 url重定向 模板引擎 从本节课程开始我们要使用express框架实现一个简单的用户登陆功能,让我们先准备一下相关资源. 在nodejs中使用expre ...
- 安卓开发经验分享:资源、UI、函数库、测试、构建一个都不能少(转)
除了高超的武艺,每位黑忍者还需要装备最好的武器.在软件开发的世界里,好的工具能让我们的生活变得更轻松,在更短的时间里写出更棒的代码. 时光回到2008年,那时安卓还很年轻.只有几个相关的博客和谷歌官方 ...
- Proteus 8 画原理图仿真 1602 LCD显示字符
以下是源程序: #include <reg52.h> #include<intrins.h> /** * P2 上接的是 D1 ~ D7 */ sbit RS = P3 ^ ; ...
- NET中的类型和装箱/拆箱原理
谈到装箱拆箱,DebugLZQ相信给位园子里的博友一定可以娓娓道来,大概的意思就是值类型和引用类型的相互转换呗---值类型到引用类型叫装箱,反之则叫拆箱.这当然没有问题,可是你只知道这么多,那么Deb ...
- hdu 5779 Tower Defence
题意:考虑由$n$个结点构成的无向图,每条边的长度均为$1$,问有多少种构图方法使得结点$1$与任意其它节点之间的最短距离均不等于$k$(无法到达时距离等于无穷大),输出答案对$1e9+7$取模.$1 ...
- CentOS 安装Zookeeper-3.4.6 单节点
Dubbo 建议使用 Zookeeper 作为服务的注册中心. 注册中心服务器(192.168.3.71)配置,安装 Zookeeper: 1. 修改操作系统的/etc/hosts 文件中添加: # ...
- [问题2014S10] 解答
[问题2014S10] 解答 先证明一个简单的引理. 引理 设 \(\lambda_0\) 是 \(n\) 阶方阵 \(A\) 的特征值, 则对任意的正整数 \(k\), Jordan 块 \(J ...
- Mysql新知识点150928
1.select distinct(DATE_FORMAT(updatetime,'%Y-%m')) as updatetime from barcode where pid!=0 order by ...
- Java-String类的常用方法总结
一.String类String类在java.lang包中,java使用String类创建一个字符串变量,字符串变量属于对象.java把String类声明的final类,不能有类.String类对象创建 ...
- 安装了ubuntu14.04+windows7双系统的笔记本启动后出现grub rescue>提示符
解决思想如下: 1.在grub rescue>提示符处输入ls 即可看到该命令列出了硬盘上的所有分区,找到安装了linux的分区,我的安装在(hd0,msdos8)下,所以我以(hd0,msd ...