Android笔记之RoundedImageView
参考项目:GcsSloop/rclayout
实现1,利用Canvas.clipPath来实现,适用于任何View(无法去除锯齿效果)
package com.bu_ish.blog; import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Path;
import android.util.AttributeSet; import androidx.appcompat.widget.AppCompatImageView; public class RoundedImageView extends AppCompatImageView {
private int cornerRadius = 12;
private Path path; public RoundedImageView(Context context, AttributeSet attrs) {
super(context, attrs);
path = new Path();
} @Override
protected void onDraw(Canvas canvas) {
ViewUtils.clipRoundedPathForCanvas(this, canvas, path, cornerRadius);
super.onDraw(canvas);
} public void setCornerRadius(int radius) {
cornerRadius = radius;
invalidate();
}
}
package com.bu_ish.blog; import android.graphics.Canvas;
import android.graphics.Path;
import android.view.View; public class ViewUtils {
public static void clipRoundedPathForCanvas(View view, Canvas canvas, Path path, int cornerRadius) {
makePathRounded(view, path, cornerRadius);
canvas.clipPath(path);
} private static void makePathRounded(View view, Path path, int cornerRadius) {
int width = view.getWidth(), height = view.getHeight();
path.moveTo(cornerRadius, 0);
path.lineTo(width - cornerRadius, 0);
path.quadTo(width, 0, width, cornerRadius);
path.lineTo(width, height - cornerRadius);
path.quadTo(width, height, width - cornerRadius, height);
path.lineTo(cornerRadius, height);
path.quadTo(0, height, 0, height - cornerRadius);
path.lineTo(0, cornerRadius);
path.quadTo(0, 0, cornerRadius, 0);
}
}
实现2,利用Canvas.drawPath实现,可抗锯齿,适用于任何View(但是在AS中无法预览圆角效果)
package com.bu_ish.blog; import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.RectF;
import android.util.AttributeSet; import androidx.appcompat.widget.AppCompatImageView; public class RoundedImageView extends AppCompatImageView {
private final Path roundedPath, pathToDraw;
private final RectF rect;
private final Paint paint;
private int cornerRadius = 50; public RoundedImageView(Context context, AttributeSet attrs) {
super(context, attrs);
roundedPath = new Path();
pathToDraw = new Path();
rect = new RectF();
paint = new Paint();
initializePaint();
} @Override
protected void onDraw(Canvas canvas) {
canvas.saveLayer(null, null, Canvas.ALL_SAVE_FLAG);
super.onDraw(canvas);
addRoundRectToRoundedPath();
preparePathToDraw();
canvas.drawPath(pathToDraw, paint);
canvas.restore();
} private void initializePaint() {
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));
paint.setStyle(Paint.Style.FILL);
paint.setAntiAlias(true);
} private void addRoundRectToRoundedPath() {
rect.left = 0;
rect.top = 0;
rect.right = getWidth();
rect.bottom = getHeight();
roundedPath.reset();
roundedPath.addRoundRect(rect, cornerRadius, cornerRadius, Path.Direction.CW);
} private void preparePathToDraw() {
pathToDraw.reset();
pathToDraw.addRect(0, 0, getWidth(), getHeight(), Path.Direction.CW);
pathToDraw.op(roundedPath, Path.Op.DIFFERENCE);
} public void setCornerRadius(int radius) {
cornerRadius = radius;
invalidate();
}
}
实现3,使用BitmapShader实现,仅适用于ImageView,参考Demo:https://pan.baidu.com/s/1WFyZkgmwckNSVMqdLLxymw,提取码:nvb8
一个比较好的开源项目
vinc3m1/RoundedImageView: A fast ImageView that supports rounded corners, ovals, and circles.
Android笔记之RoundedImageView的更多相关文章
- Android笔记——Android中数据的存储方式(二)
我们在实际开发中,有的时候需要储存或者备份比较复杂的数据.这些数据的特点是,内容多.结构大,比如短信备份等.我们知道SharedPreferences和Files(文本文件)储存这种数据会非常的没有效 ...
- Android笔记:触摸事件的分析与总结----TouchEvent处理机制
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://glblong.blog.51cto.com/3058613/1559320 ...
- Android 笔记之 R 文件
Android笔记之R文件 h2{ color: #4abcde; } a{ color: blue; text-decoration: none; } a:hover{ color: red; te ...
- Android 笔记之 Android 系统架构
Android笔记之Android系统架构 h2{ color: #4abcde; } a{ color: blue; text-decoration: none; } a:hover{ color: ...
- Android笔记之使用Glide加载网络图片、下载图片
Glide简介 不想说太多,真的很方便:P)可以节省我不少时间 GitHub地址:https://github.com/bumptech/glide 加载网络图片到ImageView Glide.wi ...
- Android笔记--View绘制流程源码分析(二)
Android笔记--View绘制流程源码分析二 通过上一篇View绘制流程源码分析一可以知晓整个绘制流程之前,在activity启动过程中: Window的建立(activit.attach生成), ...
- Android笔记--View绘制流程源码分析(一)
Android笔记--View绘制流程源码分析 View绘制之前框架流程分析 View绘制的分析始终是离不开Activity及其内部的Window的.在Activity的源码启动流程中,一并包含 着A ...
- Android笔记--自定义控件仿遥控器的圆形上下左右OK圆盘按钮
原文:Android笔记--自定义控件仿遥控器的圆形上下左右OK圆盘按钮 上面就是几张预览图!代码在最底下 主要就两个步骤,画图.监听点击 1.整个控件基本上是一步步画出来的,重写onDraw方法开始 ...
- 我的Android笔记--我对安卓系统的一些了解
敲了这么长时间代码,记录一下我对Android的一些概念,下面大部分内容来源自网络资料和官方给的文档. 1,Android操作系统的核心属于Linux的一个分支,具有典型的Linux调度和功能 ...
随机推荐
- windows网络函数
The following functions are used in Windows networking: MultinetGetConnectionPerformance WNetAddConn ...
- 使用java.util.Properties工具制作自定义访问配置文件信息
import ch.qos.logback.classic.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; im ...
- springboot入门级笔记
springboot亮点:不用配置tomcat springboot不支持jsp 准备:配置jdk 配置maven 访问https://start.spring.io/ 并生成自己的springboo ...
- 为什么TCP 会粘包断包UDP不会
TCP(transport control protocol,传输控制协议)是面向连接的,面向流的,提供高可靠性服务.收发两端(客户端和服务器端)都要有一一成对的socket,因此,发送端为了将多个发 ...
- 6. Python运算符之算术、比较、赋值运算符
什么是运算符?举个简单的例子 4 +1 = 5 . 例子中,4 和 1 被称为操作数,"+" 和"="称为运算符. 工作中用到的运算符主要有以下几种:算术运算符 ...
- vbs 之 wscript
https://www.jb51.net/article/20919.htm '''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' ...
- 自旋锁spinlock
1 在单处理器上的实现 单核系统上,不存在严格的并发,因此对资源的共享主要是多个任务分时运行造成的. 只要在某一时段,停止任务切换,并且关中断(对于用户态应用程序,不大可能与中断处理程序抢临界区资源) ...
- cesium相关学习网址
cesium相关学习网址: cesium资料大全网址:https://www.cnblogs.com/cesium1/p/10062942.html http://192.168.101. ...
- 2019年Pandas官方用户调研
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt %matplotlib inline plt.rcP ...
- 567. Permutation in String【滑动窗口】
Given two strings s1 and s2, write a function to return true if s2 contains the permutation of s1. I ...