`
mypyg
  • 浏览: 549451 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Android 自定义控件外观

阅读更多
在程序开发中,android系统控件提供的外观往往距离我们要求的有一定差距,
此时我们可以通过一些方法来修改。
本文只讨论外观修改,在系统控件上进行功能扩充的自定义控件另外讨论。

首先我们看下系统的RadioButton:
RadioButton长成什么样子是由其Background、Button等属性决定的,Android系统
使用style定义了默认的属性,在android源码
android/frameworks/base/core/res/res/values/styles.xml中可以看到默认的定义:
<style name="Widget.CompoundButton.RadioButton">
        <item name="android:background">@android:drawable/btn_radio_label_background</item>
        <item name="android:button">@android:drawable/btn_radio</item>
</style>

即其背景图是btn_radio_label_background,其button的样子是btn_radio

btn_radio_label_background是什么?
其路径是android/frameworks/base/core/res/res/drawable-mdpi/btn_radio_label_background.9.png
可以看到是一个NinePatch图片,用来做背景,可以拉伸填充。

btn_radio是什么?
其路径是android/frameworks/base/core/res/res/drawable/btn_radio.xml
是个xml定义的drawable,打开看其内容:
<selector xmlns:android="http://schemas.android.com/apk/res/android">    
    <item android:state_checked="true" android:state_window_focused="false"
          android:drawable="@drawable/btn_radio_on" />
    <item android:state_checked="false" android:state_window_focused="false"
          android:drawable="@drawable/btn_radio_off" />

    <item android:state_checked="true" android:state_pressed="true"
          android:drawable="@drawable/btn_radio_on_pressed" />
    <item android:state_checked="false" android:state_pressed="true"
          android:drawable="@drawable/btn_radio_off_pressed" />

    <item android:state_checked="true" android:state_focused="true"
          android:drawable="@drawable/btn_radio_on_selected" />
    <item android:state_checked="false" android:state_focused="true"
          android:drawable="@drawable/btn_radio_off_selected" />

    <item android:state_checked="false" android:drawable="@drawable/btn_radio_off" />
    <item android:state_checked="true" android:drawable="@drawable/btn_radio_on" />
</selector>

定义了不同状态下radioButton长成什么样子。
如果不知道selector是什么,就要去看下Android SDK文档中Dev Guide->Application Resources->Resource Types。
以下面一个item为例:
<item android:state_checked="true" android:state_pressed="true"
          android:drawable="@drawable/btn_radio_on_pressed" />
意思即为当radiobutton被选中时,并且被按下时,其Button应该长成btn_radio_on_pressed这个样子。

文件是android/frameworks/base/core/res/res/drawable-mdpi/btn_radio_on_pressed.png

drawable的item中可以有以下属性:
android:drawable="@[package:]drawable/drawable_resource"
android:state_pressed=["true" | "false"]
android:state_focused=["true" | "false"]
android:state_selected=["true" | "false"]
android:state_active=["true" | "false"]
android:state_checkable=["true" | "false"]
android:state_checked=["true" | "false"]
android:state_enabled=["true" | "false"]
android:state_window_focused=["true" | "false"]
当按钮的状态和某个item匹配后,就会使用此item定义的drawable作为按钮图片。

从上面分析我们如果要修改RadioButton的外观,那么步骤应该是:
(1)制作一个9patch的图片作为背景图
准备一副PNG图片,其中白色为透明色,是否需要透明各人根据自己需要决定。

运行SDK/tools/draw9patch
在可伸缩的范围周围加上黑色的线告知系统这些区域可以伸缩。
制作完的图片,周围多了黑色线。

(2)针对不同的状态提供按钮图片
enabled, on: 紫色外框、红色中心点

enabled, off:只有紫色外框

enabled, on, pressed:黄色外框,红色中心点

enabled, off, pressed:黄色外框

disabled, on: 灰色外框、灰色中心点

disabled, off: 灰色外框

其余的状态此处就不再定义。
(3)使用xml描述一个drawable
在res/drawable/创建custom_radio_btn.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_enabled="true" android:state_checked="true" android:state_pressed="true"
          android:drawable="@drawable/enabled_on_pressed" />
          
    <item android:state_enabled="true" android:state_checked="false" android:state_pressed="true"
          android:drawable="@drawable/enabled_off_pressed" />

    <item android:state_enabled="true" android:state_checked="true"
          android:drawable="@drawable/enabled_on" />
          
    <item android:state_enabled="true" android:state_checked="false"
          android:drawable="@drawable/enabled_off" />
          
    <item android:state_enabled="false" android:state_checked="true"
          android:drawable="@drawable/disabled_on" />
          
    <item android:state_enabled="false" android:state_checked="false"
          android:drawable="@drawable/disabled_off" />              
</selector>

Item顺序是有讲究的,条件限定越细致,则应该放到前面。比如这儿如果把1,2行和3,4行的item交换,那么pressed的就永远无法触发了,因为有item已经满足条件返回了。可以理解为代码中的if语句。
(4)创建一个自定义的style,并应用到RaidioButton的style属性上
<style name="CustomRadioBtn">
    	<item name="android:background">@drawable/radio_btn_bg</item>
    	<item name="android:button">@drawable/custom_radio_btn</item>
</style>


运行ap即可看到此RadioButton的外观已经改变,此demo可以看到文字被按钮遮盖了一部分,
这儿是因第一步制作9patch图片时没有留出按钮图片空间来,稍作修改即可。


详细代码请参加最后一个附件。
  • 大小: 2 KB
  • 大小: 255 Bytes
  • 大小: 242 Bytes
  • 大小: 257 Bytes
  • 大小: 196 Bytes
  • 大小: 283 Bytes
  • 大小: 196 Bytes
  • 大小: 269 Bytes
  • 大小: 194 Bytes
  • 大小: 8.6 KB
12
1
分享到:
评论
4 楼 独行者311 2012-09-06  
感谢楼主分享。
3 楼 yangmaolinpl 2012-06-28  
学习楼主,非常感谢。
2 楼 TenAclock 2012-02-10  
学些了,谢谢作者分享~~
1 楼 zky314 2011-07-24  
受益颇多啊,感谢。

相关推荐

    android自定义控件介绍,重写控件

    本文将深入探讨Android自定义控件的概念、重要性以及如何通过重写已有控件来扩展其功能,帮助开发者从初阶迈进高阶。 首先,我们了解什么是自定义控件。在Android系统中,预置了大量的标准控件,如Button、TextView...

    Android自定义控件示例

    这个压缩包“CustomViews”很可能是包含了一系列Android自定义控件的示例项目,旨在帮助开发者理解和学习如何在Android Studio 1.0.2环境下创建和使用自定义控件。 自定义控件通常涉及以下关键知识点: 1. **...

    安卓自定义控件相关-Android自定义控件源码.rar

    这个压缩包"Android自定义控件源码.rar"包含了一些自定义控件的源代码,虽然不能保证每个都可直接运行,但它们提供了丰富的学习资源,帮助开发者理解和实践自定义控件的创建过程。下面将详细探讨Android自定义控件的...

    Android 自定义控件 组合控件

    在自定义控件开发过程中,这些资源文件同样扮演着至关重要的角色,它们帮助我们实现控件的外观和交互效果。 总结起来,Android自定义组合控件的实现涉及到了对Android UI框架的深入理解和实践,包括继承自定义View...

    Android 自定义控件简单Demo

    至此,我们完成了一个简单的Android自定义控件,它能展示图片和文字。然而,自定义控件的能力远不止于此。你可以添加更多的功能,如触摸事件处理、动画效果,甚至动态改变内容。通过深入理解Android的绘图API和布局...

    Android自定义控件的demo

    在Android开发中,自定义控件是提升应用独特性和用户体验的重要手段。本示例将深入讲解如何基于Android系统实现一个自定义的Button控件,该控件由一个ImageView和一个TextView组成,并添加了标签功能。以下我们将从...

    android 自定义控件实现demo收集 及 框架收集

    在Android开发中,自定义控件和框架的运用是提升应用独特性和性能的关键。下面将对"android 自定义控件实现demo收集 及 框架收集"这一主题进行深入探讨。 首先,自定义控件在Android应用开发中扮演着重要角色。它们...

    Android 编写自定义控件实例

    在Android开发中,自定义控件是提升应用独特性和用户体验的重要手段。本教程将通过一个具体的实例——saRoundProgressBarDemo,来教你如何编写一个自定义的圆形进度条控件。这个自定义控件不仅提供了基本的进度显示...

    Android自定义组合控件

    在Android开发中,自定义控件是提升应用界面独特性和用户体验的重要手段。本文将深入探讨如何根据【标题】"Android自定义...如果你下载并研究这个"自定义组合控件"的示例,相信你会对Android自定义控件有更深入的理解。

    android 自定义控件与特效

    在Android开发中,自定义控件与特效是提升应用界面独特性和用户...以上是Android自定义控件与特效的一些核心概念和实践技巧,开发者通过深入理解和熟练运用这些知识点,能够创建出独具特色且功能丰富的Android应用。

    Android自定义控件

    总之,"Android自定义控件"这个项目为我们提供了一个自定义圆形进度条的实例,展示了如何扩展系统控件并添加个性化功能。学习和理解这个项目可以帮助开发者提升自定义控件的制作技能,从而更好地满足应用界面设计的...

    Android 自定义控件

    以上就是Android自定义控件的一般流程和`StickyNavLayout`的关键特性。实际开发中,开发者通常会结合Android的属性动画、RecyclerView分组视图等高级特性,使自定义控件更加灵活和强大。同时,使用Kotlin的扩展函数...

    Android自定义控件步骤总结

    Android 自定义控件步骤总结 Android 自定义控件步骤总结是 Android 开发中非常重要的一部分。系统提供给我们的控件不能满足我们的需求,所以我们往往会自定义一些控件。在自定义过程中遵循以下几个步骤: 一、...

    Android自定义控件【仿IOS开关】

    首先,我们需要了解Android自定义控件的基本流程。自定义控件通常涉及以下步骤: 1. 创建一个新的Java类,继承自Android的View或ViewGroup类。在这个例子中,我们可以选择继承自CompoundButton,因为Toggle Switch...

    android之自定义开关控件

    在Android开发中,自定义控件是提升应用用户体验和界面美观度的重要手段。"android之自定义开关控件"这个主题旨在教你如何在Android平台上创建一个类似苹果iOS Toggle的自定义开关组件。以下是对这个主题的详细讲解...

    左右滑动自定义控件

    在Android开发中,自定义控件是提升用户体验和实现独特设计的重要手段。"左右滑动自定义控件"是一个专为Android平台设计的功能组件,它允许用户通过左右滑动来触发不同的操作或展示不同的内容。这个控件可以广泛应用...

    Android自定义控件视频下载链接

    本篇内容将深入探讨Android自定义控件的相关知识点,以帮助开发者更好地理解和运用这一技术。 一、自定义控件基础 1. 继承体系:自定义控件通常基于已有的View或ViewGroup类进行扩展。你可以选择直接继承View类,...

    Android-该自定义控件是一个可以滑动改变温度值的表盘控件

    通过研究这些内容,开发者不仅可以学习到如何创建滑动温度表盘控件,还能了解到Android自定义控件的完整流程,包括设计思路、代码实现、UI优化和文档编写等方面的知识。 总结来说,这个自定义控件是Android开发中的...

    Android自定义Progress控件的方法

    本文将详细介绍 Android 自定义 Progress 控件的方法,包括自定义控件的创建、布局设计、属性设置、进度条显示等方面的知识点。 自定义控件的创建 自定义控件是指根据业务需求,使用 Java 语言编写的控件类。...

    android自定义控件滑动开关源码

    在Android开发中,自定义控件是提升应用用户体验和界面独特性的关键。滑动开关(Slide Switch)是一种常见的UI元素,常用于开启或关闭某个功能。这篇博客文章的配套源码提供了一个自定义滑动开关的实现,让我们深入...

Global site tag (gtag.js) - Google Analytics