android shape 引用图片,Android开发之shape图形使用详解

本文详细介绍了如何在Android中使用shape创建自定义图形,包括空心圆角矩形和横、竖线虚线的实现方法。通过在res/drawable下创建XML文件,并在代码中引用,可以方便地生成并修改图形。同时,文章提到了硬件加速对图形绘制的影响,以及关闭硬件加速的几种方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

用代码生成图片,而且图片能随意的更改,既方便又节省空间,下面就介绍用shape生成自定义图形的方法

使用方式

在res/drawable目录下新建一个xml文件;

在代码中引用这个xml文件,引用方式和图片一样。

shape图形的属性认识

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

android:shape=["rectangle" | "oval" | "line" | "ring"]

//共有4种类型,矩形(默认)/椭圆形/直线形/环形

// 以下4个属性只有当类型为环形时才有效

android:innerRadius="dimension" //内环半径

android:innerRadiusRatio="float" //内环半径相对于环的宽度的比例,比如环的宽度为50,比例为2.5,那么内环半径为20

android:thickness="dimension" //环的厚度

android:thicknessRatio="float" //环的厚度相对于环的宽度的比例

android:useLevel="boolean"> //如果当做是LevelListDrawable使用时值为true,否则为false.

android:radius="dimension" //全部的圆角半径

android:topLeftRadius="dimension" //左上角的圆角半径

android:topRightRadius="dimension" //右上角的圆角半径

android:bottomLeftRadius="dimension" //左下角的圆角半径

android:bottomRightRadius="dimension" /> //右下角的圆角半径

android:type=["linear" | "radial" | "sweep"] //共有3中渐变类型,线性渐变(默认)/放射渐变/扫描式渐变

android:angle="integer" //渐变角度,必须为45的倍数,0为从左到右,90为从上到下

android:centerX="float" //渐变中心X的相当位置,范围为0~1

android:centerY="float" //渐变中心Y的相当位置,范围为0~1

android:startColor="color" //渐变开始点的颜色

android:centerColor="color" //渐变中间点的颜色,在开始与结束点之间

android:endColor="color" //渐变结束点的颜色

android:gradientRadius="float" //渐变的半径,只有当渐变类型为radial时才能使用

android:useLevel=["true" | "false"] /> //使用LevelListDrawable时就要设置为true。设为false时才有渐变效果

android:left="dimension"

android:top="dimension"

android:right="dimension"

android:bottom="dimension" />

android:width="dimension"

android:height="dimension" />

android:color="color" />

android:width="dimension" //描边的宽度

android:color="color" //描边的颜色

// 以下两个属性设置虚线

android:dashWidth="dimension" //虚线的宽度,值为0时是实线

android:dashGap="dimension" /> //虚线的间隔

图像案例

空心圆角矩形

drawable下shape的xml文件:

android:shape="rectangle">

android:width="@dimen/dp_1"

android:color="@color/c_ffffa543" />

布局使用

android:id="@+id/et_photo_describe"

android:layout_width="match_parent"

android:layout_height="@dimen/dp_112"

android:layout_below="@id/tv_photo_index"

android:layout_marginTop="@dimen/dp_10"

android:background="@drawable/bg_d_sp_photo_describe"

android:gravity="left|top"

android:hint="@string/text_hint_photo_describe"

android:paddingLeft="@dimen/dp_10"

android:paddingTop="@dimen/dp_5"

android:paddingRight="@dimen/dp_10"

android:textColorHint="@color/c_d7d7d9"

android:textSize="@dimen/sp_15" />

效果图:

be823ca62a58?utm_campaign=maleskine

image.png

横线虚线

drawable下shape的xml文件:

android:shape="line">

android:width="1dp"

android:color="@color/c_ffff9103"

android:dashWidth="8dp"

android:dashGap="4dp" />

布局使用

android:layerType="none"

android:id="@+id/v_line"

android:layout_width="match_parent"

android:layout_height="@dimen/dp_2"

android:layout_below="@id/tv_vote_info_content"

android:layout_marginTop="@dimen/dp_25"

android:background="@drawable/bg_d_sp_dotted_line_orange" />

效果图:

be823ca62a58?utm_campaign=maleskine

image.png

注意事项:

需要关闭硬件加速!!!

竖线虚线

分析:

android中的shape的绘制线条,直接绘制只能是横线,那么要绘制竖线需要将横线旋转90度才能实现竖线的效果

实现步骤:

layer-list节点中指定使用多重效果叠加

item节点中指定一个可以显示的内容

rotate节点指定条目旋转

fromDegrees属性指定旋转的其实角度

toDegrees属性指定旋转的终止角度

visible属性指定为可见

shape 节点中指定shape属性为线条line

stroke节点指定线 的属性

width指定线的宽度

color指定线的颜色

dashGap指定虚线的间隔

dashWidth指定小线段的长度

注意事项:

Android 3.0 (API level 11), 开始支持

所有的View 的canvas都会使用GPU,但是硬件的加速会占有一定的RAM。

在API >= 14上,默认是开启的,如果你的应用只是标准的View和Drawable,全局都打开硬件加速,是不会有任何问题的。

然而,硬件加速并不支持所有的2D画图的操作,这时开着它,可能会影响到你的自定义控件或者绘画,出现异常等行为,

所以android对于硬件加速提供了可选性

如果你的应用执行了自定义的绘画,可以通过在真机上测试开启硬件加速查找问题

需要关闭硬件加速功能,硬件加速的级别

Application

android:hardwareAccelerated="false"

...>

可以直接在activity做如何下配置:

android:name=".wallet.BuyFlowersActivity"

android:hardwareAccelerated="false" />

Window

getWindow().setFlags(

WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,

WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);

如果activity中关闭硬件加速可能会引发其他UI组件无法正常显示,可以在布局中将指定控件android:layerType="none"关闭硬件加速.

android:layerType="none"

android:id="@+id/v_line"

android:layout_width="match_parent"

android:layout_height="@dimen/dp_2"

android:layout_below="@id/tv_vote_info_content"

android:layout_marginTop="@dimen/dp_25"

android:background="@drawable/bg_d_sp_dotted_line_orange" />

也可以在代码中关闭

myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

两种获取是否支持硬件加速的方式

//returns true if the View is attached to a hardware accelerated window.

View.isHardwareAccelerated()

//returns true if the Canvas is hardware accelerated

Canvas.isHardwareAccelerated()

完整代码

android:left="-300dp"

android:right="-300dp">

android:fromDegrees="90"

android:visible="true">

android:width="1dp"

android:color="@color/c_ffffff"

android:dashGap="4dp"

android:dashWidth="8dp" />

效果图:

be823ca62a58?utm_campaign=maleskine

image.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值