全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Android中快速便捷的实现圆角按钮方法详解

前言

大家应该都知道,圆角按钮是我们在做界面时常常遇到的UI样式。通常的办法,是做一个drawable,比如这样:

<?xml version="1.0" encoding="UTF-8"?> 
<shape 
 xmlns:android="http://schemas.android.com/apk/res/android" 
 android:shape="rectangle"> 
 <!-- 填充的颜色 --> 
 <solid android:color="#ffae00" /> 

 <!-- 圆角的半径 --> 
 <corners android:radius="10dp" /> 
</shape>

在Layout文件里Button的background属性设上这个drawable.xml,就可以了。

然而这样做的话,每次弄个按钮都得新做一个drawable文件,各种drawable多了看着就乱。

是不是可以把color和radius放到Button的属性里去,这样就不用每次再拖一个drawable.xml了是吧?

自定义RoundCornerButton

<widget.RoundCornerButton
 android:id="@+id/btn_commit"
 android:layout_width="100dp"
 android:layout_height="40dp"
 android:gravity="center"
 android:text="我的按钮"
 app:rcb_backgroundColor="@color/yellow"
 app:rcb_backgroundColorDisabled="@color/light_grey"
 app:rcb_cornerRadius="20dp"
 />

如果可以这样在Layout文件里直接设置背景色和圆角半径,是不是很方便!虽然不如drawable灵活,但是已经足以应付设计同学给出的圆角按钮的需求了。

我们就以定义自己的styleable属性开始吧

<declare-styleable name="RoundCornerButton">
 <attr name="rcb_backgroundColor" format="color" />
 <attr name="rcb_backgroundColorDisabled" format="color" />
 <attr name="rcb_cornerRadius" format="dimension" />
</declare-styleable>

从Drawable扩展一个自己的Drawable,很简单

  • 从构造方法传入color和radius,并创建一个实习的画笔;
  • 覆写draw方法,有现成的画圆角矩形的方法可以调用;
  • 暴露一个setRect方法给外边,用于设置绘制区域的宽高。
class RoundCornerDrawable extends Drawable {

 final int color;
 final float radius;
 final Paint paint;
 final RectF rectF;

 RoundCornerDrawable(int color, float radius) {
  this.color = color;
  this.radius = radius;

  // 实心的画笔
  this.paint = new Paint();
  paint.setStyle(Paint.Style.FILL);
  paint.setAntiAlias(true);
  paint.setColor(color);

  this.rectF = new RectF();
 }

 // 用于设置Drawable宽高
 public void setRect(int width, int height) {
  this.rectF.left = 0;
  this.rectF.top = 0;
  this.rectF.right = width;
  this.rectF.bottom = height;
 }

 @Override
 public void draw(@NonNull Canvas canvas) {
  canvas.drawRoundRect(rectF, radius, radius, paint); // 画圆角矩形,现成的方法
 }

 // 其余方法略
}

定义自己的Button类,有这么几个要点:

  • 与通常的自定义View一样,覆写三个构造方法;
  • 从AttributeSet里读取自定义的属性backgroundColor和cornerRadius,这里暂时忽略backgroundColorDisabled;
  • 每一种状态(例如普通、禁用、按下)是一个RoundCornerDrawable,组合成一个StateListDrawable;
  • onLayout的时候,记得改变每一个RoundCornerDrawable的尺寸。
public class RoundCornerButton extends AppCompatButton {

 private int colorNormal;
 private float cornerRadius;
 private RoundCornerDrawable bgDrawableNormal = null;

 // 省略三个构造方法
 // 构造方法最后一定要调用initCornerBackground完成初始化

 private void initCornerBackground(AttributeSet attrs, int defStyleAttr) {
  TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.RoundCornerButton, defStyleAttr, 0);

  this.cornerRadius = a.getDimension(R.styleable.RoundCornerButton_rcb_cornerRadius, 0);
  this.colorNormal = a.getColor(R.styleable.RoundCornerButton_rcb_backgroundColor, 0);
  makeBackgroundDrawable();

  a.recycle();
 }

 private void makeBackgroundDrawable() {
  bgDrawableNormal = new RoundCornerDrawable(this.colorNormal, this.cornerRadius);
  bgDrawableNormal.setRect(getWidth(), getHeight());

  // 设计通常会给出禁用时的样式以及按下时的样式
  // 所以这里用使用StateListDrawable
  StateListDrawable bgDrawable = new StateListDrawable();
  bgDrawable.addState(new int[]{android.R.attr.state_enabled, -android.R.attr.state_pressed}, bgDrawableNormal);
  // 每多一种状态,在这里多加一项
  setBackgroundDrawable(bgDrawable);
 }

 @Override
 protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
  super.onLayout(changed, left, top, right, bottom);

  // layout之后必然会draw,所以在这里设置drawable的尺寸
  if (bgDrawableNormal != null) {
   bgDrawableNormal.setRect(right - left, bottom - top);
  }
  // 每多一种状态,在这里多加一项
 }
}

附上Demo源代码:https://github.com/realxu/CodeSamples/tree/master/Android/RoundCornerButtonDemo

这就可以啦,我们看看效果:

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。


# android  # 圆角按钮  # 圆形按钮  # 按钮设置圆角  # android xml实现按钮的圆角、阴影效果及按下变化效果的实现代码  # Android开发实现的圆角按钮、文字阴影按钮效果示例  # Android圆角按钮的制作方法  # Android实现空心圆角矩形按钮的实例代码  # Android中给按钮同时设置背景和圆角示例代码  # Android实现圆角Button按钮  # Android 圆角按钮的实现代码  # 自己的  # 圆角  # 在这里  # 自定义  # 做一个  # 按下  # 多加  # 是一个  # 看着  # 几个  # 这就  # 这样做  # 很简单  # 这篇文章  # 里去  # 谢谢大家  # 都得  # 就以  # 很方便  # 创建一个 


相关文章: 如何快速选择适合个人网站的云服务器配置?  C#如何在一个XML文件中查找并替换文本内容  如何选择域名并搭建高效网站?  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  如何快速生成专业多端适配建站电话?  如何通过VPS搭建网站快速盈利?  公司网站制作需要多少钱,找人做公司网站需要多少钱?  郑州企业网站制作公司,郑州招聘网站有哪些?  ,在苏州找工作,上哪个网站比较好?  如何通过WDCP绑定主域名及创建子域名站点?  如何用VPS主机快速搭建个人网站?  制作公司内部网站有哪些,内网如何建网站?  小说建站VPS选用指南:性能对比、配置优化与建站方案解析  已有域名建站全流程解析:网站搭建步骤与建站工具选择  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?  Swift中swift中的switch 语句  已有域名能否直接搭建网站?  如何在云主机快速搭建网站站点?  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  如何在万网自助建站平台快速创建网站?  保定网站制作方案定制,保定招聘的渠道有哪些?找工作的人一般都去哪里看招聘信息?  音乐网站服务器如何优化API响应速度?  建站之星图片链接生成指南:自助建站与智能设计教程  招商网站制作流程,网站招商广告语?  官网自助建站平台指南:在线制作、快速建站与模板选择全解析  c# 在高并发下使用反射发射(Reflection.Emit)的性能  制作销售网站教学视频,销售网站有哪些?  黑客入侵网站服务器的常见手法有哪些?  如何正确选择百度移动适配建站域名?  音响网站制作视频教程,隆霸音响官方网站?  如何在腾讯云免费申请建站?  如何在腾讯云服务器上快速搭建个人网站?  建站之星2.7模板:企业网站建设与h5定制设计专题  相册网站制作软件,图片上的网址怎么复制?  如何获取免费开源的自助建站系统源码?  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】  如何在香港服务器上快速搭建免备案网站?  建站之星免费版是否永久可用?  杭州银行网站设计制作流程,杭州银行怎么开通认证方式?  建站ABC备案流程中有哪些关键注意事项?  Python路径拼接规范_跨平台处理说明【指导】  简单实现Android验证码  制作旅游网站html,怎样注册旅游网站?  宝塔新建站点为何无法访问?如何排查?  官网网站制作腾讯审核要多久,联想路由器newifi官网  建站之星CMS五站合一模板配置与SEO优化指南  ,制作一个手机app网站要多少钱?  视频网站app制作软件,有什么好的视频聊天网站或者软件? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。