自定义圆角ImageView

Android自定义圆角ImageView 支持网络图片 先看下效果图                        我们再来看一张优快云的圆角图片                           从布局可以看出csdn app 的头像也是圆角的Image,但可以看到,有明显的毛刺感,不知道是csdn 程序员的疏忽还是 我手机的问题,本人手机(小米note)。不知道其他的小伙伴显示效果也是这样。              好回 阅读详情

在Android开发的过程中,我们常常需要显示不同形状的图片(圆角、或圆形等),而网上的很多例子都是直接使用集成View然后重写onDraw的方法去实现,这样的方式固然简单直接,但这样做的话会失去很多重要实用的ImageView特性(例如:scaletype)。因此,本文旨在举出下面例子,展示自定义圆角ImageView的基本方法和原理。


XMl布局代码:

<span style="font-family:Microsoft YaHei;font-size:14px;"><?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#000000"
    android:orientation="vertical" >
    

<ImageView
    android:id="@+id/imageView"
    android:layout_width="200dp"
    android:layout_height="200dp"
    android:layout_gravity="center"
    android:src="@drawable/bg_00"/>

<com.example.component.ShapeImageView
    android:id="@+id/shapeImageView"
    android:layout_width="200dp"
    android:layout_height="200dp"
    android:layout_gravity="center"
    android:src="@drawable/bg_00"/>


</LinearLayout>
</span>


Java代码:

<span style="font-family:Microsoft YaHei;font-size:14px;">public class ShapeImageView extends ImageView {
	public static final String TAG = "ShapeImageView";

	public static final int RECTANGLE= 0;
	public static final int ROUND_RECTANGLE = 1;
	public static final int CIRCLE = 2;

	/**圆角矩形的四角弧度,单位是像素*/
	private static final int RADIUS_X = 20;
	private static final int RADIUS_Y = 20;

	private Bitmap mShapeBmp=null;
	private BitmapDrawable mBmpDrawable = null;
	private int mShape = ROUND_RECTANGLE;
	private int mRadiusX = RADIUS_X;
	private int mRadiusY = RADIUS_Y;

	private int mWidth;
	private int mHeight;


	//paint的遮罩层,canvas在绘制原图和下一张图时,两者的交互绘制模式(相交、合并、异或等)
	private PorterDuffXfermode xfermode=new PorterDuffXfermode(PorterDuff.Mode.SRC_IN);
	//Paint的标识绘制过滤器,用于设置图片绘制的抗锯齿效果
	private PaintFlagsDrawFilter pdf=new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG);


	public ShapeImageView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
	}

	public ShapeImageView(Context context, AttributeSet attrs) {
		super(context, attrs);
	}

	public ShapeImageView(Context context) {
		super(context);
	}

	public int getShape() {
		return mShape;
	}

	public void setShape(int mShape) {
		this.mShape = mShape;
	}

	public int getRadiusX() {
		if(mShape == ROUND_RECTANGLE)
			return mRadiusX;
		else
			return 0;
	}

	public int getRadiusY() {
		if(mShape == ROUND_RECTANGLE)
			return mRadiusY;
		else
			return 0;
	}


	/**
	 * 设置圆角矩形的弧度(当shape=ROUND_TANGLE才有效)
	 * @param mRadiusX
	 */
	public void setRadius(int radiusX, int radiusY) {
		if(mShape == ROUND_RECTANGLE){
			this.mRadiusX = radiusX;
			this.mRadiusY = radiusY;
		}
	}

	/**
	 * 生成几何蒙版bitmap,即创建图片想要的几何形状(圆角、圆形等)的底板,用于与原图相交绘制
	 * @param w
	 * @param h
	 * @return
	 */
	private Bitmap getShapeBitmap(int width, int height, Bitmap bitmapSrc, int shape) 
	{
		float widthScaleRatio, heightScaleRatio;//缩放比例,用于缩放圆角,使显示的圆角总是XY半径相等
		int bmpSrcWidth = bitmapSrc.getWidth();
		int bmpSrcHeight = bitmapSrc.getHeight();
		Bitmap bmpDst = Bitmap.createBitmap(bmpSrcWidth, bmpSrcHeight, Config.ARGB_8888);//创建蒙板bitmap
		Canvas canvas = new Canvas(bmpDst);//创建蒙板画布
		Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);//创建透明抗锯齿画笔
		p.setColor(Color.parseColor("#ffffffff")); 

		widthScaleRatio = (1.0f*bmpSrcWidth)/(1.0f*width);//原图与目标bounds的缩放比例
		heightScaleRatio = (1.0f*bmpSrcHeight)/(1.0f*height);
		canvas.setDrawFilter(pdf);
		
		//根据shape值绘制不同的几何蒙版
		switch (shape) {
		case ROUND_RECTANGLE:
			canvas.drawRoundRect(new RectF(0,0,bmpSrcWidth,bmpSrcHeight), 
					mRadiusX*widthScaleRatio, mRadiusY*heightScaleRatio, p);//绘制蒙版bitmap(PS:圆角的半径的单位是像素)
			break;
		case CIRCLE:
			canvas.drawOval(new RectF(0,0,bmpSrcWidth,bmpSrcHeight), p);//绘制蒙版bitmap(PS:圆角的半径的单位是像素)
			break;
		default:
			break;
		}
		
		p.setXfermode(xfermode);
		canvas.drawBitmap(bitmapSrc, null, new RectF(0,0,bmpSrcWidth, bmpSrcHeight), p);//绘制原图并相交得出最终圆角图片
		p.setXfermode(null);

		return bmpDst;
	}
	


	@Override
	protected void onDraw(Canvas canvas) {

		if(getDrawable() instanceof BitmapDrawable && getDrawable()!=null){
			mBmpDrawable = (BitmapDrawable) getDrawable();
			if(!mBmpDrawable.getBitmap().equals(mShapeBmp)){
				mWidth = getWidth();
				mHeight = getHeight();
				mShapeBmp = getShapeBitmap(mWidth,mHeight, mBmpDrawable.getBitmap(), mShape);
				BitmapDrawable drawable = new BitmapDrawable(mShapeBmp);
				setImageDrawable(drawable);
				return;
			}

		}

		super.onDraw(canvas);
	}


}</span>


实现原理:

1.绘制与原图同样大小的几何蒙板

2.在该蒙板上绘制原图,并利用paint对象的PorterDuffXfermode图层交互特性,仅绘制出原图与蒙版相交的区域



相比继承View的方法,这种方法比较大的好处在于,当我们需要静态设置图片的时候,只需要在XML布局文件中相应的src属性上添加,而免去了要在java代码中手动设置的麻烦,减少了代码的耦合度,同时还能享受原来ImageView的各种特性。


由于模拟器最近出了点问题,图片就不贴了,大家使用这种方法试试看,相互学习交流。

实现自定义圆角imageView, 抗锯齿 继承。 阅读详情

相关推荐

Android 自定义组件实现圆角ImageView

/这里做下判断,只有图片的宽高大于设置的圆角距离的时候才进行裁剪。//如果四个角的值没有设置,那么就使用通用的radius的值。//四个角:右上,右下,左下,左上。

2401_89173830的博客 879

Android ImageView 圆角实现

Android开发过程中,ImageView是必不可少的几种控件之一,通常为了美观,图标等内容会设置为圆角,以下简单总结了几种设置圆角的方法。RoundImageView为第三方库,在build.gradle(:app)中使用以下语句导入: 该控件使用起来也非常方便,圆角设置为10dp示例如下: 效果如下: 2. CardView CardView为Android系统自带控件,使用CardView包裹ImageView也可以实现圆角效果,需要注意的是,CardView有可能会影响到控件层级,可以通过设置避

Misdirection_XG的博客 7261

Android自定义圆角ImageView

废话不多说了,直接给大家贴代码了。 java类如下: import android.content.Context; import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Path; impor

Android自定义ImageView(实现可自定义四个圆角角度)

1. 自定义SelectableRoundedImageView类,代码如下: package com.dfhx.project.myview; import android.annotation.SuppressLint; import android.content.Context; import android.content.res.ColorStateList; import a...

JiYaRuo的博客 1711

从驱动编译到数据传输:RK3588与FPGA的PCIe通信实战解析

本文详细解析了RK3588与FPGA通过PCIe通信的实战过程,涵盖驱动编译、数据传输及性能优化等关键步骤。通过XDMA驱动实现高效DMA传输,适用于视频处理、数据采集等高性能场景,帮助开发者快速掌握嵌入式系统中的PCIe通信技术。

weixin_29214691的博客 521

OrangePi Kunpeng Pro 安装 ROS2 + Gazebo

OrangePi Kunpeng Pro 的优点很明显,内置openEuler,配备PD电源,做到开箱即用;板子设计也不错,风扇噪音不大,散热良好,昇腾芯片又确保小板子的性能,接口丰富是这类板子共同的优点,也很好的继承了下来,甚至还可以外接固态,可靠性大大提升。使用起来,哪怕不用openEuler的话,也可以很方便的刷Ubuntu来实现一些需要依赖的开发工作,这次没有跑AI模型,所以对算力的优势还没有很明显的感受,下次可以试一下yolo跑跑看。

Arcan 1822

Android自定义ImageView圆角

在Android项目中经常遇见圆角的图片的展示问题,但是很可惜,Android中的imageView并不是原生就支持圆角的,那么在Android中实现展示圆角图片的方式有几种呢?这里笔者大致总结一下分为以下几种以上,其中2/3是借助其他图片加载库实现,1是需要自行实现ImageView中圆角的绘制函数,4需要布局多一层嵌套。 按照最简单的做法这里推荐使用CardView的方式实现圆角。但是有时候UI设计师的设计图总是不是很如开发的口味,会出现上边需要圆角,底部无圆角的设计需求,那么这是时候,直接使用自定义I

涛的博客 3732

STM32F407+HAL库+W5500实现TCP通讯 个人项目总结

推荐阅读此博客 cv即可成功首先需要一个可以进行串口调试的工程,方便进行调试。1.在W5500官网移植库文件重点是Ethernet这个文件夹将里面的 socket.c,socket.h,wizchip_conf.c,wizchip_conf.h,还有根据W5500文件夹里的w5500.c和w5500.h移植到自己的工程里面。然后再创建一个.c和.h文件 我的叫w5500_port_hal.c 和w5500_port_hal.h 记得将.h文件链接到工程里。

a234abr的博客 2246

自定义ImageView圆角

自定义ImageView为圆角的效果图: 代码实现:   public class BannerRadiusImageView extends android.support.v7.widget.AppCompatImageView { private float mRadus = getContext().getResources().getDimensionPixelSi...

LXFX1108的专栏 704

人工智能训练师三级补贴3120元申领全攻略|条件+流程+五省市对比

补贴是真的,但不是"白给"的。你需要满足社保、户籍、时间等条件,严格按照流程操作。记住四件事先确认自己是否满足条件,再报名——别考完了才发现领不到紧缺工种补贴更高——确认你所在城市是否在紧缺目录中证书下发后12个月内申请——设个日历提醒材料准备齐全再提交——避免来回折腾如果你正在考虑考人工智能训练师三级证书,想要从报名到备考到拿证到申领补贴的完整一站式指南,欢迎查看我的付费专栏:📖《人工智能训练师三级·从零到拿证完全指南》80篇系统化内容,覆盖报名、备考、冲刺、拿证全流程。

白话机器学习 1519

目标检测YOLO实战应用案例100讲-基于YOLOv7的番茄采摘机械手场景感知及试验(下)

根据软件系统的设计需求,制定系统的可行性方案分析,编写系统的相关程序和 调试运行环境,对系统进行测试,以实现对番茄数据的采集及监测。登陆界面登陆后,进入选择界面,菜单包括了对番茄种植棚室的固定相机数据的监测、 对番茄采摘机械手的双目相机采集的番茄的静态、动态数据的获取、对番茄静态、动态数 据处理的功能菜单等选项。与利用人工去进行对于番茄果实的识别和数目的统计相比,番茄视觉系统自动记录番 茄数量以及红色已经成熟的番茄、青色未成熟番茄的数量,减轻人工记录的工作量,减少 人工记录的误差,从经济方面是可行的。

qq_36130719的博客 811

Android 自定义ImageView实现圆角

自定义圆角imageview

liuqinhou的博客 5133

把外部系统一键装进 SAP Build Work Zone:从零开始创建 HTML5 URL App

HTML5 URL App 是一种轻量级解决方案,可将外部网页或系统入口快速集成到SAP企业门户中。开发者只需在manifest.json中配置目标URL、导航模式等参数,无需开发完整前端应用。该方案利用SAP BTP的HTML5 Application Repository集中存储静态资源,通过HTML5 Apps Content Provider将应用暴露给子账号,最终在SAP Build Work Zone中以Fiori磁贴形式呈现。文章详细介绍了manifest.json的关键配置、三种基础设施组件

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 240

自定义圆角ImageVIew

今天继续写写博客,坚持下去懒癌是有救的。这个控件可以给图片带上圆角矩形或者圆形效果,并可以设置外带的边框。废话少说,先看看事例图: 上面两个就是正圆和圆角矩形的效果啦。它会自动缩放图片使之中心对齐铺满。 下面是写在属性文件里的自定义属性,边框颜色,边框大小,图片,是否是圆形,圆角值:

huangmayi的专栏 2497

Openlayers 教程 02 - 地图添加 WKT WKB GeoJson 格式的点线面数据

WebGIS 开发中,对于数据量不是很大的场景,可以直接从数据库读取数据,通过创建点线面要素(Feature),然后添加到矢量图层(vectorLayer)中,在地图上展示。添加点线面的方法可以封装一下,方便使用。...

非科班Java出身GISer的博客 3854

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

自定义ImageView 圆角shape

/**  *  * 转载请标明出处:http://blog.youkuaiyun.com/u013598111/article/details/50208349  *   @author:【JunTao_sun】  *  * */ package com.example.imageview; import android.content.Context; import

u013598111的专栏 2805

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

自定义ImageView实现圆角图片

自定义ImageView实现圆角图片,满足以下需求: 1、四个角的度数均要支持自定义 2、可以在布局当中添加自定义的度数 实现步骤: 1、自定义一个ImageView,继承自AppCompatImageView。 (关于AppCompatImageView,继承自ImageView,是一个在平台的旧版本上支持兼容功能的imageView。) 实现它的构造方法,创建一个init()方法,保证构造方法...

zdj_Develop的博客 626

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

一个简单的自定义圆角ImageView

最近在学自定义View的过程,然后想到有个很常用的圆形头像View,想自己动手实现一下,以为自己应该可以实现一个简单的圆角ImageView,真正写起来才发现还有很多知识点不懂。起初的思路是想把图片画上去然后扣个圆出来,然后发现图片画上去了不知道怎么扣,这就很尴尬了。最终实在不行就跟着鸿洋大神的文章实现了一个,看完才发现,卧槽,还能这样。果然是基础不够哇。下面是文章的链接,实现过程代码 ...

小仓猪的博客 1582

自定义带圆角的ImageView

最近有一个实现一个带有圆角的ImageView的需求,在网上找了找三方,虽然Demo都是正确的,但是移植过来就不可以了,因为请求链接的时候用的是xUtils中Bitmap来进行解析的,这样就总是会报类型转换异常的错误. 就这样只能自己定义一个了. Demo: package com.yizooo.yizooo.ui; import android.content.Context; imp

锲而不舍 878

超简单的自定义ImageView,支持圆角和直角

1、需求:ImageView显示的图片,上方的两个角是圆角,下方的两个角是直角。 2、这篇文章推荐了三种方式,我选择第三种ClipPath方式,这种方式很精简。 参考:https://www.jianshu.com/p/626dbd93207d 3、先来总结下自定义ImageView需要实现的功能: ①四个角的度数均要支持自定义 ②可以在xml布局当中添加自定义的度数 4、

tinyVampire的博客 4万+

android自定义一圆角imageview,Android自定义ImageView实现圆角功能

使用自定义imageview,实现圆角功能,供大家参考,具体内容如下1.自定义属性attrs.xml2.自定义roundcornerimageview,继承appcompatimageviewpublic class roundcornerimageview extends appcompatimageview {private float width, height;private int de...

weixin_35231842的博客 2476

Android 自定义圆角ImageView

方法中绘制一个圆角矩形的剪裁路径,然后将绘制内容限制在该路径内。在布局文件中使用自定义的RoundCornerImageView。并不支持圆角的显示。,实现了只有左上,右上两个角为圆角的效果。通过以上步骤,我们就可以实现一个带有圆角的。类来绘制圆角矩形的剪裁路径,并使用。在这个例子中,我们使用了一个半径为。的圆角矩形,其中前四个角的半径都是。这个例子中,我们使用了自定义的。开发中,我们经常会使用。来显示图片,但是默认的。,而后四个角的半径都是。,并设置了宽度和高度为。,使用了一张图片作为。

YDHIT的博客 677
上一篇: Android中的Surface和SurfaceView
下一篇: android开发内存泄露分析
angusing
博客等级 码龄15年 11粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值