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 中这个想必是太常见了,也许我们 ...
随机推荐
- POJ - 2183 Bovine Math Geniuses
“模拟“题,运用哈希,不断地按照一定运算规律对一个结果进行计算,如果重复出现就停止并且输出该数.注意到仔细看题,这种题一定要细心! POJ - 2183 Bovine Math Geniuses Ti ...
- Android 开机启动
创建一个Receiver,用来监听开机完毕: public class MyReceiver extends BroadcastReceiver { static final String actio ...
- android录像增加时间记录(源码里修改)
需要做一个功能,录像和播放时都显示录时的时间,参考文章链接找不到了,不好意思,这里记录一下,防止下次找不到了.另一篇关于源码录像的流程请参考 http://www.verydemo.com/demo_ ...
- "Unity测试系列"文章索引
对Unity各种API的细节进行测试 Common 一些Unity基础操作的性能测试 Animation/Animator Animation Play/Stop测试 关于Animation动画事件的 ...
- mac上安装opencv3
转载于:http://blog.csdn.net/sanwandoujiang/article/details/51159983 在macosx上安装opencv2 brew tap homebrew ...
- 制作圆角:《CSS3 Border-radius》
今天我们在一起来看看CSS3中制作圆角的属性border-radius的具体用法.如今CSS3中的border-radius出现后,让我们没有那么多的烦恼了,首先制作圆角图片的时间是省了,而且其还有多 ...
- mac攻略(二) -- 简单配置php开发环境
最简单直接的方式还是使用 Mac 上自带的 Apache 和 PHP. 1.启动 Apache 1>启动apache $sudo apachectl start; 2>启动后,在浏览器 ...
- MVC中Razor的使用 及路径问题
语法: @ 可以编写一条C#语句@{} 可以编写一组C#语句@: 将文字内容直接输出到页面上去@() 在一句中将一段C#代码包括起来,证明这一句完整的C#代码 引用命名空间:@using 空间名称 H ...
- 浅谈用ModelSim+Synplify+Quartus来实现Altera FPGA的仿真
浅谈用ModelSim+Synplify+Quartus来实现Altera FPGA的仿真 工作内容: Mentor公司的ModelSim是业界最优秀的HDL语言仿真软件,它能提供友好的仿真环境,是业 ...
- hihoCoder 1383 : The Book List(书目表)
hihoCoder #1383 : The Book List(书目表) 时间限制:1000ms 单点时限:1000ms 内存限制:256MB Description - 题目描述 The histo ...