导航:首页 > 操作系统 > androiddrawablexml

androiddrawablexml

发布时间:2023-03-20 13:32:10

android绘图基础--Canvas和Drawable

Github链接

画2D图形有两种方法:

Canvas实际上是封装了各种draw方法的类,调用draw方法把图形绘制到底层的Surface上,即绘制在Window上。

这个例子中构造了两个Canvas和一个Bitmap,分别调用其draw方法,先是mCanvas往Bitmap里绘制一个方块,再在onDraw方法内调用canvas.drawBitmap绘制这个方块。

思考一个问题,为什么mCanvas需要设置Bitmap?

很简单,因为它没有持有一块内存地址,自然没法绘制。来看一下draw的起点ViewRootImpl(软件绘制,不开启硬件加速下)。

这个通过mSurface.lockCanvas返回的Canvas是View.draw的canvas变量,所以当1,2情况时,Canvas都持有一个Bitmap,指向共享内存里的某一小块,当调用Canvas.draw方法时就能绘制出东西。但对于自定义Canvas来说并不是,即使设置一个Bitmap和绘制了Bitmap,但不往共享内存上写,屏幕上是不会显示的,SurfaceView同理,通过Surface.lockCanvas获取持有共享内存的Canvas,绘制完毕后调用Surface.unlockCanvasAndPost把绘制内容显示到surface上并release掉Canvas。

顺带一提Canvas.save和Canvas.restore方法,如下Demo

效果图如

画的是三个颜色和旋转角度都不同的小方形。

步骤1把默认坐标系旋转20°,画出第一个蓝色的方形,步骤2保存当前的matrix(旋转了20°),继续旋转20°,此时坐标系已经旋转了40°,画出第二个黄色的方块,步骤3,恢复上一步保存的matrix(旋转了20°),此时坐标系还是旋转了20°,步骤4,再旋转40°,此时坐标系旋转了60°,画出第三个黑色方块。

Canvas.save用于保存当前matrix和clip,Canvas.restore用于恢复上次保存的matrix和clip。

Drawable是一个能画出来的物体的抽象,使用前需要调用setBounds确定位置和大小,通过getIntrinsicHeight和getIntrinsicWidth取到实际大小。Drawable可以有几种形式存在:Bitmap、Nine Patch、Vector、Shape、Layers等。

从Resource.getDrawable会判断是否.xml结尾,不是的话走6,7步,如果从xml中读取,需要getResource.getDrawable -> ResourceImpl.loadDrawableForCookie -> drawable.createFromXml -> DrawableInflater.inflateFromXmlForDensity -> drawable.inflateFromTag

看一下Shape实现类GradientDrawable的inflate实现,读取各项属性并赋值,到draw方法。

调用canvas.drawRect把mRect画出来,而mRect的赋值在ensureValidRect。[图片上传失败...(image-a25af0-1515826613001)]

bounds在哪里设置的?答案是ImageView.updateDrawable内,会调用Drawable.getIntrinsicHeight赋值(从xml中size属性读取),再调用configureBounds -> setBounds,如果使用的不是ImageView,一定要在draw之前 调用setBounds ,否则size就会出错。

回到loadDrawableForCookie,再看一下6,7步加载图片的过程,通过AssetManager读取图片流数据,通过Drawable.createFromResourceStream这个我们经常使用的方法获取到Drawable。

取到屏幕密度之后调用BitmapFactory.decodeResourcesStream,计算密度后调用native创建Bitmap,感兴趣的同学可以看下更具体的分析文章(如 理解Bitmap )。

本文探究了两点

Android 7.1.1 源码

Android 官方文档, Canvas and Drawable , Drawable 等

⑵ Android怎么绘制Drawable资源(Drawable引用的是selector)

定义在XML中的一个可绘制资源,它能够用指定的距离嵌入到另一个可绘制资源中。这种资源可在View对象需要的背景比它的实际边界小的时候使用。
文件位置(FILE LOCATION):

res/drawable/filename.xml

文件名被用于资源ID。

编译资源的数据类型(COMPILED RESOURCE
DATATYPE):

资源指向一个InsetDrawable对象。

资源引用(RESOURCE
REFERENCE):

java代码中:R.drawable.filename

在XML中:@[package:]drawable/filename

⑶ android的xml中怎么实现按钮按下去变颜色

在drawable里新建一个xml,然后写
<selector>
<item android:state_pressed="true" android:drawable="按下时的样式"><item>
<item android:state_pressed="false" android:drawable="正常时的样式"><item>
<selector>

然后可以再去创建两个drawable来绘制形状
如果你只是需要改变颜色那么直接在string.xml里写这样两条也行
<drawable name="正常时的样式名字">正常时的颜色值</drawable>
 <drawable name="按下时的样式名字">按下时的颜色值</drawable>

然后名字一一对应就行了

别忘了在控件里引用
android:background="你之前设置的选择器"

⑷ 关于Android Studio的drawable下创建xml文件问题

在drawable文件夹处右键--new--Drawable resource file即可

⑸ 在android工程中,res目录下又有anim、drawable、layout、menu、raw、values和xml文件夹,分别用来保存

res目录主要是存放资源文件的!
layout 布局 这个就是你经常看到的与用户交互的界面的 xml 文件,就是各个 view 的排列和嵌套,没什 么好说的啦 风格和主题、 风格主要是指 view 的显示风格 ;
anim 一般是设置动画,画资源分为两种,一是实现图片的 translate、scale、rotate、alpha 四种变化。还可以设置 动画的播放特性;另一种是帧动画,逐帧播放设置的资源;
drawable 主要是是存放所使用的图片的!
menu:菜单 菜单即可以从代码中实现也可以在资源文件中配置;
把图像文件放在 res/raw/ 目录下,这样可以避免被自动优化。
values 是用程序人员设置的一些常量的XML文件,便于修改和使用,一般有Strings,colors等

assets 文件夹是存放不进行编译加工的原生文件,即该文件夹里面的文件不会像 xml, java 文件被预编译,可以存放一些图片,html,js, css 等文件。

阅读全文

与androiddrawablexml相关的资料

热点内容
python符号表达式 浏览:32
威驰压缩机继电器 浏览:869
华为手机怎么设置移动数据app 浏览:957
空调压缩机哪的厂家多 浏览:388
手指速算法24加7怎么算 浏览:137
如何用python写vlookup函数 浏览:796
社保加密狗厂商 浏览:214
php编译运行说法 浏览:955
程序员说喂 浏览:256
抖音直播云服务器 浏览:627
一加7pro文件夹data 浏览:424
程序员淋雨 浏览:965
python输出数字序列中的空格 浏览:78
怎么将pdf文件大小 浏览:734
氧原子相对分子量算法 浏览:988
加密机为什么是安全的 浏览:451
单片机拼音输入法 浏览:807
苹果笔记本t2加密芯片怎么打开 浏览:798
安卓如何把手机投屏至电视 浏览:759
方舟编译器现在可提速哪些软件 浏览:61