android canvas imageview,android 实现圆形imageView,Circle imageView.

这篇博客介绍了一个自定义的CircleImageView类,用于在Android中显示圆形网络图片。作者通过继承ImageView并修改onDraw方法实现了圆形裁剪。文章提到代码存在轻微毛边问题,尝试使用PaintFlagsDrawFilter进行优化,但效果不理想。作者建议若图片背景为纯色,此问题可忽略。同时,邀请读者分享更好的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

设计给出了一个圆圈形显示网络图片的方案,无奈,程序猿只好写了一个,现共享出来,代码很简单。

类直接继承自ImageView,修改下他的canvas就行了;

package cn.helloclq.android.widget;

import android.content.Context;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.Paint;

import android.graphics.PaintFlagsDrawFilter;

import android.graphics.Path;

import android.graphics.Region;

import android.util.AttributeSet;

import android.widget.ImageView;

/**

*

* android circle imageView

* @author Block Cheng

*

*/

public class CircleImageView extends ImageView {

Path path;

public PaintFlagsDrawFilter mPaintFlagsDrawFilter;// 毛边过滤

Paint paint;

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

super(context, attrs, defStyle);

// TODO Auto-generated constructor stub

init();

}

public CircleImageView(Context context, AttributeSet attrs) {

super(context, attrs);

// TODO Auto-generated constructor stub

init();

}

public CircleImageView(Context context) {

super(context);

// TODO Auto-generated constructor stub

init();

}

public void init(){

mPaintFlagsDrawFilter = new PaintFlagsDrawFilter(0,

Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG);

paint = new Paint();

paint.setAntiAlias(true);

paint.setFilterBitmap(true);

paint.setColor(Color.WHITE);

}

@Override

protected void onDraw(Canvas cns) {

// TODO Auto-generated method stub

float h = getMeasuredHeight()- 3.0f;

float w = getMeasuredWidth()- 3.0f;

if (path == null) {

path = new Path();

path.addCircle(

w/2.0f

, h/2.0f

, (float) Math.min(w/2.0f, (h / 2.0))

, Path.Direction.CCW);

path.close();

}

cns.drawCircle(w/2.0f, h/2.0f, Math.min(w/2.0f, h / 2.0f) + 1.5f, paint);

int saveCount = cns.getSaveCount();

cns.save();

cns.setDrawFilter(mPaintFlagsDrawFilter);

cns.clipPath(path,Region.Op.REPLACE);

cns.setDrawFilter(mPaintFlagsDrawFilter);

cns.drawColor(Color.WHITE);

super.onDraw(cns);

cns.restoreToCount(saveCount);

}

} 原图片:

615f73d9340fe36996871449ff084230.png

a446c49a941800452aa0d947bc861d70.png

放到代码中测试运行

f93704b33486454cd73b3c6c6b8ef2ff.png

说明:该类对图片的裁剪,导致了轻微的毛边出来,采用网络上的方法处理了,效果不佳,详见代码中的filter。

但如果服务器的图片是纯色背景,这个问题就不是问题了。我也不深入研究了,后面还有很重的任务。

另外,裁剪出圆形图片也是利用相似的原理实现。

如果哪位朋友有好的解决方法,欢迎分享给我,万分谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值