在很多应用中,我们看到,个人主页里面的头像一般都是圆的,设计成圆的会使整个界面布局变的优雅漂亮。那么,怎么使头像变圆呢?有的人说可以在上面加一个中间为透明圆形的png图,用它来遮盖住头像不就行了嘛,但是png四周始终始终是不透明的,怎么做也达不到如下的效果图的。

下面我们讲讲怎么做成的吧。

首先创建一个继承ImageView的抽象类MaskedImage。让他重写onDraw方法。代码如下

public abstract class MaskedImage extends ImageView {

private static final Xfermode MASK_XFERMODE;

private Bitmap mask;

private Paint paint;

static {

PorterDuff.Mode localMode = PorterDuff.Mode.DST_IN;

MASK_XFERMODE = new PorterDuffXfermode(localMode);

}

public MaskedImage(Context paramContext) {

super(paramContext);

}

public MaskedImage(Context paramContext, AttributeSet paramAttributeSet) {

super(paramContext, paramAttributeSet);

}

public MaskedImage(Context paramContext, AttributeSet paramAttributeSet, int paramInt) {

super(paramContext, paramAttributeSet, paramInt);

}

public abstract Bitmap createMask();

protected void onDraw(Canvas paramCanvas) {

Drawable localDrawable = getDrawable();

if (localDrawable == null)

return;

try {

if (this.paint == null) {

Paint localPaint1 = new Paint();

this.paint = localPaint1;

this.paint.setFilterBitmap(false);

Paint localPaint2 = this.paint;

Xfermode localXfermode1 = MASK_XFERMODE;

@SuppressWarnings("unused")

Xfermode localXfermode2 = localPaint2.setXfermode(localXfermode1);

}

float f1 = getWidth();

float f2 = getHeight();

int i = paramCanvas.saveLayer(0.0F, 0.0F, f1, f2, null, 31);

int j = getWidth();

int k = getHeight();

localDrawable.setBounds(0, 0, j, k);

localDrawable.draw(paramCanvas);

if ((this.mask == null) || (this.mask.isRecycled())) {

Bitmap localBitmap1 = createMask();

this.mask = localBitmap1;

}

Bitmap localBitmap2 = this.mask;

Paint localPaint3 = this.paint;

paramCanvas.drawBitmap(localBitmap2, 0.0F, 0.0F, localPaint3);

paramCanvas.restoreToCount(i);

return;

} catch (Exception localException) {

StringBuilder localStringBuilder = new StringBuilder()

.append("Attempting to draw with recycled bitmap. View ID = ");

System.out.println("localStringBuilder=="+localStringBuilder);

}

}

}

public abstract class MaskedImage extends ImageView {

private static final Xfermode MASK_XFERMODE;

private Bitmap mask;

private Paint paint;

static {

PorterDuff.Mode localMode = PorterDuff.Mode.DST_IN;

MASK_XFERMODE = new PorterDuffXfermode(localMode);

}

public MaskedImage(Context paramContext) {

super(paramContext);

}

public MaskedImage(Context paramContext, AttributeSet paramAttributeSet) {

super(paramContext, paramAttributeSet);

}

public MaskedImage(Context paramContext, AttributeSet paramAttributeSet, int paramInt) {

super(paramContext, paramAttributeSet, paramInt);

}

public abstract Bitmap createMask();

protected void onDraw(Canvas paramCanvas) {

Drawable localDrawable = getDrawable();

if (localDrawable == null)

return;

try {

if (this.paint == null) {

Paint localPaint1 = new Paint();

this.paint = localPaint1;

this.paint.setFilterBitmap(false);

Paint localPaint2 = this.paint;

Xfermode localXfermode1 = MASK_XFERMODE;

@SuppressWarnings("unused")

Xfermode localXfermode2 = localPaint2.setXfermode(localXfermode1);

}

float f1 = getWidth();

float f2 = getHeight();

int i = paramCanvas.saveLayer(0.0F, 0.0F, f1, f2, null, 31);

int j = getWidth();

int k = getHeight();

localDrawable.setBounds(0, 0, j, k);

localDrawable.draw(paramCanvas);

if ((this.mask == null) || (this.mask.isRecycled())) {

Bitmap localBitmap1 = createMask();

this.mask = localBitmap1;

}

Bitmap localBitmap2 = this.mask;

Paint localPaint3 = this.paint;

paramCanvas.drawBitmap(localBitmap2, 0.0F, 0.0F, localPaint3);

paramCanvas.restoreToCount(i);

return;

} catch (Exception localException) {

StringBuilder localStringBuilder = new StringBuilder()

.append("Attempting to draw with recycled bitmap. View ID = ");

System.out.println("localStringBuilder=="+localStringBuilder);

}

}

}

public abstract class MaskedImage extends ImageView {

private static final Xfermode MASK_XFERMODE;

private Bitmap mask;

private Paint paint;

static {

PorterDuff.Mode localMode = PorterDuff.Mode.DST_IN;

MASK_XFERMODE = new PorterDuffXfermode(localMode);

}

public MaskedImage(Context paramContext) {

super(paramContext);

}

public MaskedImage(Context paramContext, AttributeSet paramAttributeSet) {

super(paramContext, paramAttributeSet);

}

public MaskedImage(Context paramContext, AttributeSet paramAttributeSet, int paramInt) {

super(paramContext, paramAttributeSet, paramInt);

}

public abstract Bitmap createMask();

protected void onDraw(Canvas paramCanvas) {

Drawable localDrawable = getDrawable();

if (localDrawable == null)

return;

try {

if (this.paint == null) {

Paint localPaint1 = new Paint();

this.paint = localPaint1;

this.paint.setFilterBitmap(false);

Paint localPaint2 = this.paint;

Xfermode localXfermode1 = MASK_XFERMODE;

@SuppressWarnings("unused")

Xfermode localXfermode2 = localPaint2.setXfermode(localXfermode1);

}

float f1 = getWidth();

float f2 = getHeight();

int i = paramCanvas.saveLayer(0.0F, 0.0F, f1, f2, null, 31);

int j = getWidth();

int k = getHeight();

localDrawable.setBounds(0, 0, j, k);

localDrawable.draw(paramCanvas);

if ((this.mask == null) || (this.mask.isRecycled())) {

Bitmap localBitmap1 = createMask();

this.mask = localBitmap1;

}

Bitmap localBitmap2 = this.mask;

Paint localPaint3 = this.paint;

paramCanvas.drawBitmap(localBitmap2, 0.0F, 0.0F, localPaint3);

paramCanvas.restoreToCount(i);

return;

} catch (Exception localException) {

StringBuilder localStringBuilder = new StringBuilder()

.append("Attempting to draw with recycled bitmap. View ID = ");

System.out.println("localStringBuilder=="+localStringBuilder);

}

}

}

然后新建一个类CircularImage继承MaskedImage。代码如下:

public class CircularImage extends MaskedImage {

public CircularImage(Context paramContext) {

super(paramContext);

}

public CircularImage(Context paramContext, AttributeSet paramAttributeSet) {

super(paramContext, paramAttributeSet);

}

public CircularImage(Context paramContext, AttributeSet paramAttributeSet, int paramInt) {

super(paramContext, paramAttributeSet, paramInt);

}

public Bitmap createMask() {

int i = getWidth();

int j = getHeight();

Bitmap.Config localConfig = Bitmap.Config.ARGB_8888;

Bitmap localBitmap = Bitmap.createBitmap(i, j, localConfig);

Canvas localCanvas = new Canvas(localBitmap);

Paint localPaint = new Paint(1);

localPaint.setColor(-16777216);

float f1 = getWidth();

float f2 = getHeight();

RectF localRectF = new RectF(0.0F, 0.0F, f1, f2);

localCanvas.drawOval(localRectF, localPaint);

return localBitmap;

}

}

public class CircularImage extends MaskedImage {

public CircularImage(Context paramContext) {

super(paramContext);

}

public CircularImage(Context paramContext, AttributeSet paramAttributeSet) {

super(paramContext, paramAttributeSet);

}

public CircularImage(Context paramContext, AttributeSet paramAttributeSet, int paramInt) {

super(paramContext, paramAttributeSet, paramInt);

}

public Bitmap createMask() {

int i = getWidth();

int j = getHeight();

Bitmap.Config localConfig = Bitmap.Config.ARGB_8888;

Bitmap localBitmap = Bitmap.createBitmap(i, j, localConfig);

Canvas localCanvas = new Canvas(localBitmap);

Paint localPaint = new Paint(1);

localPaint.setColor(-16777216);

float f1 = getWidth();

float f2 = getHeight();

RectF localRectF = new RectF(0.0F, 0.0F, f1, f2);

localCanvas.drawOval(localRectF, localPaint);

return localBitmap;

}

}

public class CircularImage extends MaskedImage {

public CircularImage(Context paramContext) {

super(paramContext);

}

public CircularImage(Context paramContext, AttributeSet paramAttributeSet) {

super(paramContext, paramAttributeSet);

}

public CircularImage(Context paramContext, AttributeSet paramAttributeSet, int paramInt) {

super(paramContext, paramAttributeSet, paramInt);

}

public Bitmap createMask() {

int i = getWidth();

int j = getHeight();

Bitmap.Config localConfig = Bitmap.Config.ARGB_8888;

Bitmap localBitmap = Bitmap.createBitmap(i, j, localConfig);

Canvas localCanvas = new Canvas(localBitmap);

Paint localPaint = new Paint(1);

localPaint.setColor(-16777216);

float f1 = getWidth();

float f2 = getHeight();

RectF localRectF = new RectF(0.0F, 0.0F, f1, f2);

localCanvas.drawOval(localRectF, localPaint);

return localBitmap;

}

}

新建一个MainActivity,代码如下:

public class MainActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

CircularImage cover_user_photo = (CircularImage) findViewById(R.id.cover_user_photo);

cover_user_photo.setImageResource(R.drawable.face);

}

}

public class MainActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

CircularImage cover_user_photo = (CircularImage) findViewById(R.id.cover_user_photo);

cover_user_photo.setImageResource(R.drawable.face);

}

}

public class MainActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

CircularImage cover_user_photo = (CircularImage) findViewById(R.id.cover_user_photo);

cover_user_photo.setImageResource(R.drawable.face);

}

}

其XML布局文件为:

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:gravity="center" >

android:layout_width="82.0dip"

android:layout_height="82.0dip"

android:layout_centerInParent="true"

android:contentDescription="@null"

android:src="@drawable/me_head_bg" />

android:id="@+id/cover_user_photo"

android:layout_width="74.0dip"

android:layout_height="74.0dip"

android:layout_centerInParent="true" />

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:gravity="center" >

android:layout_width="82.0dip"

android:layout_height="82.0dip"

android:layout_centerInParent="true"

android:contentDescription="@null"

android:src="@drawable/me_head_bg" />

android:id="@+id/cover_user_photo"

android:layout_width="74.0dip"

android:layout_height="74.0dip"

android:layout_centerInParent="true" />

java登录界面圆形头像_自定义圆形头像相关推荐

  1. java登录界面命令_Java命令行界面(第16部分):JArgp

    java登录界面命令 这篇文章中介绍的基于Java的命令行参数处理库是IBM developerWorks文章Java编程动态性,第3部分,应用的反射 (第2003 部分,此归档文章于2016年&qu ...

  2. java登录界面命令_Java命令行界面(第10部分):picocli

    java登录界面命令 picocli主页面将picocli描述为"强大的微小命令行界面"," picocli"是一个单文件Java框架,用于解析命令行参数并生成 ...

  3. java登录界面命令_Java命令行界面(第25部分):JCommando

    java登录界面命令 JCommando 网站 上将JCommando描述为"命令行参数的Java参数解析器". JCommando读取XML配置以生成一个Java类,该类处理Ja ...

  4. java登录界面命令_Java命令行界面(第30部分):观察

    java登录界面命令 这个有关Java命令行参数解析的系列文章由四个月来发表的29篇帖子组成,涵盖了28个不同的开放源代码库,可用于解析Java命令行参数. 这篇文章收集了可以从本系列的前29篇文章中 ...

  5. java登录界面命令_Java命令行界面(第29部分):自己动手

    java登录界面命令 本系列有关从Java解析命令行参数的系列简要介绍了28个开源库,这些库可用于处理Java代码中的命令行参数. 即使涵盖了这28个库,该系列也没有涵盖用于解析Java命令行选项的所 ...

  6. java登录界面命令_Java命令行界面(第3部分):jbock

    java登录界面命令 在本系列中有关使用Java进行命令行分析的前两篇文章中,我介绍了Apache Commons CLI和args4j库. 在本系列的第三篇文章中,我介绍了jbock ,它是自我描述 ...

  7. java登录界面命令_Java命令行界面(第26部分):CmdOption

    java登录界面命令 由于Tweet,我了解了本系列中第26个基于Java的功能强大的库,该库用于解析命令行参数 . CmdOption在其GitHub主页上被描述为"一个通过注释配置的,用 ...

  8. java登录界面命令_Java命令行界面(第12部分):CLAJR

    java登录界面命令 第十二篇有关在Java中处理命令行参数的文章的特色库是带有Java Reflection的命令行参数 (CLAJR). 该"库"是单个Java源文件( CLA ...

  9. java登录界面命令_Java命令行界面(第11部分):CmdLn

    java登录界面命令 这篇文章介绍了如何使用Ostermiller Java Utilities 1.08.02的CmdLn(Java命令行解析器)来处理基于Java的应用程序中的命令行参数. Ost ...

最新文章

  1. opendolphin_使用DolphinDB进行机器学习
  2. ie 调用java的时候报错,调用javabean的非常郁闷的异常。
  3. 刷网络课_网络营销实践心得—刘荟萌
  4. 在工作中你卑微到什么程度?
  5. php iis 手动安装教程,iis php安装教程【图文详解】_后端开发
  6. 【企业架构师】12 项企业架构师认证
  7. MySql 根据身份证号来判别所属省份年龄及性别
  8. java实用型:mybatis的好帮手-MybatisCodeHelperPro
  9. quot;title_activity_distquot; is not translated in quot;zh-rCNquot; (Chinese: China)
  10. 是用bbed工具模拟对块的破坏,并使用rman bock recover进行块恢复
  11. Python中and和or的运算规则,短路计算
  12. iReport制作报表
  13. 乌龟为什么喜欢叠罗汉!!!
  14. EasyCVR平台基于萤石云SDK接入的设备播放流程及接口调用
  15. 【数学建模】6 近十年江西省研究生建模赛题及近三年全国建模赛题目录
  16. 指定位置签到-百度地图
  17. 第十六章 SQL函数 ABS
  18. 4年测试经验去面试10分钟就被pass,测试现在要求这么高了?
  19. OSI七层网络模型概念
  20. Kconfig语法详解

热门文章

  1. Node.js 模块系统
  2. win7下的ipython没有的问题
  3. 用户信息持久化解决方案
  4. 物化视图的刷新方式说明
  5. 为什么电脑插上网线半天才有网,是路由器的的问题吗?
  6. MySql中not in的优化
  7. Python之实现常见算法
  8. ArrayList在foreach正常迭代删除不报错的原因
  9. MongoDB - 分片管理
  10. java web中Jdbc访问数据库步骤通俗解释(吃饭),与MVC的通俗解释(做饭)