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 中这个想必是太常见了,也许我们 ...
随机推荐
- python的一些图像操作
from PIL import ImageGrabim = ImageGrab.grab()im.save("f:\\T.jpg",'jpeg') 直接用pyCharm安装PI ...
- Together
- :nth-child
匹配其父元素下的第N个子或奇偶元素 :eq(index) 匹配选择器指定序列的元素,而这个将为每一个父元素匹配子元素. :nth-child从1开始的,而:eq()是从0算起的!可以使用:<br ...
- Android APK反编译easy 详解
在学习Android开发的过程你,你往往会去借鉴别人的应用是怎么开发的,那些漂亮的动画和精致的布局可能会让你爱不释手,作为一个开发者,你可能会很想知道这些效果界面是怎么去实现的,这时,你便可以对改应用 ...
- linux bash快捷键
bash快捷键 CTRL+F 光标向前移动一个字母 CTRL+B 光标向后移动一个字母 CTRL+A HOME CTRL+E END
- vlc播放yuv文件
vlc.exe --demux rawvideo --rawvid-fps 25 --rawvid-width 480 --rawvid-height 272 --rawvid-chroma I420 ...
- Python之通过IP地址库获取IP地理信息
利用第三方的IP地址库,各个公司可以根据自己的业务情况打造自己的IP地址采集分析系统.例如游戏公司可以采集玩家地区信息,进行有针对性的运营策略,还可能帮助分析玩家网络故障分布等等. #!/usr/bi ...
- 通过Mac远程调试iPhone/iPad上的网页(转)
我们知道在 Mac/PC 上的浏览器都有 Web 检查器这类的工具(如最著名的 Firebug)对前端开发进行调试,而在 iPhone/iPad 由于限于屏幕的大小和触摸屏的使用习惯,直接对网页调试非 ...
- 开发板A/D转换原理
A/D转换器(Analog-to-Digital Converter)又叫模/数转换器,即使将模拟信(电压或是电流的形式)转换成数字信号.这种数字信号可让仪表,计算机外设接口或是微处理机来加以操作或是 ...
- JQ写简单的伸缩菜单(内附效果图和源代码)
效果如图: JQ代码就那么几句, <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "h ...