导航:首页 > 操作系统 > 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相关的资料

热点内容
linuxhttpd配置文件 浏览:377
什么电影陈宝莲在厕所强奸 浏览:586
韩剧中小女孩奶奶是药店工作 浏览:678
男女生抱着看电影 浏览:489
手机银行app利率是什么意思 浏览:209
博途scl编译信号或精度丢失 浏览:631
静态编译失败的原因 浏览:234
西安人社app为什么注册不了 浏览:25
linux下root密码修改 浏览:700
苹果11watchapp有什么用 浏览:472
linux文件系统集群 浏览:748
大奥电视剧观看顺序 浏览:478
深圳程序员真实工资是多少 浏览:517
androidgetbytes 浏览:706
争鸣pdf 浏览:968
饥荒联机版如何直连服务器 浏览:121
妈妈的朋友崇石演过什么电影 浏览:868
qq邮箱如何查看服务器的地址 浏览:800
穿越到各大电影世界 浏览:584
青海集群服务器云空间 浏览:924