Android实现自定义圆形/圆角ImageView

Android 自定义ImageView实现圆角/圆形 附加OnTouchListener详细注释以及Button圆角 转载请注明出处:王亟亟的大牛之路平时要用一些非方方正正的按钮之类的小伙伴们是如何实现的?RadioButton?ImageButton?还是其他? 今天亟亟上的是ImageView来实现的 先上下效果图(目录结构) 分析:shape.xml用于Button的”倒角”(做过机械类的都懂,哈哈) attr.xml用于自定义ImageView的标签的定义 ids.xml用于控件findbyid用 阅读详情

在进行开发的时候有时候会有对圆形ImageView的需求,然后当我搜索网上现有博客的方法去实现的时候发现实现的效果总是不尽如人意:有的无法实现图片的缩放;有的Xfermode的DST_IN无效,无法实现效果(具体原因并没有搞清楚,好像是new canvas的时候必须将bitmap传入)。于是对网上的例子进行了一定修改,有不足的地方还望指正。

该ImageView可实现圆角、圆形图片显示,并可以自定义圆角半径。首先我们来看一下实现效果:


首先介绍一下Xfermode的几种图片合成方式:

1.PorterDuff.Mode.CLEAR

所绘制不会提交到画布上。
2.PorterDuff.Mode.SRC

显示上层绘制图片
3.PorterDuff.Mode.DST

显示下层绘制图片
4.PorterDuff.Mode.SRC_OVER

正常绘制显示,上下层绘制叠盖。
5.PorterDuff.Mode.DST_OVER

上下层都显示。下层居上显示。
6.PorterDuff.Mode.SRC_IN

取两层绘制交集。显示上层。
7.PorterDuff.Mode.DST_IN

取两层绘制交集。显示下层。
8.PorterDuff.Mode.SRC_OUT

取上层绘制非交集部分。
9.PorterDuff.Mode.DST_OUT

取下层绘制非交集部分。
10.PorterDuff.Mode.SRC_ATOP

取下层非交集部分与上层交集部分
11.PorterDuff.Mode.DST_ATOP

取上层非交集部分与下层交集部分
12.PorterDuff.Mode.XOR
13.PorterDuff.Mode.DARKEN
14.PorterDuff.Mode.LIGHTEN
15.PorterDuff.Mode.MULTIPLY
16.PorterDuff.Mode.SCREEN


这里我们将要用到的是SRC_IN,将会在后面的代码中见到它。


接下来看一下工程目录结构:

CustomImageView实现:

首先我们先自定义两个参数imageType和radius,imageType是个枚举类型:circle、round、normal,分别实现圆形、圆角和正常图片的显示,并在Java文件中定义好。

<resources>
    <attr name="imageType">
        <enum name="normal" value="0" />
        <enum name="round" value="1" />
        <enum name="circle" value="2" />
    </attr>

    <declare-styleable name="CustomImageView">
        <attr name="imageType" />
        <attr name="radius" format="dimension" />
    </declare-styleable>
</resources>
public static final int NORMAL = 0;
public static final int ROUNDREC = 1;
public static final int CIRCLE = 2;

接下来我们在控件构造的时候读取出imageType和radius,同时进行一些必要的初始化操作:

final TypedArray a = getContext().obtainStyledAttributes(
        attrs, R.styleable.CustomImageView, defStyle, 0);


if (a.hasValue(R.styleable.CustomImageView_imageType)) {
    imageType = a.getInt(
            R.styleable.CustomImageView_imageType, 0);
}

mRadius = a.getDimension(R.styleable.CustomImageView_radius, 20);

if (null != getDrawable()) {
    mSrc = (((BitmapDrawable) getDrawable()).getBitmap());
}

a.recycle();

mPaint = new Paint();
mPaint.setFlags(Paint.ANTI_ALIAS_FLAG);
mPaint.setColor(Color.BLACK);
mPaint.setTextSize(80);

invalidate();

因为实现圆形需要保证imageview是正方形的,所以我们要重写onmeasure()方法:

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int mode = MeasureSpec.getMode(widthMeasureSpec);
    int size = MeasureSpec.getSize(widthMeasureSpec);
    if (mode == MeasureSpec.EXACTLY) {
        mWidth = size;
    } else {
        mWidth = getPaddingLeft() + getPaddingRight() + mSrc.getWidth();
        if (mode == MeasureSpec.AT_MOST) {
            mWidth = Math.min(mWidth, size);
        }
    }

    mode = MeasureSpec.getMode(heightMeasureSpec);
    size = MeasureSpec.getSize(heightMeasureSpec);
    if (mode == MeasureSpec.EXACTLY) {
        mHeight = size;
    } else {
        mHeight = getPaddingTop() + getPaddingBottom() + mSrc.getHeight();
        if (mode == MeasureSpec.AT_MOST) {
            mHeight = Math.min(mHeight, size);
        }
    }
    if (CIRCLE == imageType) {
        int min = Math.min(mWidth, mHeight);
        setMeasuredDimension(min, min);
    } else
        setMeasuredDimension(mWidth, mHeight);
}

最后是图形的绘制:

@Override
protected void onDraw(Canvas canvas) {

    int paddingLeft = getPaddingLeft();
    int paddingTop = getPaddingTop();
    int paddingRight = getPaddingRight();
    int paddingBottom = getPaddingBottom();

    int contentWidth = getWidth() - paddingLeft - paddingRight;
    int contentHeight = getHeight() - paddingTop - paddingBottom;

    RectF ovalRect = new RectF(paddingLeft, paddingTop, contentWidth, contentHeight);

    switch (imageType) {
        case NORMAL:
            canvas.drawBitmap(mSrc, new Rect(0, 0, mSrc.getWidth(), mSrc.getHeight()), ovalRect, mPaint);
            break;
        case ROUNDREC:
            canvas.drawBitmap(tranformBitmap(mSrc,ROUNDREC,mRadius), new Rect(0, 0, mSrc.getWidth(), mSrc.getHeight()), ovalRect, mPaint);
            break;
        case CIRCLE:
            canvas.drawBitmap(tranformBitmap(mSrc,CIRCLE,0), new Rect(0, 0, mSrc.getWidth(), mSrc.getHeight()), ovalRect, mPaint);
            break;
    }

}

这其中有个特别重要的方法是

tranformBitmap(Bitmap bitmap, int imageType, float mRadius)

这个方法将bitmap转成圆形或圆角bitmap:

public static Bitmap tranformBitmap(Bitmap bitmap, int imageType, float mRadius) {

    Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);

    Canvas canvas = new Canvas(output);


    final Paint paint = new Paint();

    final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());

    final RectF rectF = new RectF(rect);


    paint.setAntiAlias(true);


    if (imageType == CIRCLE) {
        canvas.drawOval(rectF, paint);
    } else {
        canvas.drawRoundRect(rectF,mRadius,mRadius,paint);
    }

    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));

    canvas.drawBitmap(bitmap, rect, rect, paint);
    return output;

}

demo的下载地址: http://download.youkuaiyun.com/detail/piyell/9459709


Android 圆角圆形ImageView(超简单实现) 前言:今天偶然看到我之前写过的一篇博客 Android项目中遇到的坑之(Android圆角圆形图 一),我在想,这不就是在模仿ImageView么,我为什么要模仿,直接拿来用不是更好么?我能直接在ImageView的源码上去改改代码? 于是就有了下面这篇文章了。先上一张效果图:效果还是很不错的,代码更简单哦~~~ 但凡搞过android的童鞋一定都知道ImageView,既然ImageView已经处 阅读详情

相关推荐

Android自定义圆角ImageView 支持网络图片

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

源码有毒的专栏 6511

Android利用SRC_IN模式下的Xfermode实现圆角图片

圆角图片.jpg 首先准备两张图片 xyjy6.png 查看原图才能看清 shade.png Xfermode中SRC_IN模式是利用目标图片的透明度对原图片的透明度进行处理,目标图片透明度越低,相应的原图的透明度也越低 private Bitmap bitmapSrc; private Bitmap bitmapDst; private Paint ...

aruba的博客 381

android自定义view-打造圆形ImageView(一)

前言: 大家在很多应用不难发现,用户的头像那一块的imageview是圆形的,可是我们并没有现成的圆形ImageView调用,那么最常见的思路就是自己去写一个属于自己的圆形ImageView,基于这样的出发点,今天我们就自己动手去写一个圆形ImageView方便日后直接使用。为什么标题会有(一)呢,其实打造圆形ImageView,我能想到的有三种方式, BitmapShader(渲染器

SmartIceberg的博客 1万+

ImageView之android:tint=" "属性方法作用详解

目 录(本篇字数:694) 介绍 案例代码 属性方法介绍 android:tint="@android:color/white" android:tintMode="src_in" 应用场景 介绍 ImageView,它是一个对于我们Android初学者来说最先接触与学习的控件之一。虽说它的使用方法很简单。...

weixin_33895475的博客 768

Android自定义圆角/圆形控件

开发中我们经常会需要把一张图片进行圆角处理或者显示一个圆形图片,而Android的ImageView显然无法满足我们的需求,这时候我们就需要自定义控件来完成。阅读完本篇博客你可以Get到以下内容: 实现圆角图片的ImageView 实现圆形图片的ImageView 在自定义控件中使用自定义属性 那么我们首先看下效果:1、圆角图片 2、圆形图片 接下来我们开始一步一步去实现:1、我们首先创建一个R

怜星的博客 1590

Android中圆形和圆角ImageView的实现方法

在Android中,可以通过XML定义一个shape作为资源,再将其设置为ImageView的背景,从而实现圆形ImageView。以下是具体操作步骤:创建一个名为shape圆形.xml的资源文件,并将其放置在目录下:</shape>在这个文件中,我们定义了一个形状,宽度和高度都设为100dp,并且有50dp的圆角半径,通过<solid>标签设置了填充颜色。在ImageView中引用这个形状作为背景:<ImageView。

weixin_29138345的博客 1419

Android 圆形 ImageView

公司最近项目,需求上,需要添加圆形的ImageView,最开始的思路是用Canvas.clipPath 来实现圆形,基本上能实现,但是却出现了锯齿,用了很多方法(包括在百度搜索很多demo,都是一样)却始终解决不了切割Canvas出现的锯齿,如果有哪位大神看见这篇文章请指点一下,谢谢! 言归正传,那么如何实现一个锯齿,同时比较圆润的圆形ImageView呢?先看看第一步实现的效果图:

wushu2011的专栏 2508

HybridCLR热更新全流程实操:用Addressables实现资源+代码双热更(Unity 2021版)

本文详细介绍了在Unity 2021 LTS版本中,如何结合HybridCLR代码热更新与Addressables资源管理系统,实现资源与代码的双热更解决方案。通过环境配置、技术架构设计、实战案例和性能优化,帮助开发者解决中大型项目中的依赖管理和版本协同问题,提升游戏迭代效率。

cc789的博客 846

android_基础_圆形imageView的实现

四种自定义圆形ImageView的方法 BitmapShader: 使用着色器 Xfermode:使用图层叠加 ClipPath:通过对画布裁剪的方式 RoundedBitmapDrawable: 系统API圆角类 前面三种是通过继承ImageView重写onDraw()方法实现 最后一种是系统API直接使用。 每一种方式都能实现显示圆形图片, 我们主要从以下几个方面来比较各个方式的不同 实现方式难易 空白的背景 抗锯齿的能力 第1种方式:BitmapShader实现 通过对Pain

写bug的蚊子的博客 2990

基于IC617下Layout XL的使用

基于IC617下Layout XL的使用

weixin_43816759的博客 1万+

【汽车ECU电控数据管理篇】A2L文件在ECU标定中的关键作用与实战解析

本文深入解析A2L文件在汽车ECU标定中的关键作用,详细介绍了其作为'数据字典'的核心功能与实战应用。通过剖析A2L文件的结构、关键标签及常见问题,帮助工程师高效管理电控数据,提升ECU标定效率与准确性。文章特别强调了ASAP2标准下的A2L文件在汽车电控系统中的重要性。

a3b4c5的博客 787

Android圆形的Imageview

点击查看原文圆形imageview自定义控件:‘package com.wangll.widget;import android.content.Context; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.graphics.Canvas; import android.g

Metis100的专栏i6zHW5lX(fDT 1244

麒麟桌面操作系统QT开发环境搭建

麒麟操作系统安装Qt

因为热爱,所以坚持,记录工作中的乐趣 9273

Android 圆形图片显示

【代码】Android 圆形图片显示。

xiaoerbuyu1233的博客 432

SAP FI实战入门:从借贷法则到F-02记账,新手必懂的会计凭证操作

本文详细介绍了SAP FI模块中借贷记账法的核心逻辑及F-02凭证录入的全流程操作。通过实例解析借贷方向规则、科目编码设置及金额镜像原则,帮助新手快速掌握会计凭证操作技巧。同时提供了FS10N余额查询和常见错误排查方法,助力用户高效完成SAP财务记账任务。

weixin_29306571的博客 261

YOLOv13改进目录一览 | 涉及卷积层、轻量化、注意力、损失函数、Backbone、SPPF、Neck、检测头等全方位改进

1️⃣ 已更新种不同的改进方案,专栏内的每篇文章皆,均可顺利运行。2️⃣ 订阅专栏即可进群获取以及从的各种答疑内容。3️⃣ 全新的YOLOv13改进专栏,,只为更好的满足论文发表的要求。专栏内容,专栏实时评分,全网最高,质量保证。🎫。。

Limiiiing的博客 9150

android 方式实现imageview圆角

/ 如果图片的宽或者高与view的宽高不匹配,计算出需要缩放的比例;所以我们这里取大值;//view的宽度/bitmap的宽度=缩放倍数。// 默认为Circle。初始化BitmapShader//给paint附加一个具有某种魔力(缩放)的shader。// 默认为10dp。// 先给paint设置shader;// shader的变换矩阵,我们这里主要用于放大或者缩小。// 拿到bitmap宽或高的小值//我们需要画正方形。//以下为drawable转bitmap的通用方法。// 圆角图片的范围。

2401_86968352的博客 744

【WLAN】【测试】WPS测试方法小结

手机 一般稍微老的手机会支持,新手机反而不支持。 比如小米6(系统版本新的话不支持)在设置——高级设置——WPS连接。 笔记本 有些笔记本(如Surface Laptop 3)天生支持WPS,比如在连接某SSID的时候,会有“也可以通过按路由器上的按钮连接”这样的字样,出来后按AP的WPS按键即可以进行连接。 Qss软件 AP mesh组网中,Controller和Agent之间通过WIFI组网,可使用WPS的方式进行连接。可利用这点用Agent来测试AP的WPS功能。 ...

一介草民,只为生活。 1万+

Android BitmapShader 实战 实现圆形、圆角图片

转载请标明出处:http://blog.youkuaiyun.com/lmj623565791/article/details/41967509,本文出自:【张鸿洋的博客】1、概述记得初学那会写过一篇博客Android 完美实现图片圆角和圆形(对实现进行分析),主要是个自定View加上使用Xfermode实现的。其实实现圆角图片的方法应该很多,常见的就是利用Xfermode,Shader。本篇博客会直接继承直

Hongyang 12万+

Android 14.0 Launcher3定制化之最近任务的全部清除由左边移到下边显示

在最近14.0的系统rom产品开发中,在Launcher3的定制化开发中,在最近任务列表中,发现点击recents最近任务键后 显示的全部清除按键在左边 由于是横屏的产品显示在左边不太合理 所以要求显示在下边比较合理,所以要从Launcher3的显示流程来解决这个问题

安卓兼职framework和app工程师的博客 764

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Android BitmapShader实现圆角、圆形ImageView

圆角 圆形 ImageView BitmapShader

永远不要停下学习的脚步。 8691

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

4- Android四种自定义圆形ImageView的方法

介绍四种自定义圆形ImageView的方法 BitmapShader: 使用着色器 Xfermode:使用图层叠加 ClipPath:通过对画布裁剪的方式 RoundedBitmapDrawable: 系统API圆角类 前面三种是通过继承ImageView重写onDraw()方法实现 最后一种是系统API直接使用。 每一种方式都能实现显示圆形图片, 我们主要从以下几个方面来比较各个方...

bobo_zai的博客 9774

计算机控制技术及应用

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

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Android圆角图片和圆形图片实现总结

Android研发中经常会遇见圆角或者圆形图片的展示,但是系统中ImageView并不能直接支持,需要我们自己做一些处理,来实现圆角图片或者圆形图片,自己最近对这块的实现做了一下总结.

王三的专栏 2万+

Android自定义圆角圆形ImageView实战(高效实现方案)

本文深入探讨了Android自定义圆角圆形ImageView的高效实现方案。通过继承原生ImageView并利用BitmapShader核心原理,在保留scaleType等原生特性的基础上,实现了高性能的圆角与圆形绘制,有效避免了内存抖动与OOM问题,并提供了边框、状态支持等进阶功能与避坑指南。

weixin_29252171的博客 547

Android自定义View——可设置形状(圆形、圆角矩形、椭圆)的ImageView,抗锯齿

(如果对自定义View不太熟悉,可以查看上篇文章《Android自定义View——基础知识篇》) 有时显示的图片(如用户头像)是圆形或者圆角矩形的,如果我们把每一种形状的图片都裁剪成一个图片文件,这样既麻烦也浪费空间,所以最好的办法是通过代码来设置图片的显示形状。 显示图片用到的是ImageView,最简单的设置图片形状的方法就是在onDraw()里面通过canvas.

走向远方 1万+
上一篇: The archive: org.eclipse.swt.win32.win32.x86_64_3.104.0.v20150528-0211.jar does not exist.
下一篇: android 4.4所支持MimeType
Piyell
博客等级 码龄17年 12粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值