【实例简介】

【实例截图】

【核心代码】

package davidzoomimageviewrounddemo.qq986945193.com.davidzoomimageviewrounddemo.view;

import android.content.Context;

import android.content.res.TypedArray;

import android.graphics.Bitmap;

import android.graphics.Canvas;

import android.graphics.Paint;

import android.graphics.PorterDuff;

import android.graphics.PorterDuffXfermode;

import android.graphics.Rect;

import android.graphics.drawable.BitmapDrawable;

import android.graphics.drawable.Drawable;

import android.graphics.drawable.NinePatchDrawable;

import android.util.AttributeSet;

import android.widget.ImageView;

import davidzoomimageviewrounddemo.qq986945193.com.davidzoomimageviewrounddemo.R;

/**

* @author :程序员小冰

* @新浪微博 :http://weibo.com/mcxiaobing

* @CSDN博客: http://blog.csdn.net/qq_21376985

* @交流Qq :986945193

* @GitHub:https://github.com/QQ986945193

*/

public class RoundImageView extends ImageView {

private int mBorderThickness = 0;

private Context mContext;

private int defaultColor = 0xFFFFFFFF;

// 如果只有其中一个有值,则只画一个圆形边框

private int mBorderOutsideColor = 0;// 图片的外边界

private int mBorderInsideColor = 0;// 图片的内边界

// 控件默认长、宽

private int defaultWidth = 0;

private int defaultHeight = 0;

public RoundImageView(Context context) {

super(context);

mContext = context;

}

public RoundImageView(Context context, AttributeSet attrs) {

super(context, attrs);

mContext = context;

setCustomAttributes(attrs);

}

public RoundImageView(Context context, AttributeSet attrs, int defStyle) {

super(context, attrs, defStyle);

mContext = context;

setCustomAttributes(attrs);

}

private void setCustomAttributes(AttributeSet attrs) {

TypedArray a = mContext.obtainStyledAttributes(attrs,

R.styleable.RoundImageView);

// 边界的宽度

mBorderThickness = a.getDimensionPixelSize(

R.styleable.RoundImageView_border_thickness, 0);

// 外边界的颜色

mBorderOutsideColor = a.getColor(

R.styleable.RoundImageView_border_outside_color, defaultColor);

// 内边界的颜色

mBorderInsideColor = a.getColor(

R.styleable.RoundImageView_border_inside_color, defaultColor);

}

@Override

protected void onDraw(Canvas canvas) {

Drawable drawable = getDrawable();

if (drawable == null) {

return;

}

if (getWidth() == 0 || getHeight() == 0) {

return;

}

this.measure(0, 0);

if (drawable.getClass() == NinePatchDrawable.class)

return;

Bitmap b = ((BitmapDrawable) drawable).getBitmap();

Bitmap bitmap = b.copy(Bitmap.Config.ARGB_8888, true);

if (defaultWidth == 0) {

defaultWidth = getWidth();

}

if (defaultHeight == 0) {

defaultHeight = getHeight();

}

// 保证重新读取图片后不会因为图片大小而改变控件宽、高的大小(针对宽、高为wrap_content布局的imageview,但会导致margin无效)

// if (defaultWidth != 0 && defaultHeight != 0) {

// LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(

// defaultWidth, defaultHeight);

// setLayoutParams(params);

// }

int radius = 0;

if (mBorderInsideColor != defaultColor

&& mBorderOutsideColor != defaultColor) {// 定义画两个边框,分别为外圆边框和内圆边框

radius = (defaultWidth < defaultHeight ? defaultWidth

: defaultHeight) / 2 - 2 * mBorderThickness;

// 画内圆

drawCircleBorder(canvas, radius mBorderThickness / 2,

mBorderInsideColor);

// 画外圆

drawCircleBorder(canvas, radius mBorderThickness

mBorderThickness / 2, mBorderOutsideColor);

} else if (mBorderInsideColor != defaultColor

&& mBorderOutsideColor == defaultColor) {// 定义画一个边框

radius = (defaultWidth < defaultHeight ? defaultWidth

: defaultHeight) / 2 - mBorderThickness;

drawCircleBorder(canvas, radius mBorderThickness / 2,

mBorderInsideColor);

} else if (mBorderInsideColor == defaultColor

&& mBorderOutsideColor != defaultColor) {// 定义画一个边框

radius = (defaultWidth < defaultHeight ? defaultWidth

: defaultHeight) / 2 - mBorderThickness;

drawCircleBorder(canvas, radius mBorderThickness / 2,

mBorderOutsideColor);

} else {// 没有边框

radius = (defaultWidth < defaultHeight ? defaultWidth

: defaultHeight) / 2;

}

Bitmap roundBitmap = getCroppedRoundBitmap(bitmap, radius);

canvas.drawBitmap(roundBitmap, defaultWidth / 2 - radius, defaultHeight

/ 2 - radius, null);

}

/**

* 获取裁剪后的圆形图片

*

* http://blog.csdn.net/qq_21376985

* @param radius

* 半径

*/

public Bitmap getCroppedRoundBitmap(Bitmap bmp, int radius) {

Bitmap scaledSrcBmp;

int diameter = radius * 2;

// 为了防止宽高不相等,造成圆形图片变形,因此截取长方形中处于中间位置最大的正方形图片

int bmpWidth = bmp.getWidth();

int bmpHeight = bmp.getHeight();

int squareWidth = 0, squareHeight = 0;

int x = 0, y = 0;

Bitmap squareBitmap;

if (bmpHeight > bmpWidth) {// 高大于宽

squareWidth = squareHeight = bmpWidth;

x = 0;

y = (bmpHeight - bmpWidth) / 2;

// 截取正方形图片

squareBitmap = Bitmap.createBitmap(bmp, x, y, squareWidth,

squareHeight);

} else if (bmpHeight < bmpWidth) {// 宽大于高

squareWidth = squareHeight = bmpHeight;

x = (bmpWidth - bmpHeight) / 2;

y = 0;

squareBitmap = Bitmap.createBitmap(bmp, x, y, squareWidth,

squareHeight);

} else {

squareBitmap = bmp;

}

if (squareBitmap.getWidth() != diameter

|| squareBitmap.getHeight() != diameter) {

scaledSrcBmp = Bitmap.createScaledBitmap(squareBitmap, diameter,

diameter, true);

} else {

scaledSrcBmp = squareBitmap;

}

Bitmap output = Bitmap.createBitmap(scaledSrcBmp.getWidth(),

scaledSrcBmp.getHeight(), Bitmap.Config.ARGB_8888);

Canvas canvas = new Canvas(output);

Paint paint = new Paint();

Rect rect = new Rect(0, 0, scaledSrcBmp.getWidth(),

scaledSrcBmp.getHeight());

paint.setAntiAlias(true);

paint.setFilterBitmap(true);

paint.setDither(true);

canvas.drawARGB(0, 0, 0, 0);

canvas.drawCircle(scaledSrcBmp.getWidth() / 2,

scaledSrcBmp.getHeight() / 2, scaledSrcBmp.getWidth() / 2,

paint);

paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));

canvas.drawBitmap(scaledSrcBmp, rect, rect, paint);

// bitmap回收(recycle导致在布局文件XML看不到效果)

// bmp.recycle();

// squareBitmap.recycle();

// scaledSrcBmp.recycle();

bmp = null;

squareBitmap = null;

scaledSrcBmp = null;

return output;

}

/**

* 边缘画圆

*

* http://blog.csdn.net/qq_21376985

*/

private void drawCircleBorder(Canvas canvas, int radius, int color) {

Paint paint = new Paint();

/* 去锯齿 */

paint.setAntiAlias(true);

paint.setFilterBitmap(true);

paint.setDither(true);

paint.setColor(color);

/* 设置paint的 style 为STROKE:空心 */

paint.setStyle(Paint.Style.STROKE);

/* 设置paint的外框宽度 */

paint.setStrokeWidth(mBorderThickness);

canvas.drawCircle(defaultWidth / 2, defaultHeight / 2, radius, paint);

}

}

圆形头像 android,android 一个简单的实现圆形头像的Demo相关推荐

  1. android实现计算器功能吗,利用Android实现一个简单的计算器功能

    利用Android实现一个简单的计算器功能 发布时间:2020-11-20 16:25:01 来源:亿速云 阅读:90 作者:Leah 今天就跟大家聊聊有关利用Android实现一个简单的计算器功能, ...

  2. 初识Android 制作一个简单的记账本

    初识Android 制作一个简单的记账本 主要功能 实现一个记账本页面 可以添加数据并更新到页面中 主要步骤 运行截图 主页面 点击红色按钮弹出添加页面 完成后自动更新到目录下 主要功能 实现一个记账 ...

  3. Android 实现一个简单的文件下载工具

    下载应该是每个App都必须的一项功能,不采用第三方框架的话,就需要我们自己去实现下载工具了.如果我们自己实现可以怎么做呢? 首先如果服务器文件支持断点续传,则我们需要实现的主要功能点如下: 多线程.断 ...

  4. Android Compose——一个简单的Bilibili APP

    Bilibili移动端APP 简介 依赖 效果 登录 效果 WebView 自定义TobRow的Indicator大小 首页 推荐 LazyGridView使用Paging3 热门 排行榜 搜索 模糊 ...

  5. 用Android做一个简单的音乐播放器(上)

    这一学期要结束了,我用Android写了一个音乐播放器,算是给它画上个完美的句号,里面有登录,注册,这个APP还有很多功能没完善,有时间了在加一些料.效果图如下: 登录.注册直接用的是Android自 ...

  6. Android 中一个简单垂直跑马灯的实现

    记录一个Android中简单实现垂直跑马灯功能的方法:实现了垂直跑马灯的功能.记录一下以便日后查看: 首先在MainActivity下新建一个名为ScrollTextView的.java 文件 Scr ...

  7. JME3教程:Android创建一个简单的示例

    作者:忆逝丷 不得转载!不得转载!不得转载! 找遍全网都没有一个安卓的教程,我研究了好几天,终于研究出来了,分享一下给大家. 首先需要对安卓中的view,assets,libso存放位置有一定的了解. ...

  8. Android Compose——一个简单的新闻APP

    Owl 简述 效果视频 导航 导航结点 路线图 底部导航栏 使用 标签页 状态切换 FeaturePage 构建 CoursePage 实现 搜索 ViewModel View 详情页 Detail ...

  9. Android 画布画线,android实现一个简单的画布,可以用手指画线条。

    满意答案 wpdhc 2016.07.05 采纳率:49%    等级:7 已帮助:359人 public class DrawView extends View { Context mycontex ...

最新文章

  1. scapy windows install
  2. android2.2
  3. Linux编程获取网络信息总结
  4. pipe()函数精解
  5. tf.ConfigProto()详解
  6. win 文字转化为语音
  7. 【BFS】【并查集】【Tarjan】【LCA】Gym - 101173H - Hangar Hurdles
  8. 讨论群问题:Linux 下的批量操作,第2种很赞
  9. 二进制字符串转换到Ascll字符串
  10. [swift] LeetCode 96. Unique Binary Search Trees
  11. linux终端中书名号,Linux双引号、单引号和反向单引号
  12. C#编程(二十三)----------实现继承
  13. [copypaste]各种表示法
  14. 新萝卜家园 Ghost XP SP3 电脑城装机版 2011.06+
  15. java声卡录音_win10下程序无法录音或使用麦克风
  16. artwork will be rounded down because......
  17. 简单学JAVA-Java学习方法-JavaSE阶段
  18. Ubuntu18.04运行校园网客户端
  19. SAP中会计凭证数据表关系的简单验证
  20. NLP-词汇表征与词嵌入

热门文章

  1. 机器学习(Andrew Ng)作业代码(Exercise 3~4)
  2. 高斯日记(c语言习题)
  3. 合并两个有序链表(java算法)
  4. VirtualBox 立即卸载此应用,因为它与Windows 10 不兼容
  5. 离散数学之一 命题逻辑
  6. Android 养成记-1.5 二维码生成+添加logo+识别+扫码
  7. 干支纪年java_天干地支纪年法 - osc_xcg0s5cw的个人空间 - OSCHINA - 中文开源技术交流社区...
  8. 震惊!深度揭秘互联网络!!!
  9. Nature Methods期刊的latex模板去哪里找?
  10. nopac 原理及复现