关于Android圆形图片的一种优化方案(可以显示网络图片)
在Android App中,我们经常看到圆形头像图片,然后网上也有很多开源的控件。刚好这个项目用到了,也去找了一些开源的,发现并不完美,所以只好自己优化了,废话不多说,先上效果图:
下面是源码:本人能理解的地方都加上注释了,大牛勿喷。
- package com.xyt.ygcf.widget;
- 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.RectF;
- import android.graphics.Xfermode;
- import android.graphics.drawable.Drawable;
- import android.graphics.drawable.NinePatchDrawable;
- import android.util.AttributeSet;
- import android.widget.ImageView;
- import com.xyt.yangguangchufang.R;
- public class CircleImageView extends ImageView {
- private static final Xfermode MASK_XFERMODE;
- private Bitmap mask;
- private Paint paint;
- private int mBorderWidth = 10;
- private int mBorderColor = Color.parseColor("#f2f2f2");
- static {
- PorterDuff.Mode localMode = PorterDuff.Mode.DST_IN;
- MASK_XFERMODE = new PorterDuffXfermode(localMode);
- }
- public CircleImageView(Context paramContext) {
- super(paramContext);
- }
- public CircleImageView(Context paramContext, AttributeSet paramAttributeSet) {
- this(paramContext, paramAttributeSet, 0);
- }
- public CircleImageView(Context paramContext, AttributeSet paramAttributeSet, int paramInt) {
- super(paramContext, paramAttributeSet, paramInt);
- TypedArray a = paramContext.obtainStyledAttributes(paramAttributeSet, R.styleable.CircularImage);
- mBorderColor = a.getColor(R.styleable.CircularImage_border_color, mBorderColor);
- final int defalut = (int) (2 * paramContext.getResources().getDisplayMetrics().density + 0.5f);
- mBorderWidth = a.getDimensionPixelOffset(R.styleable.CircularImage_border_width, defalut);
- a.recycle();
- }
- private boolean useDefaultStyle = false;
- public void setUseDefaultStyle(boolean useDefaultStyle) {
- this.useDefaultStyle = useDefaultStyle;
- }
- @Override
- protected void onDraw(Canvas paramCanvas) {
- if (useDefaultStyle) {
- super.onDraw(paramCanvas);
- return;
- }
- final Drawable localDrawable = getDrawable();
- if (localDrawable == null)
- return;
- if (localDrawable instanceof NinePatchDrawable) {
- return;
- }
- if (this.paint == null) {
- final Paint localPaint = new Paint();
- localPaint.setFilterBitmap(false);
- localPaint.setAntiAlias(true);
- localPaint.setXfermode(MASK_XFERMODE);
- this.paint = localPaint;
- }
- final int width = getWidth();
- final int height = getHeight();
- /** 保存layer */
- int layer = paramCanvas.saveLayer(0.0F, 0.0F, width, height, null, 31);
- /** 设置drawable的大小 */
- localDrawable.setBounds(0, 0, width, height);
- /** 将drawable绑定到bitmap(this.mask)上面(drawable只能通过bitmap显示出来) */
- localDrawable.draw(paramCanvas);
- if ((this.mask == null) || (this.mask.isRecycled())) {
- this.mask = createOvalBitmap(width, height);
- }
- /** 将bitmap画到canvas上面 */
- paramCanvas.drawBitmap(this.mask, 0.0F, 0.0F, this.paint);
- /** 将画布复制到layer上 */
- paramCanvas.restoreToCount(layer);
- drawBorder(paramCanvas, width, height);
- }
- /**
- * 绘制最外面的边框
- *
- * @param canvas
- * @param width
- * @param height
- */
- private void drawBorder(Canvas canvas, final int width, final int height) {
- if (mBorderWidth == 0) {
- return;
- }
- final Paint mBorderPaint = new Paint();
- mBorderPaint.setStyle(Paint.Style.STROKE);
- mBorderPaint.setAntiAlias(true);
- mBorderPaint.setColor(mBorderColor);
- mBorderPaint.setStrokeWidth(mBorderWidth);
- /**
- * 坐标x:view宽度的一般 坐标y:view高度的一般 半径r:因为是view的宽度-border的一半
- */
- canvas.drawCircle(width >> 1, height >> 1, (width - mBorderWidth) >> 1, mBorderPaint);
- canvas = null;
- }
- /**
- * 获取一个bitmap,目的是用来承载drawable;
- * <p>
- * 将这个bitmap放在canvas上面承载,并在其上面画一个椭圆(其实也是一个圆,因为width=height)来固定显示区域
- *
- * @param width
- * @param height
- * @return
- */
- public Bitmap createOvalBitmap(final int width, final int height) {
- Bitmap.Config localConfig = Bitmap.Config.ARGB_8888;
- Bitmap localBitmap = Bitmap.createBitmap(width, height, localConfig);
- Canvas localCanvas = new Canvas(localBitmap);
- Paint localPaint = new Paint();
- final int padding = mBorderWidth - 3;
- /**
- * 设置椭圆的大小(因为椭圆的最外边会和border的最外边重合的,如果图片最外边的颜色很深,有看出有棱边的效果,所以为了让体验更加好,
- * 让其缩进padding px)
- */
- RectF localRectF = new RectF(padding, padding, width - padding, height - padding);
- localCanvas.drawOval(localRectF, localPaint);
- return localBitmap;
- }
- }
xml布局:
- <com.xyt.ygcf.widget.CircleImageView
- xmlns:myxmlns="http://schemas.android.com/apk/res/com.xyt.yangguangchufang"
- android:id="@+id/fragment_my_image_user"
- android:layout_width="110dp"
- android:layout_height="110dp"
- android:layout_marginBottom="10dp"
- android:contentDescription="@null"
- android:scaleType="centerCrop"
- myxmlns:border_width="@dimen/circle_width"
- myxmlns:border_color="@color/f2f2f2"
- android:src="@drawable/ic_my_avar_unlogin" />
attr文件:
- <declare-styleable name="CircularImage">
- <attr name="border_width" format="dimension" />
- <attr name="border_color" format="color" />
- </declare-styleable>
抽空还要认真研究一下canvas,理解还不是太深刻。
关于Android圆形图片的一种优化方案(可以显示网络图片)的更多相关文章
- Android圆形图片自定义控件
Android圆形图片控件效果图如下: 代码如下: RoundImageView.java package com.dxd.roundimageview; import android.content ...
- Android圆形图片--自己定义控件
Android圆形图片控件效果图例如以下: 代码例如以下: RoundImageView.java package com.dxd.roundimageview; import android.con ...
- 查询效率提升10倍!3种优化方案,帮你解决MySQL深分页问题
开发经常遇到分页查询的需求,但是当翻页过多的时候,就会产生深分页,导致查询效率急剧下降. 有没有什么办法,能解决深分页的问题呢? 本文总结了三种优化方案,查询效率直接提升10倍,一起学习一下. 1. ...
- android绘制圆形图片的两种方式
看下效果先 下面有完整的示例代码 使用BitmapShader(着色器) 我们在绘制view 的时候 就是小学上美术课 用水彩笔在本子上画画 使用着色器绘制圆形图片最简单的理解方式 就是把bitmap ...
- Android圆形图片--ImageView
[ RoundImageView.java ] package com.dxd.roundimageview; import android.content.Context; import andro ...
- Android圆形图片不求人,自定义View实现(BitmapShader使用)
在很多APP当中,圆形的图片是必不可少的元素,美观大方.本文将带领读者去实现一个圆形图片自定View,力求只用一个Java类来完成这件事情. 一.先上效果图 二.实现思路 在定义View 的onMea ...
- 在android中画圆形图片的几种办法
在开发中常常会有一些需求,比方显示头像,显示一些特殊的需求,将图片显示成圆角或者圆形或者其它的一些形状. 可是往往我们手上的图片或者从server获取到的图片都是方形的.这时候就须要我们自己进行处理, ...
- Android 圆形图片加白边加阴影
/** * 将图片准转为圆形 * * @param bitmap * @return */ public static Bitmap getRoundedCornerBitmap(String pat ...
- Android 截取手机屏幕两种实现方案解析
近期在开发的过程中,遇到了一个须要截取屏幕保存为图片的需求,详细为截取webview的视图保存图片. 方法1:首先想到的思路是利用SDK提供的View.getDrawingCache()方法: pub ...
随机推荐
- Intent相关
Intent是什么? 翻译为:意图,目的(名词) 其实根本没必要管它是什么,看看它能做什么就好了. 不过后来我知道了,它就是个机制----通信机制-----android的许多组件间的交流要依赖它. ...
- 设计模式 单件-Singleton
单件模式 Singleton 什么时候使用?当需要独一无二的对象时,请想起他. 举例:线程池(threadpool),缓存(cache),对话框,处理偏好设置和注册表(registry)的对象,驱动程 ...
- map,hash_map和unordered_map 实现比较
map介绍 Map是STL[1]的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处 ...
- 使用iphone5修剪视频的方法
iphone5有很高的视频拍摄质量,这人很多业余爱好者也加入了视频短片的拍摄当中.在拍摄视频的过程中,为了能够捕捉到精彩瞬间,常常会提前拍摄,并延迟结束拍摄,这样就给视频增加了很多无意义的片段.这时, ...
- 深刻理解Python中的元类metaclass(转)
本文由 伯乐在线 - bigship 翻译 英文出处:stackoverflow 译文:http://blog.jobbole.com/21351/ 译注:这是一篇在Stack overflow上很热 ...
- Django 1.6 最佳实践: django项目的服务器自动化部署(转)
原文:http://www.weiguda.com/blog/41/ 当我们设置服务器时, 不应该每次都使用ssh登录服务器, 再按照记忆一步一步的配置. 因为这样实在是太容易忘记某些步骤了. 服务器 ...
- Linux下的sort排序命令详解(一)
1 sort的工作原理 sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出. [zookeeper@master rh]$ cat ...
- OperateParticleWithCodes
[OperateParticleWithCodes] Listing 6-6 shows how you might configure an emitter’s scale property. Th ...
- ESB 客户端调用 处理类
esb package com.isoftstone.synchronize.entrance; import java.io.File; import java.text.SimpleDateFor ...
- oracle出现的小问题
oracle无法解析指定的标识符:检查oracle的数据库实例名是否正确. oracle增大db_files:alter system set db_files=1000 scope=spfile;之 ...