Android开发圆形ImageView实现
效果图如下

1、自定义属性,在value文件夹下新建attrs文件,声明如下属性
<declare-styleable name="CircleImageView">
<attr name="border_color" format="color"/>
<attr name="border_width" format="dimension"/>
</declare-styleable>
2、继承ImageView ,重写构造和ondraw方法
public class CircleImageView extends AppCompatImageView {
private int borderColor;
private int borderWidth;
private final static int DEFAULT_COLOR = Color.BLACK;
private final static int DEFAULT_BORDER_WIDTH = 0;
private Paint mPaint;
public CircleImageView(Context context) {
this(context,null);
}
public CircleImageView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs,0);
}
public CircleImageView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
TypedArray typedArray = context.obtainStyledAttributes(attrs,R.styleable.CircleImageView);
borderColor = typedArray.getColor(R.styleable.CircleImageView_border_color, DEFAULT_COLOR);
borderWidth = typedArray.getDimensionPixelSize(R.styleable.CircleImageView_border_width, DEFAULT_BORDER_WIDTH);
borderWidth = dp2px(context,borderWidth);
mPaint = new Paint();
typedArray.recycle();
}
public int dp2px(Context ctx,int dp) {
float scale = ctx.getResources().getDisplayMetrics().density;
return (int) (dp * scale + 0.5);
}
@Override
protected void onDraw(Canvas canvas) {
Drawable drawable = getDrawable();
if (drawable != null && drawable instanceof BitmapDrawable) {
Bitmap bitmap = ((BitmapDrawable)drawable).getBitmap();
Bitmap circleBitmap = getCircleBitmap(bitmap);
Rect srcRect = new Rect(0,0,circleBitmap.getWidth(),circleBitmap.getHeight());
Rect dstRect = new Rect(0,0,getWidth(),getHeight());
mPaint.reset();
canvas.drawBitmap(circleBitmap,srcRect,dstRect,mPaint);
}else {
super.onDraw(canvas);
}
}
private Bitmap getCircleBitmap(Bitmap bitmap) {
Bitmap circleBitmap = Bitmap.createBitmap(bitmap.getWidth(),bitmap.getHeight(),Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(circleBitmap);
mPaint.setAntiAlias(true);
canvas.drawARGB(0,255,255,255);
mPaint.setColor(borderColor);
int radius = bitmap.getWidth() < bitmap.getHeight()? bitmap.getWidth():bitmap.getHeight();
canvas.drawCircle(radius/2,radius/2,radius/2-borderWidth,mPaint);
mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
Rect rect = new Rect(0,0,bitmap.getWidth(),bitmap.getHeight());
canvas.drawBitmap(bitmap,rect,rect,mPaint);
mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OVER));
canvas.drawCircle(radius/2,radius/2,radius / 2,mPaint);
return circleBitmap;
}
}
3、引入CircleImageView
<com.mydemo.view.CircleImageView
android:layout_width="100dp"
android:layout_height="100dp"
android:src="@drawable/logo"
app:border_color="#ffff00"
app:border_width="1dp"
/>
Android开发圆形ImageView实现的更多相关文章
- Android CircleImageView圆形ImageView
Android CircleImageView圆形ImageView CircleImageView是github上一个第三方开源的实现圆形ImageView的项目.其在github上的项目主页 ...
- [转]android 自定义圆形imageview控件
android布局 首先,定义定义圆形Imageview类: import android.content.Context; import android.graphics.Bitmap; imp ...
- Android开发入门——ImageView的设置
在熟悉了android后,总是对系统自带的ic_launcher这个小机器人不太喜欢,想换成自己喜欢的图片,接下来就介绍两种方法来实现把imageView的ic_launcher换成自己喜欢的图片. ...
- Android开发----EditText&ImageView&第三方库的加载
EditText组件 一个实例描述该组件的全部属性(虚假的登录界面) 在activity.xml中 <?xml version="1.0" encoding="ut ...
- Android开发:ImageView阴影和图层效果
import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import ...
- Android开发之自定义圆形的ImageView的实现
android中的ImageView只能显示矩形的图片,这样一来不能满足我们其他的需求,比如要显示圆形的图片,这个时候,我们就需要自定义ImageView了,其原理就是首先获取到图片的Bitmap,然 ...
- Android开发之制作圆形头像自定义View,直接引用工具类,加快开发速度。带有源代码学习
作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 QQ986945193 博客园主页:http://www.cnblogs.com/mcxiaobing ...
- Android开发之自定义圆角矩形图片ImageView的实现
android中的ImageView只能显示矩形的图片,这样一来不能满足我们其他的需求,比如要显示圆角矩形的图片,这个时候,我们就需要自定义ImageView了,其原理就是首先获取到图片的Bitmap ...
- Android开发ImageView控件缩放图片
首先还是最基础的ImageView控件如何显示图片: <ImageView Android:id="@+id/imgView" ...
随机推荐
- 计蒜客 疑似病毒 (AC自动机 + 可达矩阵)
链接 : Here! 背景 : 开始我同学是用 AC自动机 + DP 的方法来做这道题, 这道题的标签是 AC自动机, 动态规划, 矩阵, 按道理来说 AC自动机 + DP 应该是能过的, 但是他不幸 ...
- 洛谷——P1183 多边形的面积
P1183 多边形的面积 多边形求面积公式: $\frac {\sum_{i=0}^{n-1}(x_iy_{i+1}-y_ix_{i+1})}{2}$ #include<bits/stdc++. ...
- [bzoj3207]花神的嘲讽计划Ⅰ[可持久化线段树,hash]
将每k个数字求一个哈希值,存入可持久化线段树,直接查询即可 #include <iostream> #include <algorithm> #include <cstd ...
- cogs 259. 亲戚
259. 亲戚 ★ 输入文件:relations.in 输出文件:relations.out 简单对比时间限制:1 s 内存限制:128 MB [问题描述] 或许你并不知道,你 ...
- AutoCAD 2014:安装时发生allied product not found错误
有个朋友在安装AutoCAD 2014时不慎误删了一个文件夹,结果导致安装AutoCAD时总是跳出”allied product not found”的错误. Google搜了下,解决方案如下: 1. ...
- android weight(权重)的详细分析
首先要明确权重分配的是那些空间? 权重是依照比例分配屏幕的剩余空间 对这句话不理解的能够看下图 假如我们希望剩余的空间平分给空间1 和空间2 , 我们分别在2个控件的设置android:layout_ ...
- 最新版本号cocos2d­2.0­x­2.0.2使用新资源载入策略!不再沿用-hd、-
前段时间cocos2dx更新了最新版本号cocos2d2.0x2.0.2.也从这个版本号開始对于资源载入与管理都改变了策略. 在之前的载入方式都是通过沿用与cocos2d-iphone一样 ...
- wpf 样式的调用
这个针对异地调用: 1.在主程序的项目中新建一个Skins的目录.然后再目录里新建一个BlackSkin.xaml的字典资源: <ResourceDictionary xmlns="h ...
- C++高精度性能測试函数
在实际software开发工作中.我们常常会測试某个module或者function的执行效率.或者是某个算法的时间复杂度(尽管时间复杂度一定程度上依赖于机器性能.但在同一台computer上,经过算 ...
- Windowns 无法启动 Office Software Protection Platform 服务,系统找不到指定的文件
导致该服务无法启动的原因是,用kms8激活了win7后又用oem8激活试了下,结果就这样,然后就无法激活了,状态ID都不可用.试过禁用计划任务项目,重建MBR,重建PBR,都无效果.最后在这里找到了解 ...