有一个Path#addRoundRect()重载,它接受一个包含八个值的float数组,其中我们可以为四个角中的每一个指定x和y半径.这些值为[x,y]对,从左上角开始,顺时针绕其余部分.对于我们想要舍入的那些角,我们将该对的两个值都设置为半径值,并将它们保留为零,而不是那些.

作为一个说明性示例,一个简单的方法将返回可在您的代码段中使用的Path:

private Path getPath(float radius, boolean topLeft, boolean topRight,

boolean bottomRight, boolean bottomLeft) {

final Path path = new Path();

final float[] radii = new float[8];

if (topLeft) {

radii[0] = radius;

radii[1] = radius;

}

if (topRight) {

radii[2] = radius;

radii[3] = radius;

}

if (bottomRight) {

radii[4] = radius;

radii[5] = radius;

}

if (bottomLeft) {

radii[6] = radius;

radii[7] = radius;

}

path.addRoundRect(new RectF(0, 0, getWidth(), getHeight()),

radii, Path.Direction.CW);

return path;

}

根据您的示例说明,舍入左上角和右上角:

@Override

protected void onDraw(Canvas canvas) {

float radius = getContext().getResources().getDimension(R.dimen.round_corner_radius);

Path path = getPath(radius, true, true, false, false);

canvas.clipPath(path);

super.onDraw(canvas);

}

和往常一样,我建议尽可能地保持onDraw()方法,移动任何其他地方不必存在的东西.例如,可以在构造函数中检索radius的资源值,并将其保存在字段中.此外,只有在必要时才能构建路径;即,当视图的大小改变时,或当半径或选定的角改变时.

由于我将一个简单的自定义ImageView放在一起进行测试,我将在此处包含它,因为它演示了以上几点.此自定义视图还提供XML属性,允许在布局中设置角半径和圆角.

public class RoundishImageView extends ImageView {

public static final int CORNER_NONE = 0;

public static final int CORNER_TOP_LEFT = 1;

public static final int CORNER_TOP_RIGHT = 2;

public static final int CORNER_BOTTOM_RIGHT = 4;

public static final int CORNER_BOTTOM_LEFT = 8;

public static final int CORNER_ALL = 15;

private static final int[] CORNERS = {CORNER_TOP_LEFT,

CORNER_TOP_RIGHT,

CORNER_BOTTOM_RIGHT,

CORNER_BOTTOM_LEFT};

private final Path path = new Path();

private int cornerRadius;

private int roundedCorners;

public RoundishImageView(Context context) {

this(context, null);

}

public RoundishImageView(Context context, AttributeSet attrs) {

this(context, attrs, 0);

}

public RoundishImageView(Context context, AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.RoundishImageView);

cornerRadius = a.getDimensionPixelSize(R.styleable.RoundishImageView_cornerRadius, 0);

roundedCorners = a.getInt(R.styleable.RoundishImageView_roundedCorners, CORNER_NONE);

a.recycle();

}

public void setCornerRadius(int radius) {

if (cornerRadius != radius) {

cornerRadius = radius;

setPath();

invalidate();

}

}

public int getCornerRadius() {

return cornerRadius;

}

public void setRoundedCorners(int corners) {

if (roundedCorners != corners) {

roundedCorners = corners;

setPath();

invalidate();

}

}

public boolean isCornerRounded(int corner) {

return (roundedCorners & corner) == corner;

}

@Override

protected void onDraw(Canvas canvas) {

if (!path.isEmpty()) {

canvas.clipPath(path);

}

super.onDraw(canvas);

}

@Override

protected void onSizeChanged(int w, int h, int oldw, int oldh) {

super.onSizeChanged(w, h, oldw, oldh);

setPath();

}

private void setPath() {

path.rewind();

if (cornerRadius >= 1f && roundedCorners != CORNER_NONE) {

final float[] radii = new float[8];

for (int i = 0; i < 4; i++) {

if (isCornerRounded(CORNERS[i])) {

radii[2 * i] = cornerRadius;

radii[2 * i + 1] = cornerRadius;

}

}

path.addRoundRect(new RectF(0, 0, getWidth(), getHeight()),

radii, Path.Direction.CW);

}

}

}

要使XML属性起作用,需要在< resources>中进行以下操作,您可以将此文件放在项目的res / values /文件夹中,或添加到可能已存在的文件中.

attrs.xml

cornerRadius是一个维度属性,应指定为dp或px值. roundedCorners是一个标志属性,可以使用竖线字符|来选择多个角.例如:

xmlns:app="http://schemas.android.com/apk/res-auto"

android:id="@+id/riv"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:adjustViewBounds="true"

android:scaleType="fitXY"

android:src="@drawable/magritte"

app:cornerRadius="@dimen/round_corner_radius"

app:roundedCorners="topLeft|topRight" />

android点击左上角划出,使用Android中的Path和RectF在左上角右上角左下角绘制圆角...相关推荐

  1. android 点击图片弹出对话框,android studio怎样弹出对话框--实际案例?

    弹出对话框使用AlertDialogBuilder类构建,再用AlertDialog类具体化.我们假设在屏幕上有一退出程序的按钮,当用户点击该按钮时,弹出对话框询问是否退出程序,用户点击确定时退出程序 ...

  2. android点击按钮弹出输入框,android 弹出框(输入框和选择框)

    1.输入框: final EditText inputServer = new EditText(this); inputServer.setFilters(new InputFilter[]{new ...

  3. 代码android点击效果,GitHub - likaiyuan559/TouchEffects: Android View点击特效TouchEffects,几行代码为所有控件添加点击效果...

    Android 点击特效TouchEffects TouchEffects能够帮助你更快速方便的增加点击时候的效果,TouchEffects的目标是打造一个稳定.全面.且能更方便的自定义及个性化的一款 ...

  4. android点击按钮打开一个网页,Android实现H5点击打开app或跳转指定界面

    Android实现H5点击打开app或跳转指定界面 本文原创,转载请注明出处.欢迎关注我的 简书. 安利一波我写的开发框架:MyScFrame喜欢的话就给个Star 场景 H5界面中的入口 有时候为了 ...

  5. android 输入法不自动弹出窗口,Android EditText默认不弹出输入法的实现方法

    一.Android EditText默认不弹出输入法的办法: 1. 在AndroidManifest.xml中将需要默认隐藏键盘的Activity中添加属性即可(常用此方法) android:wind ...

  6. android 点击切换下一题,android 仿考题左右滑动切换到下一题

    匿名用户 1级 2016-11-13 回答 用ViewPager +  Fragment,很简单的, package com.example.viewpagerdemo; import java.ut ...

  7. android点击按钮弹出图片,用android做的一个简单的点击按钮显示图片的程序

    其实,在这之前我已经做了一个点击按钮的小程序,只不过它只是用来在界面上显示一些文字或者是用一个对话框来显示内容.按理说,做显示图片应该是不会有太大的问题了,可是问题还是来了.在我把这些个问题解决之后, ...

  8. android点击出现菜单,Android 点击按钮弹出菜单

    效果图: 1.创建menu文件夹,新建main.xml文件 android:id="@+id/add" android:title="添加" /> and ...

  9. android点击弹出日期选择器,关于Android 点击按钮弹出日期选择器

    首先是 xml文件 xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width= ...

最新文章

  1. Android开源项目SlidingMenu本学习笔记(两)
  2. linux下普通用户更改密码原理(S权限)、SetUID
  3. blender怎么移动骨骼_日本这款人形机器人竟是多个机器人乐队的前辈!拥有人类骨骼,还会击鼓...
  4. SRS流媒体服务器搭建+ffmpeg推流VLC取流观看
  5. 计算机能不能直接识别汇编语言程序,计算机能直接识别执行用汇编语言编写的程序吗...
  6. hdu2570 迷瘴
  7. python docker自动化_「docker实战篇」python的docker爬虫技术-移动自动化控制工具appium工具(17)...
  8. bzoj 3994 约数个数和 —— 反演+数论分块
  9. BZOJ 2738: 矩阵乘法 [整体二分]
  10. 日常管理随笔一 (转载)
  11. ASA防火墙SSL ×××配置
  12. 【语音识别】基于matlab GUI拨号语音识别【含Matlab源码 1753期】
  13. 药店管理系统/APP/小程序/网站
  14. 物联网行业应用前景分析
  15. google地图 经纬度查询
  16. 微信公众平台原创声明功能公测 自媒体原创保护的福音
  17. JS题目之数组数据拆分重组转成嵌套对象,让脑细胞活跃下
  18. p1633[进制应用]砝码称重
  19. java Mail使用SSl,端口465加密发送邮件配置
  20. 详解:S锁(读锁)和X锁(写锁)

热门文章

  1. git与svn的区别 ?Git 与 SVN那个更好?
  2. Snapchat, 给年轻人要的安全感
  3. [转载] 七龙珠第一部——第063话 悟空大反击
  4. 关闭子窗口 父窗口自动刷新
  5. Windows 7下实现×××连接自动创建
  6. 监理公司的核心竞争力
  7. 数据探查_数据科学家,开始使用探查器
  8. 460. LFU 缓存
  9. leetcode1351. 统计有序矩阵中的负数(二分查找)
  10. aws dynamodb_DynamoDB备忘单–您需要了解的有关2020 AWS认证开发人员助理认证的Amazon Dynamo DB的所有信息