ShapeDrawable:Android自定义背景

QuibblerQuibbler 2019-12-26 约 8 分钟 1956 次阅读

ShapeDrawable:Android自定义背景

自定义背景样式shape,在res/drawable目录下。一般通过setBackground()设置成TextView、Button等控件的背景。让程序员也可以定义多种多样的背景。

更多Drawable详见Android Drawable。

1、shape

自定义背景样式根标签<shape></shape>,形状shape有四种可以选择:rectangle、oval、line、ring。关于shape其实还有专门的形状类:Shape,详见Drawable中的形状:Shape。

<?xml version="1.0" encoding="utf-8"?>  
     <shape xmlns:android="http://schemas.android.com/apk/res/android"  
         android:shape="rectangle"> 
          
         <!-- rectangle:矩形、圆角矩形、弧形等  
             oval:圆、椭圆  
             line:线、实线、虚线  
             ring:环形 -->  
     </shape>

2、基本属性

shape的常用属性:size、solid、stroke、padding、gradient、corners等,来丰富Drawable背景样式。

2.1、size

size:大小,不设置则默认为match_parent最大填充

<size   
        android:width="integer"  
        android:height="integer" />

2.2、solid

solid:背景填充的颜色

<solid    
        android:color="color" />

2.3、stroke

stroke:刻画边线

<stroke    
        android:width="integer"  
        android:color="color"  
        android:dashWidth="integer"   <!-- 虚线长度 -->  
        android:dashGap="integer" />  <!-- 虚线间隔 -->

2.4、padding

padding:设置内容与形状边界的内间距

<padding   
        android:left="integer"  
        android:top="integer"  
        android:right="integer"  
        android:bottom="integer" />

2.5、gradient

gradient:渐变色。关于渐变色,在Shader着色器中有了解到一些,比如线性着色器LinearGradient,放射渐变着色器RadialGradient等等。详见《大有可为的着色器:Shader》。

<gradient    
        <!-- 渐变的角度,线性渐变时才有效,必须是45的倍数 -->  
        android:angle="integer"  
        <!-- 渐变中心的相对X、Y坐标,放射渐变时才有效 -->  
        android:centerX="integer"  
        android:centerY="integer"  
        <!-- 渐变的半径,放射渐变(radial)时才有效-->  
        android:gradientRadius="integer"  
        <!-- 渐变开始、中心、结束的颜色 -->  
        android:startColor="color"  
        android:centerColor="integer"  
        android:endColor="color"  
        <!-- 渐变的类型 linear线性、radial放射、sweep扫描-->  
        android:type=["linear" | "radial" | "sweep"]  
        <!--  是否可在LevelListDrawable中使用 -->  
        android:useLevel=["true" | "false"] />

2.6、corners

corners:圆角,只适用于rectangle类型

<corners  <!-- -->  
        android:radius="integer"    <!-- 圆角半径 -->  
        android:bottomLeftRadius="integer"  
        android:bottomRightRadius="integer"  
        android:topLeftRadius="integer"  
        android:topRightRadius="integer" />

示例:

<?xml version="1.0" encoding="utf-8"?><!--Monster UI-->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <!--搜索框小圆角-->
    <corners android:radius="6dp" />
    <!--搜索框描边-->
    <stroke
        android:width="1dp"
        android:color="#FFAAAAAA" />
    <size
        android:width="40dp"
        android:height="20dp" />
</shape>

相关资料:

          Docs > ShapeDrawable">Android Developers > Docs > ShapeDrawable

          Drawable resources

          Android 背景样式shape - rectangle矩形

          Android中shape的用法详解

          Android中shape属性详解

相关推荐

精选
ViewPager和PagerAdapter、FragmentPagerAdapter、FragmentStatePager
Android

ViewPager和PagerAdapter、FragmentPagerAdapter、FragmentStatePager

ViewPager1、ViewPagerandroidx.viewpager.widget.ViewPager,Android中使用非常广泛的控件,可以说是APP必备:首次打开引导页、页面Banner广告等。常用方法:setAdapter() 设置适配器setOffscreenPageLimit() 设置缓存的页面个数,默认是 1setCurrentItem() 跳转到特定的页面setOnPage

1.1k
获取Android内置WebView内核版本
Android

获取Android内置WebView内核版本

获取Android内置WebView内核版本竟然能遇到这样奇葩的事情,网页用的技术过于新颖,以至于只支持高版本Chromium内核的,低版本安卓系统中内置的内核版本较低,无法加载前端页面。1、设置查看在系统设置里 > 应用 > 应用管理 > 显示系统应用,查看WebView组件:2、页面查看通过WebView发起的网络请求,都会带上浏览器的UA,通常页面都可以通过UA判断浏览器的内核版本。这里有两

1.1w
Android 14适配总结
Android

Android 14适配总结

Android 14适配总结毕业工作至今已经适配了三个Android大版本,从Android 11到Android 12、再到Android 13。2023年,Google即将推出的Android 14,上半年已经开始第一批适配。现在,第四个Android版本已经适配完,总结记录一下。1、Android 14计划Google一般会在2月份对外发布预告,同时放出开发者预览版。“拉通”各大平台、厂商以

1.1w

评论 (1)

评论功能已关闭,仅展示历史评论
Quibbler
Quibbler

Shape划线


        用shape可以自定义简单的背景,复杂的就需要交给UI设计矢量图。划线使用line形状,本来想设置一个1dp,长24dp的线。没想到size的height属性设置为1dp就不显示了,似乎最小显示高度是2dp。

	<?xml version="1.0" encoding="utf-8"?>
	<shape xmlns:android="http://schemas.android.com/apk/res/android"
	    android:shape="line">
	    
	    <size
	        android:width="24dp"
	        android:height="1dp" />
	        
	    <stroke
	        android:width="1dp"
	        android:color="@color/colorAccent" />
	        
	</shape>

        上面看似没毛病的设置,线条长24dp、高度也就是粗1dp。同样的画笔也是设置为1dp,同时设置了线条画笔颜色。但是运行起来就是没有任何线条,又遇到Android中的坑点了。


        不慌,程序员不折腾就不叫程序员。把size的height改成2dp呢?

    <size
        android:width="24dp"
        android:height="1dp" />

        再运行就显示一条线,2dp的宽度似乎显得有点粗(自己看着都不太满意)。

        再把stroke的width改成2dp,这时候又不显示line。难道莫非size的height属性必须至少比画笔stroke width属性大倍?事实如此,当size的高度小于画笔stroke width宽度就无法显示。相信size 的任何一边值小于画笔宽度都不能显示出形状。


        这里我们只需要划线,为什么要指定size,单独指定其中的width,线长度不就行了?确实可以。而且线的宽度就是画笔的宽度。

	<?xml version="1.0" encoding="utf-8"?>
	<shape xmlns:android="http://schemas.android.com/apk/res/android"
	    android:shape="line">
	    
	    <size android:width="24dp" />
	    
	    <stroke
	        android:width="1dp"
	        android:color="@color/colorAccent" />
	        
	</shape>

        可以完美的画出一个1dp、长24dp的线条。


        画虚线可以设置stroke的两个属性:dashWidth、dashGap。需要调整size的width和height得到想要的虚线。

	<?xml version="1.0" encoding="utf-8"?>
	<shape xmlns:android="http://schemas.android.com/apk/res/android"
	    android:shape="line">
	    
	    <size
	        android:width="8dp"
	        android:height="2dp"/>
	        
	    <stroke
	        android:width="1dp"
	        android:color="@color/search_list_item_description_color_new"
	        android:dashWidth="10dp"
	        android:dashGap="4dp" />
	        
	</shape>



学习资料:

        Android 用 xml View shape画线

        Android 关于shape画虚线