在Android中Button是一个非常常用的控件,下面我们就一起来分析一下Button源代码。

1 Button.java

Button的源代码如下,非常简单几个构造器,它继承自TextView,添加了一个默认的com.android.internal.R.attr.buttonStyle样式。如果有时间可以学习一下TextView的源码

public class Button extends TextView {

publicButton(Context context) {

this(context,null);

}

publicButton(Context context, AttributeSet attrs) {

this(context, attrs, com.android.internal.R.attr.buttonStyle);

}

publicButton(Context context, AttributeSet attrs,int defStyle) {

super(context, attrs, defStyle);

}

}

2 styles.xml

在android源码的styles.xml文件中关于Button的样式:

<style name="Widget.Button">

<item name="android:background">@android:drawable/btn_default</item>

<item name="android:focusable">true</item>

<item name="android:clickable">true</item>

<item name="android:textAppearance">?android:attr/textAppearanceSmallInverse</item>

<item name="android:textColor">@android:color/primary_text_light</item>

<item name="android:gravity">center_vertical|center_horizontal</item>

</style>

<style name="Widget.Button.Small">

<item name="android:background">@android:drawable/btn_default_small</item>

</style>

<style name="Widget.Button.Inset">

<item name="android:background">@android:drawable/button_inset</item>

</style>

<style name="Widget.Button.Transparent">

<item name="android:background">@android:drawable/btn_default_transparent</item>

<item name="android:textAppearance">?android:attr/textAppearanceSmall</item>

<item name="android:textColor">@android:color/white</item>

</style>

这里我们能看到button各种获取焦点、被按下的各种样式是由btn_default、btn_default_small、button_inset、btn_default_transparent这几个xml文件来控制。

3 btn_default.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android">

<item android:state_window_focused="false" android:state_enabled="true"

android:drawable="@drawable/btn_default_normal" />

<item android:state_window_focused="false" android:state_enabled="false"

android:drawable="@drawable/btn_default_normal_disable" />

<item android:state_pressed="true"

android:drawable="@drawable/btn_default_pressed" />

<item android:state_focused="true" android:state_enabled="true"

android:drawable="@drawable/btn_default_selected" />

<item android:state_enabled="true"

android:drawable="@drawable/btn_default_normal" />

<item android:state_focused="true"

android:drawable="@drawable/btn_default_normal_disable_focused" />

<item

android:drawable="@drawable/btn_default_normal_disable" />

</selector>

定义了Button各种状态下用到的图片。所以如果我们想自定义一个Button的样式的话我们只需要仿着这个文件来写Button的样式就行了。

android Button源码分析相关推荐

  1. Android HandlerThread 源码分析

    HandlerThread 简介: 我们知道Thread线程是一次性消费品,当Thread线程执行完一个耗时的任务之后,线程就会被自动销毁了.如果此时我们又有一 个耗时任务需要执行,我们不得不重新创建 ...

  2. Android ADB 源码分析(三)

    前言 之前分析的两篇文章 Android Adb 源码分析(一) 嵌入式Linux:Android root破解原理(二) 写完之后,都没有写到相关的实现代码,这篇文章写下ADB的通信流程的一些细节 ...

  3. 【Android SDM660源码分析】- 02 - UEFI XBL QcomChargerApp充电流程代码分析

    [Android SDM660源码分析]- 02 - UEFI XBL QcomChargerApp充电流程代码分析 一.加载 UEFI 默认应用程序 1.1 LaunchDefaultBDSApps ...

  4. 【Android SDM660源码分析】- 03 - UEFI XBL GraphicsOutput BMP图片显示流程

    [Android SDM660源码分析]- 03 - UEFI XBL GraphicsOutput BMP图片显示流程 1. GraphicsOutput.h 2. 显示驱动初化 DisplayDx ...

  5. 【Android SDM660源码分析】- 01 - 如何创建 UEFI XBL Protocol DXE_DRIVER 驱动及UEFI_APPLICATION 应用程序

    [Android SDM660源码分析]- 01 - 如何创建 UEFI XBL Protocol DXE_DRIVER 驱动及UEFI_APPLICATION 应用程序 一.创建DXE_DRIVER ...

  6. 【Android SDM660源码分析】- 04 - UEFI ABL LinuxLoader 代码分析

    [Android SDM660源码分析]- 04 - UEFI ABL LinuxLoader 代码分析 1. LinuxLoader.c 系列文章: <[Android SDM660开机流程] ...

  7. Android 音频源码分析——AndroidRecord录音(一)

    Android 音频源码分析--AndroidRecord录音(一) Android 音频源码分析--AndroidRecord录音(二) Android 音频源码分析--AndroidRecord音 ...

  8. Android框架源码分析——从设计模式角度看 Retrofit 核心源码

    Android框架源码分析--从设计模式角度看 Retrofit 核心源码 Retrofit中用到了许多常见的设计模式:代理模式.外观模式.构建者模式等.我们将从这三种设计模式入手,分析 Retrof ...

  9. 人人网官方Android客户端源码分析(1)

    ContentProvider是不同应用程序之间进行数据交换的标准API,ContentProvider以某种Uri的形式对外提供数据,允许其他应用访问或修改数据;其他应用程序使用ContentRes ...

最新文章

  1. 京东智能内容创作算法的演进与实践:基于关键词自动生成摘要
  2. Boost:compute::copy的复制数据测试程序
  3. matlab parfor不能用,matlab中parfor函数
  4. java向数组中插入元素
  5. windows 禁用ipv6服务_39.Dism++ Windows系统简洁优化
  6. 无处不在的container_of
  7. 数字图像处理-频率域滤波原理
  8. 瀑布流ListView
  9. python设计函数isleapyear_Python实战练习——打印日历教程
  10. linux 查看端口是否被占用 解决端口占用问题 address already in use
  11. 解析AI漫画系统CariGAN:这效果让漫画师颤抖!
  12. java 十进制十六进制转换_Java进制转换之十六进制转十进制
  13. 计算机常用单位的换算方法,常用单位的换算(含温度长度计算机单位面积以及数量含义).doc...
  14. Linux源码解析--从开机加电到main函数
  15. 网吧组网产品升级方案
  16. HTML做一个圣诞页面(纯html代码)
  17. Ubuntu1804 使用mondorescue 进行系统备份iso制作
  18. android获取热点主机ip和连接热点手机ip
  19. 车载冰箱E-mark认证要多长时间?
  20. python 去掉空格_Python去除多余空格

热门文章

  1. 【C 语言】文件操作 ( 配置文件读写 | 读取配置文件 | 函数接口形参 | 读取配置文件的逐行遍历操作 | 读取一行文本 | 查找字符 | 删除字符串前后空格 )
  2. 【C 语言】数组 ( 指针数组用法 | 菜单选择 )
  3. 【Android 逆向】获取安装在手机中的应用的 APK 包 ( 进入 adb shell | 获取 root 权限 | 进入 /data/app/ 目录 | 拷贝 base.apk 到外置存储 )
  4. 【SeeMusic】创建 SeeMusic 工程并编辑相关内容 ( 创建工程 | 导入 MIDI 文件 | 导入音频 | 导入视频 )
  5. 【Android 性能优化】应用启动优化 ( 方法追踪代码模板 | 示例项目 | SD 卡访问权限 | 示例代码 | 获取 Trace 文件 | Android Studio 查看文件)
  6. 【Kotlin】变量简介 ( 可空类型 | lateinit | 初始化判定 | 非空类型 | !! 与 ? 修饰符 | ?= ?. ?: 运算符 | 抽象属性变量)
  7. 如何将Android的AOSP仓库放置到自己的gitlab服务器上?
  8. mysql 触发器介绍
  9. 关于动态门户WEB博雅互动的源代码(HTML+CSS+javascript)
  10. Steam 导入已下载好的游戏