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调度和功能 ...
随机推荐
- thinkphp ajax调用demo
http://files.cnblogs.com/files/jxkshu/tp_ckgd.rar
- 梯度下降:SGD vs Momentum vs NAG vs Adagrad vs Adadelta vs RMSprop vs Adam
原文地址:https://www.jianshu.com/p/7a049ae73f56 梯度下降优化基本公式:\({\theta\leftarrow\theta-\eta\cdot\nabla_\th ...
- 53-Ubuntu-打包压缩-3-gzip压缩和解压缩介绍
gzip tar与gzip命令结合可以实现文件打包和压缩. tar只负责打包文件,但不负责压缩. 用gzip压缩tar打包后的文件,其扩展名一般为xxx.tar.gz. 注:在Linux中,最常见的压 ...
- (Struts2学习系列四)Struts2指定配置文件
我们的每个action都在struts.xml里配置的话,就会出现很多的xml语句,单单一个struts.xml就会变得很大,所以我们会在struts.xml里使用include引入其他的.xml文件 ...
- tftp 服务器的配置
如果用下面一条命令能够看到服务已经启动, 则不用安装, 否则需要按 1 或 2 点安装 tftp-server 服务器. [arm@localhost arm]#netstat -a | grep t ...
- 文件 IO
io分类 在文件IO 中是通过文件描述符操作文件的,实际上是一个非负整数 头文件 #include <sys/types.h> #include <sys/stat.h> ...
- 微信小程序 初阶
公司最近安排要学习一下微信小程序的开发,大体看了看,幸亏还有点javascript的底子,学起来不至于太难,其它的语法什么的真需要好好适应适应....头大 从头开始看微信小程序开发的文档,目前来说没有 ...
- Eureka备忘
一. 二. 2.2. eureka集群同步集群相关重要的类com.netflix.eureka.registry.PeerAwareInstanceRegistryImpl: 为了保证集群里所有Eur ...
- redis设置自动启动
按照如下操作即可(可以自定义目录) mkdir /redis cd /redis wget http://download.redis.io/releases/redis-4.0.1.tar.gz t ...
- 27 string类中常用的方法列表
1. 获取方法 int length() 获取字符串的长度 char charAt(int index) 获取特定位置的字符 (角标越界) int indexOf(String str) 获取 ...