Android之头像图片变圆形显示

一:先上效果图

二:实现步骤

1.自定义一个转换工具类

package com.common.base.util; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.BitmapShader; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.RectF; import android.graphics.Shader; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.widget.ImageView; import com.common.base.R; public class CircleImageView extends ImageView { /** * 头像转换工具类 */ private static final ScaleType SCALE_TYPE = ScaleType.CENTER_CROP; private static final Bitmap.Config BITMAP_CONFIG = Bitmap.Config.ARGB_8888; private static final int COLORDRAWABLE_DIMENSION = 1; private static final int DEFAULT_BORDER_WIDTH = 0; private static final int DEFAULT_BORDER_COLOR = Color.BLACK; private final RectF mDrawableRect = new RectF(); private final RectF mBorderRect = new RectF(); private final Matrix mShaderMatrix = new Matrix(); private final Paint mBitmapPaint = new Paint(); private final Paint mBorderPaint = new Paint(); private int mBorderColor = DEFAULT_BORDER_COLOR; private int mBorderWidth = DEFAULT_BORDER_WIDTH; private Bitmap mBitmap; private BitmapShader mBitmapShader; private int mBitmapWidth; private int mBitmapHeight; private float mDrawableRadius; private float mBorderRadius; private boolean mReady; private boolean mSetupPending; public CircleImageView(Context context) { super(context); } public CircleImageView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public CircleImageView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); super.setScaleType(SCALE_TYPE); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CircleImageView, defStyle, 0); mBorderWidth = a.getDimensionPixelSize(R.styleable.CircleImageView_border_width, DEFAULT_BORDER_WIDTH); mBorderColor = a.getColor(R.styleable.CircleImageView_border_color, DEFAULT_BORDER_COLOR); a.recycle(); mReady = true; if (mSetupPending) { setup(); mSetupPending = false; } } @Override public ScaleType getScaleType() { return SCALE_TYPE; } @Override public void setScaleType(ScaleType scaleType) { if (scaleType != SCALE_TYPE) { throw new IllegalArgumentException(String.format("ScaleType %s not supported.", scaleType)); } } @Override protected void onDraw(Canvas canvas) { if (getDrawable() == null) { return; } canvas.drawCircle(getWidth() / 2, getHeight() / 2, mDrawableRadius, mBitmapPaint); canvas.drawCircle(getWidth() / 2, getHeight() / 2, mBorderRadius, mBorderPaint); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); setup(); } public int getBorderColor() { return mBorderColor; } public void setBorderColor(int borderColor) { if (borderColor == mBorderColor) { return; } mBorderColor = borderColor; mBorderPaint.setColor(mBorderColor); invalidate(); } public int getBorderWidth() { return mBorderWidth; } public void setBorderWidth(int borderWidth) { if (borderWidth == mBorderWidth) { return; } mBorderWidth = borderWidth; setup(); } @Override public void setImageBitmap(Bitmap bm) { super.setImageBitmap(bm); mBitmap = bm; setup(); } @Override public void setImageDrawable(Drawable drawable) { super.setImageDrawable(drawable); mBitmap = getBitmapFromDrawable(drawable); setup(); } @Override public void setImageResource(int resId) { super.setImageResource(resId); mBitmap = getBitmapFromDrawable(getDrawable()); setup(); } private Bitmap getBitmapFromDrawable(Drawable drawable) { if (drawable == null) { return null; } if (drawable instanceof BitmapDrawable) { return ((BitmapDrawable) drawable).getBitmap(); } try { Bitmap bitmap; if (drawable instanceof ColorDrawable) { bitmap = Bitmap.createBitmap(COLORDRAWABLE_DIMENSION, COLORDRAWABLE_DIMENSION, BITMAP_CONFIG); } else { bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), BITMAP_CONFIG); } Canvas canvas = new Canvas(bitmap); drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); drawable.draw(canvas); return bitmap; } catch (OutOfMemoryError e) { return null; } } private void setup() { if (!mReady) { mSetupPending = true; return; } if (mBitmap == null) { return; } mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); mBitmapPaint.setAntiAlias(true); mBitmapPaint.setShader(mBitmapShader); mBorderPaint.setStyle(Paint.Style.STROKE); mBorderPaint.setAntiAlias(true); mBorderPaint.setColor(mBorderColor); mBorderPaint.setStrokeWidth(mBorderWidth); mBitmapHeight = mBitmap.getHeight(); mBitmapWidth = mBitmap.getWidth(); mBorderRect.set(0, 0, getWidth(), getHeight()); mBorderRadius = Math.min((mBorderRect.height() - mBorderWidth) / 2, (mBorderRect.width() - mBorderWidth) / 2); mDrawableRect.set(mBorderWidth, mBorderWidth, mBorderRect.width() - mBorderWidth, mBorderRect.height() - mBorderWidth); mDrawableRadius = Math.min(mDrawableRect.height() / 2, mDrawableRect.width() / 2); updateShaderMatrix(); invalidate(); } private void updateShaderMatrix() { float scale; float dx = 0; float dy = 0; mShaderMatrix.set(null); if (mBitmapWidth * mDrawableRect.height() > mDrawableRect.width() * mBitmapHeight) { scale = mDrawableRect.height() / (float) mBitmapHeight; dx = (mDrawableRect.width() - mBitmapWidth * scale) * 0.5f; } else { scale = mDrawableRect.width() / (float) mBitmapWidth; dy = (mDrawableRect.height() - mBitmapHeight * scale) * 0.5f; } mShaderMatrix.setScale(scale, scale); mShaderMatrix.postTranslate((int) (dx + 0.5f) + mBorderWidth, (int) (dy + 0.5f) + mBorderWidth); mBitmapShader.setLocalMatrix(mShaderMatrix); } }

2.xml的引用

<com.common.base.util.CircleImageView android:id="@+id/touxian_id" android:layout_width="75dp" android:layout_height="75dp" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:src="@drawable/yonghu_touxiang" />

3.activity的实现

private CircleImageView touxiang_id; touxiang_id = (CircleImageView)findViewById(R.id.touxian_id) BitmapHelp.displayOnImageView(mContext, holder.touxiang_id, mListy .getUser().getPic(), R.drawable.ic_launcher, R.drawable.ic_launcher);

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持脚本之家!

时间: 2024-11-01 05:05:41

Android之头像图片变圆形显示的相关文章

android 获取本地图片 并用遮罩显示成带有圆心边框的圆形图

问题描述 android 获取本地图片 并用遮罩显示成带有圆心边框的圆形图 有一个需求,获取本地图片或者拍照,然后将图片用遮罩效果做成圆形并且带有边框的样式如图所示,,获取本地图片和拍照会做,但是不知道怎么用遮罩效果做成那种效果,,,求解,,,谢谢....最好有具体代码实现 解决方案 用遮罩的方式已经解决,,,,,,,, 解决方案二: Picasso框架简单快速高效 解决方案三: 你最好了解一下最新的fresco框架,你说的需求,里面都可以实现,只要你引用就可以了! 解决方案四: android

【游戏开发备注之一】关于COCOS2DX_V1.X版本IPHONE与ANDROID运行出现图片白块、添加GAMECENTER报错问题及编译ANDROID闪退的解决办法&amp;&amp;CCLOG与CCLOG的区别

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/1035.html 今天备注几个童鞋们可能会遇到的问题: 1. 关于Cocos2dx v1.x版本运行在iphone与Android平台出现图片变白块,尺寸一样.图片纯白问题. 之前出现此问题原因如下: 1.1  CCSprite与CCNode强转之间的问题造成: 1.2  pvr.ccz的资源大小宽高不是正方形的话

Android特效专辑(五)——自定义圆形头像和仿MIUI卸载动画—粒子爆炸

Android特效专辑(五)--自定义圆形头像和仿MIUI卸载动画-粒子爆炸 好的,各位亲爱的朋友,今天讲的特效还是比较炫的,首先,我们会讲一个自定义圆形的imageView,接着,我们会来实现粒子爆炸的特效,按照国际惯例,无图无真相的没这个效果也是模仿大神的,现在应用在了我的<Only>上 截图 好的,我们新建一个工程--AnimView,我们要用到的图片 一.自定义圆形头像-- 直接开写了,要实现的东西都在注释上了 1.编写自定义属性attr.xml <?xml version=&q

Android之ListView异步加载图片且仅显示可见子项中的图片

折腾了好多天,遇到 N 多让人崩溃无语的问题,不过今天终于有些收获了,这是实验的第一版,有些混乱,下一步进行改造细分,先把代码记录在这儿吧. 网上查了很多资料,发现都千篇一律,抄来抄去,很多细节和完整实例都没看到,只有自己一点点研究了,总体感觉 android 下面要显示个图片真不容易啊. 项目主要实现的功能: 异步加载图片 图片内存缓存.异步磁盘文件缓存 解决使用 viewHolder 后出现的图片错位问题 优化列表滚动性能,仅显示可见子项中的图片 无需固定图片显示高度,对高度进行缓存使列表滚

android 布局-android用布局文件将方形头像切成圆形

问题描述 android用布局文件将方形头像切成圆形 安卓在布局文件中能否将一个方形头像改成圆形?怎么实现?求大神指教! 解决方案 可以, 通过自定义drawable即可,我的博客中有 解决方案二: http://blog.csdn.net/a2500100455/article/details/44701033 解决方案三: http://blog.csdn.net/lmj623565791/article/details/41967509 解决方案四: http://blog.csdn.ne

ios-IOS图片剪切圆形头像时,宽度和高度不一样为什么剪切出来的头像还是正圆??

问题描述 IOS图片剪切圆形头像时,宽度和高度不一样为什么剪切出来的头像还是正圆?? 解决方案 因为你的beginimagecontext 里面设置成了image.size 你改成其他尺寸看看 解决方案二: 你的header是不是宽高相同?是不是scaleTofill的? 按照你最初的写法,你的newImg是一个椭圆的, 但是我估计你的header是一个宽高相等的view,并且是scaleTofill的,将newImg放进去的时候,正好又变回圆形了 可以new一个别的尺寸的UIImageView

WindowsPhone8中实现圆形图片的生成显示

原文 WindowsPhone8中实现圆形图片的生成显示 很多软件中(比如QQ)用到了许多圆形图片,作为用户头像等等,原始图片往往是方形的,那么怎么样将方形的图片显示成圆形呢? 一种方法是当背景为固定纯色的时候,可以使用同背景色的边框遮罩,这种方法适用性小,这里不再赘述. 我的做法是使用ArcSegment的功能来实现圆形图片的显示,ArcSegment派生自PathSegment,"~派生自 PathSegment 的类(例如 ArcSegment.BezierSegment 和 LineSe

Android裁剪图片为圆形图片的实现原理与代码_Android

以前在eoe论坛中找过裁剪图片为圆形图片的方法,但是效果都不是很理想,这几天因为公司业务的要求,需要对头像进行裁剪以圆形的方式显示,这个方法是根据传入的图片的高度(height)和宽度(width)决定的,如果是 width <= height时,则会裁剪高度,裁剪的区域是宽度不变高度从顶部到宽度width的长度:如果 width > height,则会裁剪宽度,裁剪的区域是高度不变,宽度是取的图片宽度的中心区域,不过不同的业务需求,对裁剪图片要求不一样,可以根据业务的需求来调整裁剪的区域.

Android裁剪图片为圆形图片的实现原理与代码

以前在eoe论坛中找过裁剪图片为圆形图片的方法,但是效果都不是很理想,这几天因为公司业务的要求,需要对头像进行裁剪以圆形的方式显示,这个方法是根据传入的图片的高度(height)和宽度(width)决定的,如果是 width <= height时,则会裁剪高度,裁剪的区域是宽度不变高度从顶部到宽度width的长度:如果 width > height,则会裁剪宽度,裁剪的区域是高度不变,宽度是取的图片宽度的中心区域,不过不同的业务需求,对裁剪图片要求不一样,可以根据业务的需求来调整裁剪的区域.