我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android Drawable必备知识小结

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android Drawable必备知识小结

什么是Drawable

首先Drawable是一个抽象类,表示的是可以在Canvas中绘制的图像,常被用作一个view的背景,有多种实现类完成不同的功能。其次Drawable大致可以分为这几类:图片、由颜色构成的图像。一般用xml中进行定义。

Drawable的继承体系

Drawable的实现类及标签

Drawable

内部宽高的获取

    getIntrinsicHeight、getIntrinsicWidth
    - 当Drawable由图片构成时方法返回的是图片的宽高
    -  当Drawable由颜色构成时则没有宽高的概念,返回-1

各类Drawable及其用法

BitmapDrawable

用于显示一张图片,如下示例


<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
 android:antialias="true"
 android:dither="true"
 android:filter="true"
 android:gravity="top"
 android:class="lazy" data-src="@mipmap/girl"
 android:tileMode="repeat" />

常用属性

android:antialias 是否开启抗锯齿
android:dither 是否开启防抖动
android:filter 是否开启过滤效果
android:gravity 用于对图片进行定位
android:class="lazy" data-src 图片资源id
android:tileMode 平铺模式,repeat、mirror、clamp三种

ColorDrawable

代表了单色可绘制区域,包装了一种固定的颜色,在画布上绘制一块单色的区域。

示例:


<?xml version="1.0" encoding="utf-8"?>
<color xmlns:android="http://schemas.android.com/apk/res/android" android:color="@color/colorAccent">
</color>

还可以用代码创建

ColorDrawable drawable = new ColorDrawable(int color); //传入一个color的integer值

NinePatchDrawable

即9-patch图,可以根据内容进行自由缩放宽高而不失真

示例:


<?xml version="1.0" encoding="utf-8"?>
<nine-patch xmlns:android="http://schemas.android.com/apk/res/android"
 android:dither="true"
 android:filter="true"
 android:class="lazy" data-src="@color/colorAccent">
</nine-patch>

用draw9patch设定缩放区域

图中1、2方向表示在draw9patch中绘制黑线,黑线长度交集为可拉伸的范围
图中3、4方向黑线长度交集表示内容可以填充的区域

ShapeDrawable

通过颜色来构造图形,既可以为纯色图形,也可以为具有渐变效果的图形。能构成的图形有rectangle、oval、ring、line

具有渐变效果的圆示例:


<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
 android:shape="oval">
 <gradient
  android:angle="45"
  android:centerColor="@color/colorAccent"
  android:centerX="50%"
  android:centerY="50%"
  android:endColor="@color/colorPrimary"
  android:gradientRadius="150dp"
  android:startColor="@color/colorPrimaryDark"
  android:type="sweep" />
 <size
  android:width="260dp"
  android:height="260dp" />
</shape>

注意:1、Android:angle值必须为45的倍数 2、oval用于绘制椭圆,当size的宽高相等时绘制成圆

圆环示例:


<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
 android:innerRadius="100dp"
 android:shape="ring"
 android:thickness="10dp"
 android:useLevel="false" >
 <stroke
  android:width="10dp"
  android:color="@color/colorAccent" />
</shape>

注:
1、android:useLevel设置为false,否则无法显示理想效果
2、innerRadius为圆环内半径,innerRadiusRation为内半径占圆环宽度的比率,两者以innerRadius为主
3、thickness为圆环的宽度,thicknessRatio为此宽度占圆环宽度的比率,以thickness为主

常用属性

- android:shape 要绘制的形状,rectangle、oval、ring、line
- <stroke> 形状的描边,有如下属性
        - android:width 描边的宽度
        - android:color 描边的颜色
        - android:dashGap 绘制虚线的线宽
        - android:dashWidth 绘制虚线的线段间隔 (要绘制虚线,后两者均不能为0)
-<solid> 纯色填充,android:color指定shape颜色
- <gradient> 渐变效果,与solid不可一起用,有如下属性
        - android:angle 渐变的角度,必须为45的倍数
        - android:startColor 渐变的起始颜色
        - android:centerColor 渐变的中间颜色
        - android:endColor 渐变的结束颜色
        - android:centerX 渐变的中心点横坐标
        - android:centerY 渐变的中心点纵坐标
        - android:gradientRadius 渐变半径
        - android:type 渐变类型,linear(线性)、sweep(扫视)、radial(径向)
- <corners> 表示矩形(rectangle)的四个角的角度,不适用于其他shape ,有如下属性
        - android:topLeftRadius、android:topRightRadius、android:bottomLeftRadius、android:bottomRightRadius 分别为设置左上角、右上角、左下角、右下角的角度
        - android:radius 为四角设置相同角度,优先级低,会被其他四个属性覆盖
- <size> shape的宽高,对应着android:width、android:height
        -  shape默认无宽高,getIntrinsicHeight、getIntrinsicWidth返回-1
        -  通过size可以设置其宽高,但作为view背景时任然会被拉伸或缩小为 view大小
- <padding> 设置容纳shape的view的空白间距

StateListDrawable

可以看作是一个状态选择器,通过view不同的状态选择对应的item中的drawable显示

示例:


<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
 <item android:drawable="@color/colorPrimaryDark" android:state_pressed="false"></item>
 <item android:drawable="@color/colorAccent" android:state_pressed="true"></item>
</selector>

常见状态

android:state_pressed 当按住一个view时,按下的状态
android:state_checked  当一个view被选中时,适用于CheckBox
android:state_selected  当一个view被选择时
android:state_enabled  当一个view处于可用状态
android:state_focused  当view获取焦点

LayerDeawable

表示的是一种分层的的Drawable集合,类似于ps中的图层的概念,将多个drawable放在不同的层上面形成一种叠加的效果

示例:


<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
 <item android:drawable="@mipmap/night" />
 <item
  android:drawable="@mipmap/photo6"
  android:gravity="center" />
</layer-list>

注意事项:

1、layer-list可以包含多个item,每个item表示一个drawable,并且后添加的item会覆盖到之前添加的item上面
2、默认情况下,layer-list所有的drawable都会缩放至view大大小,通过设施android:gravity可以调节缩放的效果
3、可以设置上下左右偏移量,android:top、android:bottom、android:left、android:right

LevelListDrawable

表示一个drawable集合,集合中的每一个Drawable都有一个等级(level),通过设置不同的等级,可以使LevelListDrawable切换至不同的Drawable。等级范围在0~10000之间, android:maxLevel设置最大level, android:minLevel设置最小level
示例:


<?xml version="1.0" encoding="utf-8"?>
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
 <item
  android:drawable="@mipmap/photo0"
  android:maxLevel="20"
  android:minLevel="10" />
 <item
  android:drawable="@mipmap/photo1"
  android:maxLevel="40"
  android:minLevel="30" />
</level-list>

通过设置level可切换不同的Drawable,在代码中


 //将ImageView的背景切换为photo1, 35 在30~40之间
 iv.setImageLevel(35); 
 //将ImageView的背景切换为photo0, 15在10~20之间
 iv.setImageLevel(15);

TransitionDrawable

LayerDeawable的子类,用于实现连个Drawable的淡入淡出效果
示例:

xml文件定义


<?xml version="1.0" encoding="utf-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android">
 <item android:drawable="@mipmap/night" />
 <item android:drawable="@mipmap/photo6" />
</transition>

给ImageView设置class="lazy" data-src,在java代码中


 iv= (ImageView) findViewById(R.id.iv_transition);
 drawable = (TransitionDrawable) iv.getDrawable();
 drawable.startTransition(1000); // 实现淡入淡出效果
 drawable.reverseTransition(1000);

InsetDrawable

嵌入其他Drawable,并可以在四周保留一定的间距
示例:


<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
 android:drawable="@mipmap/photo6"
 android:inset="20dp">
</inset>

ScaleDrawable

根据等级将一个Drawable缩放到一定的比例,当level为0时不可见,当level为10000时无缩放效果
示例:


<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
 android:drawable="@mipmap/night"
 android:scaleGravity="center"
 android:scaleHeight="50%"
 android:scaleWidth="50%" />

要显示出效果,必须设置level大于0


 iv = (ImageView) findViewById(R.id.iv_scale);
 ScaleDrawable drawable= (ScaleDrawable) iv.getDrawable();
 drawable.setLevel(1);

- android:scaleHeight="percentage",android:scaleWidth="percentage",设置宽高缩放为原来的比例为(100%-percentage)
- 设置level越大,图像显示越大

ClipDrawable

根据自己的等级(level)来对另一个Drawable进行裁剪,裁剪的方向由android:clipOrientation、android:gravity共同决定。设置level进行裁剪,level的大小从0到10000,level为0时完全不显示,为10000时完全显示
xml定义


<?xml version="1.0" encoding="utf-8"?>
<clip xmlns:android="http://schemas.android.com/apk/res/android"
 android:clipOrientation="horizontal"
 android:drawable="@mipmap/night"
 android:gravity="right"></clip>

 <ImageView
  android:id="@+id/iv_clip"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:class="lazy" data-src="@drawable/drawable_clip" />

通过设置level来裁剪


 ImageView iv = (ImageView) findViewById(R.id.iv_clip);
 ClipDrawable drawable= (ClipDrawable) iv.getDrawable();
 drawable.setLevel(5000); // 设置的level越大裁剪的范围越小

属性

android:clipOrientation ,horizontal 水平方向裁剪,vertical 垂直方向裁剪
android:gravity ,配合裁剪方向

自定义Drawable

自定义圆形Drawable


package com.yu.drawablelearing;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.Shader;
import android.graphics.drawable.Drawable;
public class CircleDrawable extends Drawable{
 private int radius;
 private int mWidth;
 private int mHeight;
 private Paint mPaint;
 @Override
 public void draw(Canvas canvas) {
  canvas.drawCircle(mWidth/2,mHeight/2,radius,mPaint);
 }
 public CircleDrawable(Bitmap bitmap) {
  radius = Math.min(bitmap.getWidth(), bitmap.getHeight())/2;
  mWidth = bitmap.getWidth();
  mHeight = bitmap.getHeight();
  BitmapShader bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
  mPaint = new Paint();
  mPaint.setShader(bitmapShader);
  mPaint.setAntiAlias(true);
 }
 @Override
 public void setAlpha(int alpha) {
  mPaint.setAlpha(alpha);
  invalidateSelf();
 }
 @Override
 public void setColorFilter(ColorFilter colorFilter) {
  mPaint.setColorFilter(colorFilter);
  invalidateSelf();
 }
 @Override
 public int getOpacity() {
  return PixelFormat.TRANSLUCENT;
 }
 @Override
 public int getIntrinsicHeight() {
  return mHeight;
 }
 @Override
 public int getIntrinsicWidth() {
  return mWidth;
 }
}

自定义带圆角的矩形Drawable


package com.yu.drawablelearing;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.RectF;
import android.graphics.Shader;
import android.graphics.drawable.Drawable;

public class RoundRectangleDrawable extends Drawable {
 private RectF rectF;
 private Paint mPaint;
 Bitmap mBitmap;
 @Override
 public void draw(Canvas canvas) {
  canvas.drawRoundRect(rectF, mBitmap.getWidth()/6,mBitmap.getHeight()/6, mPaint);
 }
 public RoundRectangleDrawable(Bitmap bitmap) {
  mBitmap = bitmap;
  mPaint = new Paint();
  BitmapShader bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
  mPaint.setAntiAlias(true);
  mPaint.setShader(bitmapShader);
 }
 @Override
 public void setAlpha(int alpha) {
  mPaint.setAlpha(alpha);
  invalidateSelf();
 }
 @Override
 public void setColorFilter(ColorFilter colorFilter) {
  mPaint.setColorFilter(colorFilter);
  invalidateSelf();
 }
 @Override
 public void setBounds(int left, int top, int right, int bottom) {
  super.setBounds(left, top, right, bottom);
  rectF = new RectF(left, top, right, bottom);
 }
 @Override
 public int getOpacity() {
  return PixelFormat.TRANSLUCENT;
 }
 @Override
 public int getIntrinsicWidth() {
  return mBitmap.getWidth();
 }
 @Override
 public int getIntrinsicHeight() {
  return mBitmap.getHeight();
 }
}

自定义Drawable的一般步骤

 1.  自定义Drawable类继承自Drawable
 2.  实现getOpacity,setColorFilter,setAlpha等方法
 3.  在onDraw方法中进行绘制
 4.  若自定义的Drawable有固定的大小,则需实现getIntrinsicWidth、getIntrinsicHeight方法

您可能感兴趣的文章:Android中一种巧妙的drawable.xml替代方案分享Android RippleDrawable 水波纹/涟漪效果的实现Android自定义Drawable之在Drawable中部指定透明区域方法示例浅谈Android中Drawable使用知识总结Android开发基于Drawable实现圆角矩形的方法Android自定义Drawable实现圆角效果Android Bitmap和Drawable的对比Android Drawable和Bitmap的转换实例详解Android DrawableTextView图片文字居中显示实例Android drawable微技巧,你不知道的drawable细节


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android Drawable必备知识小结

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android Drawable必备知识小结

什么是Drawable 首先Drawable是一个抽象类,表示的是可以在Canvas中绘制的图像,常被用作一个view的背景,有多种实现类完成不同的功能。其次Drawable大致可以分为这几类:图片、由颜色构成的图像。一般用xml中进行定义
2022-06-06

Android签名知识小结

一、为什么要签名开发Android的人这么多,完全有可能大家都把类名,包名起成了一个同样的名字,这时候如何区分?签名这时候就是起区分作用的。由于开发商可能通过使用相同的Package Name来混淆替换已经安装的程序,签名可以保证相当名字,
2022-06-06

Android开发必备知识点有哪些

这篇文章主要介绍“Android开发必备知识点有哪些”,在日常操作中,相信很多人在Android开发必备知识点有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Android开发必备知识点有哪些”的疑惑有所
2023-06-04

关于Android中drawable必知的一些规则

前言一入 Android 深似海,相信很多 Android 开发者深有体会,Android 系统版本的碎片化,Android 硬件设备的多样性,第三方 Rom 的不确定因素。现在想开发一个合格的商业化 App 真的不容易,先不说别的,应用的
2022-06-06

Android网络判断知识小结

Android中判断当前网络是否可用 应用场景:实现判断当前网络是否可用当前有可用网络,如下图:当前没有可用网络,如下图:实现步骤:1、获取ConnectivityManager对象Context context = activity.g
2022-06-06

javaweb必备知识点

一、WEB应用程序B/S ( browser/server ,浏览器/服务器)架构基于HTTP传输协议(超文本传输协议,回忆HTML的名字:超文本标记语言)WEB程序必须要运行在web容器上,如Tomcat /Jboss/WebLogic等二、HTTP协议HT
2015-12-21

详解Android创建Handler的必备知识点

本篇文章主要介绍Handler中需要了解的几个必备知识点,比如Handler创建、异步Handler是个啥及如何创建,感兴趣的小伙伴快跟随小编一起学习一下
2022-11-13

Android手机刷机知识小总结

其实安卓手机都是大同小异,刷机好去客服哦,不然刷成板砖没人负责。本教程只是对Android手机刷机知识的普遍总结,所有的Android手机都可以参考。现在的刷机方法很多,而且不一样的手机刷机方法不一样。下面的小总结仅供参考。1、什么是roo
2022-06-06

单身男生必备知识3

搭讪技巧之心理学角度分析按照心理动力学的方法,搭讪时的紧张可以分成两种:开始前的紧张和开始后的紧张——开始前的紧张本质上是让当事者逃避行动,而开始后的紧张其实是让当事者回避责任。就像炎症是身体的自动保护反应,人的不良情绪也是一种防御机制,保
2023-01-31

域名必备知识有哪些

这篇文章主要介绍了域名必备知识有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1.域名后缀有什么含义?如何选择使用这些后缀域名?在国内主要有com、net、cn、org等
2023-06-10

了解Golang:开发者必备知识

Golang,又称为Go语言,是一种由Google开发的开源编程语言。自2007年发布以来,Golang在软件开发领域逐渐崭露头角,得到了越来越多开发者的青睐。作为一种静态类型、编译型语言,Golang拥有诸多优点,如高效的并发处理能力、简
了解Golang:开发者必备知识
2024-02-23

Android开发必备知识 为什么说Kotlin值得一试

1、Hello, KotlinBugly 技术干货系列内容主要涉及移动开发方向,是由 Bugly 邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创,转载请标明出处。1.1 Kotlin的身世 写了许久Java
2023-05-31

Android学习(小知识点)

Android学习(小知识点) 一、欢迎使用界面 二、隐藏标题栏和状态栏+自定义标题栏 三、Butter+EditText模板 四、ScrollView布局使用 五、弹窗 六、menu创建 附加: Android之RecyclerView(
2022-06-06

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录