在笔者本人看了很多博客和书之后,发现很少博主对于自定义控件能够进行一个比较全面的思路讲解,大多数都是只讲了一些细节,但并没有讲如何把代码进行整体的实现。因此这里讲讲整体的自定义button实现的详细过程,其余的细节则可以查看其他博主的博客即可,也可以参考《Android开发艺术探索》这本书的第六章,看了我这篇博文之后,相信你一定对自定义控件会有一定的了解。

首先是创建一个根节点为shape的xml,用于描述我们所创建的button没有被按时的界面,如图:

我们可以看到其四周都是由圆角来修饰的,那么我们怎么在shape根节点里把这个button的样式写出来呢?我们来看看代码,不知道如何创建shape文件的童鞋可以参考一下这个百度经验,传送门:https://jingyan.baidu.com/article/b907e62795139746e7891cb9.html

一.button_bg.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid
android:color="#ff9d77"
>
</solid>
<stroke
android:width="2dp"
android:color="#fad3cf"> </stroke>
<corners
android:bottomLeftRadius="20dp"
android:bottomRightRadius="20dp"
android:topLeftRadius="20dp"
android:topRightRadius="20dp" >
</corners>
<padding
android:bottom="10dp"
android:left="10dp"
android:right="10dp"
android:top="10dp"
> </padding> </shape>

这样我们的按钮自定义界面就完成了,这是在没被按住的情况下,下面再来看看在按住情况下的程序代码,也是一个shape文件,后面我们会用选择器对它们的逻辑进行整合,最后在Button控件里进行调用这个选择器的逻辑。

二.demo.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
>
<gradient
android:endColor="#FFFFFF"
android:gradientRadius="200dp"
android:startColor="#ff8c00"
android:type="radial" > </gradient>
<stroke
android:width="5dp"
android:color="#dcdcdc"
>
</stroke>
<corners
android:radius="23dp" >
</corners>
<padding
android:bottom="10dp"
android:left="10dp"
android:right="10dp"
android:top="10dp"
> </padding>
</shape>

这样在按下按钮之后,就会呈现出来不同的显示效果,可以让用户明显感受到一种人机交互的感觉,之后是我们的选择器,因为在主活动当中我们只能够调用我们的选择器从而引出这两个效果。

三.selector.xml

这个文件的创建方式和shape类似,这里就不多说了,我们直接上代码:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/demo" android:state_pressed="true"></item>
<item android:drawable="@drawable/button_bg"></item> </selector>

我们可以看到在第一个item下面描述的是我们的按钮被按下去的界面将会变成demo.xml,平时正常的界面则是button_bg了。这就是上述代码的含义,之后我们再去主活动当中调用这个选择器,之后我们的自定义button就轻松完成啦!

四.activity.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"> <Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="我是一个按钮"
android:background="@drawable/selector"/> </android.support.constraint.ConstraintLayout>

可以看到我们在button控件当中的backgroud属性当中引入了我们的选择器,这样子呢就可以把之前我们所定义的界面引入到这个button按钮当中了。

安卓开发笔记(三十):自定义Button的更多相关文章

  1. 安卓开发笔记(十八):实现button按钮事件的三种方法

    Android开发中有三种主要的方式用于设置View的点击事件,1.创建内部类:2.主类中实现OnClickListener接口:3.使用匿名内部类.这三种方式都用到了OnClickListener接 ...

  2. 安卓开发笔记(十二):SQLite数据库储存(上)

    SQLite数据库存储(上) 创建数据库 Android专门提供了一个 SQLiteOpenHelper帮助类对数据库进行创建和升级 SQLiteOpenHelper需要创建一个自己的帮助类去继承它并 ...

  3. 安卓开发笔记(十):升级ListView为RecylerView的使用

    概述 RecyclerView是什么 从Android 5.0开始,谷歌公司推出了一个用于大量数据展示的新控件RecylerView,可以用来代替传统的ListView,更加强大和灵活.Recycle ...

  4. 安卓开发笔记(十九):异步消息处理机制实现更新软件UI

    主界面代码 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:andr ...

  5. 安卓开发笔记(十六):'Request(okhttp3.Request.Builder)' has private access in 'okhttp3.Request

    当出现了'Request(okhttp3.Request.Builder)' has private access in 'okhttp3.Request的错误的时候,实际上是我们在写代码的时候少打了 ...

  6. 安卓开发笔记——自定义广告轮播Banner(实现无限循环)

    关于广告轮播,大家肯定不会陌生,它在现手机市场各大APP出现的频率极高,它的优点在于"不占屏",可以仅用小小的固定空位来展示几个甚至几十个广告条,而且动态效果很好,具有很好的用户& ...

  7. 安卓开发笔记——深入Activity

    在上一篇文章<安卓开发笔记——重识Activity >中,我们了解了Activity生命周期的执行顺序和一些基本的数据保存操作,但如果只知道这些是对于我们的开发需求来说是远远不够的,今天我 ...

  8. 安卓开发笔记——关于开源项目SlidingMenu的使用介绍(仿QQ5.0侧滑菜单)

    记得去年年末的时候写过这个侧滑效果,当时是利用自定义HorizontalScrollView来实现的,效果如下: 有兴趣的朋友可以看看这篇文件<安卓开发笔记——自定义HorizontalScro ...

  9. 安卓开发笔记——打造万能适配器(Adapter)

    为什么要打造万能适配器? 在安卓开发中,用到ListView和GridView的地方实在是太多了,系统默认给我们提供的适配器(ArrayAdapter,SimpleAdapter)经常不能满足我们的需 ...

  10. Android UI开发第三十九篇——Tab界面实现汇总及比较

    Tab布局是iOS的经典布局,Android应用中也有大量应用,前面也写过Android中TAb的实现,<Android UI开发第十八篇——ActivityGroup实现tab功能>.这 ...

随机推荐

  1. DDGScreenShot — 复杂屏幕截屏(如view ScrollView webView wkwebView)

    写在前面 最近有这么一个需求,分享页面,分享的是web订单截图,既然是web 就会有超出屏幕的部分, 生成的图片还要加上我们的二维码,这就涉及到图片的合成了. 有了这样的需求,就是各种google.也 ...

  2. error LNK2001: 无法解析的外部符号 "public: char * __thiscall

    error LNK2001: 无法解析的外部符号 "public: char * __thiscall CamPinPadCtrl::KeysConvert(unsigned long,ch ...

  3. First Scala

    注意的两点: 1. Class or Objcect 在Scala把类和对象明确的分开了. Class相当于模板:Object是Class的实现. 2. main 要测试代码必须使用main def ...

  4. mysql安装与配置(以mysql-5.7.10-winx64为例)

    一.在官网上下载相应的mysql安装包,本人下载的是:mysql-5.7.10-winx64 (Windows (x86, 64-bit), ZIP Archive) 附下载地址:http://dev ...

  5. CentOS 7.4 MySQL 5.7.20主从环境搭建(M-S)

    MySQL主从原理: 一,master记录二进制日志,在每个事务更新数据完成之前,master在二进制日志中记录这些改变.mysql将事务写入二进制日志,即使事务中的语句都是交叉执行的.在事件写入二进 ...

  6. Java MD5加密与RSA加密

    区别: MD5加密: 加密时通过原字符串加密成另一串字符串 解密时需要原加密字符串进行重新加密比较两次加密结果是否一致 T=RSA加密: 加密时通过原字符串生成密钥对(公钥+私钥) 解密时通过公钥和私 ...

  7. 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 使用FairyGUI (二)

    上次讲解了FairyGUI的最简单的热更新办法,并对其中一个Demo进行了修改并做成了热更新的方式. 这次我们来一个更加复杂一些的情况:Emoji. FairyGUI的   Example 04 - ...

  8. redis的持久化之AOF

    AOF Redis 分别提供了 RDB 和 AOF 两种持久化机制: RDB 将数据库的快照(snapshot)以二进制的方式保存到磁盘中. AOF 则以协议文本的方式,将所有对数据库进行过写入的命令 ...

  9. 计算机协议、标准以及OSI模型的简单介绍

    由概念启发学习,引导学习.本篇文章中包含了一些最基本的概念和底层知识.虽然零碎,但是这是基础. 一.协议和标准 协议指的是一组控制数据通信的规则.协议有三要素:语法(syntax),语义(semant ...

  10. Oracle中的优化问题

    1. 在查询时, 尽量使用列名; 2. 在子查询和多表查询都可以达到目的时, 尽量使用多表查询; 3. 在集合运算中, 如果集合中含有null, 那么不能用not in, 但可以用in(可以理解为nu ...