Android自定义Button的“款式”

简介: 要想让你的button呈现出一种不一样的外观,一般会采取以下两种形式采用selector里面加图片的方式采用selector用shape进行代码控制的方式对第一种方式而言,只需要注意好“状态对应的优先级的程度”就可以了,否则会导致所设置的item不起作用的情形...

要想让你的button呈现出一种不一样的外观,一般会采取以下两种形式

  • 采用selector里面加图片的方式
  • 采用selector用shape进行代码控制的方式

对第一种方式而言,只需要注意好“状态对应的优先级的程度”就可以了,否则会导致所设置的item不起作用的情形


如下是简单的使用

<?xml version="1.0" encoding="utf-8" ?>   
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 默认时的背景图片-->  
  <item android:drawable="@drawable/pic1" />   
<!-- 没有焦点时的背景图片 -->  
  <item android:state_window_focused="false"   
        android:drawable="@drawable/pic1" />   
<!-- 非触摸模式下获得焦点并单击时的背景图片 -->  
  <item android:state_focused="true" android:state_pressed="true"   android:drawable= "@drawable/pic2" />

<!-- 触摸模式下单击时的背景图片-->  

<item android:state_focused="false" android:state_pressed="true"   android:drawable="@drawable/pic3" />  

<!--选中时的图片背景-->  

  <item android:state_selected="true"   android:drawable="@drawable/pic4" />   

<!--获得焦点时的图片背景-->  

  <item android:state_focused="true"   android:drawable="@drawable/pic5" />   
</selector>

可能你已经注意到了,item对应了四个不同的状态;

  • android:state_selected是选中
  • android:state_focused是获得焦点
  • android:state_pressed是点击
  • android:state_enabled是设置是否响应事件,指所有事件

根据这些状态同样可以设置button的selector效果。也可以设置selector改变button中的文字状态。


xml文件创建好了,下一步就是如何使用了。方法很简单,就是在button的xml文件中加上android:background=”@drawable/mybutton”就可以了


接下来是通过控制xml代码来实现对按钮的外观的改变,主要是通过shape的以下几个属性,

  • gradient//渐变
  • stroke;//描边
  • corner;//圆角
  • pading;//边距

下面一起看一个例子吧

<?xml version="1.0" encoding="utf-8"?>  
    <selector  
        xmlns:android="http://schemas.android.com/apk/res/android">  
        <item android:state_pressed="true" >  
            <shape>  
                <!-- 渐变 -->  
                <gradient  
                    android:startColor="#ff8c00"  
                    android:endColor="#FFFFFF"  
                    android:type="radial"  
                    android:gradientRadius="50" />  
                <!-- 描边 -->  
                <stroke  
                    android:width="2dp"  
                    android:color="#dcdcdc"  
                    android:dashWidth="5dp"   
                    android:dashGap="3dp" />  
                <!-- 圆角 -->  
                <corners  
                    android:radius="2dp" />  
                <padding  
                    android:left="10dp"  
                    android:top="10dp"  
                    android:right="10dp"  
                    android:bottom="10dp" />  
            </shape>  
        </item>  

        <item android:state_focused="true" >  
            <shape>  
                <gradient  
                    android:startColor="#ffc2b7"  
                    android:endColor="#ffc2b7"  
                    android:angle="270" />  
                <stroke  
                    android:width="2dp"  
                    android:color="#dcdcdc" />  
                <corners  
                    android:radius="2dp" />  
                <padding  
                    android:left="10dp"  
                    android:top="10dp"  
                    android:right="10dp"  
                    android:bottom="10dp" />  
            </shape>  
        </item>  

        <item>         
            <shape>  
                <solid android:color="#ff9d77"/>  
                <stroke  
                    android:width="2dp"  
                    android:color="#fad3cf" />  
                <corners   
                    android:topRightRadius="5dp"  
                    android:bottomLeftRadius="5dp"  
                    android:topLeftRadius="0dp"  
                    android:bottomRightRadius="0dp"  
                />  
                <padding  
                    android:left="10dp"  
                    android:top="10dp"  
                    android:right="10dp"  
                    android:bottom="10dp" />  
            </shape>  
        </item>  
    </selector>  



下面是从网上找到的一些具体的解释信息,总结得很好

solid:实心,就是填充的意思
android:color指定填充的颜色
gradient:渐变
android:startColor和android:endColor分别为起始和结束颜色,ndroid:angle是渐变角度,必须为45的整数倍。
另外渐变默认的模式为android:type="linear",即线性渐变,可以指定渐变为径向渐变,android:type="radial",径向渐变需要指定半径android:gradientRadius="50"。
stroke:描边
android:width="2dp" 描边的宽度,android:color 描边的颜色。
我们还可以把描边弄成虚线的形式,设置方式为:
android:dashWidth="5dp" 
android:dashGap="3dp"
其中android:dashWidth表示'-'这样一个横线的宽度,android:dashGap表示之间隔开的距离。
corners:圆角
android:radius为角的弧度,值越大角越圆。
我们还可以把四个角设定成不同的角度,方法为:
<corners 
        android:topRightRadius="20dp"    右上角
        android:bottomLeftRadius="20dp"    右下角
        android:topLeftRadius="1dp"    左上角
        android:bottomRightRadius="0dp"    左下角
 />
这里有个地方需要注意,bottomLeftRadius是右下角,而不是左下角,这个有点郁闷,不过不影响使用,记得别搞错了就行。
还有网上看到有人说设置成0dp无效,不过我在测试中发现是可以的,我用的是2.2,可能修复了这个问题吧,如果无效的话那就只能设成1dp了。
padding:间隔

总结:
使用第一种方式,方便快捷。但是缺点就是在图片很多时就很有可能会导致出现OutOfMemoryError的错误,这样我们还得手动的修改所用到的图片的大小,还是比较繁琐的;而采用第二种方式就给我们带来了很大的灵活性,我们可以随心所欲的进行对按钮的外观的修改,而且相对而言,基本上不会出现第一种方式的内存危机。

目录
相关文章
|
3天前
|
存储 Shell Android开发
基于Android P,自定义Android开机动画的方法
本文详细介绍了基于Android P系统自定义开机动画的步骤,包括动画文件结构、脚本编写、ZIP打包方法以及如何将自定义动画集成到AOSP源码中。
23 2
基于Android P,自定义Android开机动画的方法
|
2天前
|
测试技术 Android开发 Python
探索软件测试的艺术:从基础到高级安卓应用开发中的自定义视图
【8月更文挑战第29天】在软件开发的世界中,测试是不可或缺的一环。它如同艺术一般,需要精细的技巧和深厚的知识。本文旨在通过浅显易懂的语言,引领读者从软件测试的基础出发,逐步深入到更复杂的测试策略和工具的使用,最终达到能够独立进行高效测试的水平。我们将一起探索如何通过不同的测试方法来确保软件的质量和性能,就像艺术家通过不同的色彩和笔触来完成一幅画作一样。
|
1天前
|
供应链 物联网 区块链
未来触手可及:探索新兴技术的趋势与应用安卓开发中的自定义视图:从基础到进阶
【8月更文挑战第30天】随着科技的飞速发展,新兴技术如区块链、物联网和虚拟现实正在重塑我们的世界。本文将深入探讨这些技术的发展趋势和应用场景,带你领略未来的可能性。
|
1天前
|
XML 搜索推荐 Android开发
安卓开发中的自定义View组件实践
【8月更文挑战第30天】探索Android世界,自定义View是提升应用界面的关键。本文以简洁的语言带你了解如何创建自定义View,从基础到高级技巧,一步步打造个性化的UI组件。
|
3天前
|
Android开发
Android在rootdir根目录创建自定义目录和挂载点的方法
本文介绍了在Android高通平台的根目录下创建自定义目录和挂载点的方法,通过修改Android.mk文件并使用`LOCAL_POST_INSTALL_CMD`变量在编译过程中添加目录,最终在ramdisk.img的系统根路径下成功创建了`/factory/bin`目录。
12 1
|
5天前
|
前端开发 Android开发 开发者
安卓开发中的自定义视图:构建你的第一个控件
【8月更文挑战第26天】在安卓开发的浩瀚海洋中,自定义视图是一块充满魔力的乐土。它不仅是开发者展示创造力的舞台,更是实现独特用户体验的关键。本文将带你步入自定义视图的世界,从基础概念到实战应用,一步步教你如何打造自己的第一个控件。无论你是初学者还是有经验的开发者,这篇文章都将为你的开发之旅增添新的风景。
|
2月前
|
Android开发
Android面试题之自定义View注意事项
在Android开发中,自定义View主要分为四类:直接继承View重写onDraw,继承ViewGroup创建布局,扩展特定View如TextView,以及继承特定ViewGroup。实现时需注意:支持wrap_content通过onMeasure处理,支持padding需在onDraw或onMeasure/onLayout中处理。避免在View中使用Handler,使用post系列方法代替。记得在onDetachedFromWindow时停止线程和动画以防止内存泄漏。处理滑动嵌套时解决滑动冲突,并避免在onDraw中大量创建临时对象。
32 4
|
2月前
|
机器学习/深度学习 人工智能 算法
探索AI在医疗影像分析中的应用探索安卓开发中的自定义View组件
【7月更文挑战第31天】随着人工智能技术的飞速发展,其在医疗健康领域的应用日益广泛。本文将聚焦于AI技术在医疗影像分析中的运用,探讨其如何通过深度学习模型提高诊断的准确性和效率。我们将介绍一些关键的深度学习算法,并通过实际代码示例展示这些算法是如何应用于医学影像的处理和分析中。文章旨在为读者提供对AI在医疗领域应用的深刻理解和实用知识。
25 0
|
2月前
|
前端开发 API Android开发
Android自定义View之Canvas一文搞定
这篇文章介绍了Android自定义View中如何使用Canvas和Paint来绘制图形。Canvas可理解为画布,用于绘制各种形状如文字、点、线、矩形、圆角矩形、圆和弧。常见API包括`drawText()`、`drawPoint()`、`drawLine()`、`drawRect()`等。文章还提到了Canvas的保存、恢复、平移和旋转方法,通过绘制钟表盘的例子展示了如何实际应用。总结关键点:Canvas与Paint结合用于图像绘制,掌握Canvas的基本绘图函数及坐标变换操作是自定义View的关键。
31 0
Android自定义View之Canvas一文搞定
|
2月前
|
消息中间件 前端开发 Android开发
Android面试题自定义View之Window、ViewRootImpl和View的三大流程
Android开发中,View的三大核心流程包括measure(测量)、layout(布局)和draw(绘制)。MeasureSpec类在测量过程中起到关键作用,它结合尺寸大小和模式(EXACTLY、AT_MOST、UNSPECIFIED)来指定View应如何测量。onMeasure方法用于自定义View的测量,布局阶段,ViewGroup调用onLayout确定子元素位置,而draw阶段按照特定顺序绘制背景、内容、子元素和装饰。整个流程始于ViewRootImpl的performTraversals,该方法触发测量、布局和绘制。
29 0