http://blog.csdn.net/czh0766/article/details/5837731

http://blog.csdn.net/czh0766/article/details/5837731

http://blog.csdn.net/czh0766/article/details/5837731

http://blog.csdn.net/czh0766/article/details/5837731



对View DrawingCache的理解

分类:Android 10296人阅读 评论(1) 收藏 举报 cache api

View组件显示的内容可以通过cache机制保存为bitmap, 使用到的api有

void setDrawingCacheEnabled(boolean flag),

Bitmap getDrawingCache(boolean autoScale),

void buildDrawingCache(boolean autoScale),

void destroyDrawingCache()

我们要获取它的cache先要通过setDrawingCacheEnable方法把cache开启,然后再调用getDrawingCache方法就可以获得view的cache图片了。buildDrawingCache方法可以不用调用,因为调用getDrawingCache方法时,若果cache没有建立,系统会自动调用buildDrawingCache方法生成cache。若果要更新cache, 必须要调用destoryDrawingCache方法把旧的cache销毁,才能建立新的。

当调用setDrawingCacheEnabled方法设置为false, 系统也会自动把原来的cache销毁。

ViewGroup在绘制子view时,而外提供了两个方法

void setChildrenDrawingCacheEnabled(boolean enabled)

setChildrenDrawnWithCacheEnabled(boolean enabled)

setChildrenDrawingCacheEnabled方法可以使viewgroup里所有的子view开启cache, setChildrenDrawnWithCacheEnabled使在绘制子view时,若该子view开启了cache, 则使用它的cache进行绘制,从而节省绘制时间。

获取cache通常会占用一定的内存,所以通常不需要的时候有必要对其进行清理,通过destroyDrawingCache或setDrawingCacheEnabled(false)实现。

更多 1






对View的onMeasure方法理解

分类:Android 8318人阅读 评论(6) 收藏 举报 layout google 测试

我们知道View在屏幕上显示出来要先经过measure和layout. 在调用onMeasure(int widthSpec, int heightSpec)方法时,要涉及到MeasureSpec的使用,MeasureSpec有3种模式分别是UNSPECIFIED, EXACTLY和AT_MOST, 那么这些模式和我们平时设置的layout参数fill_parent, wrap_content有什么关系呢。经过代码测试就知道,当我们设置width或height为fill_parent时,容器在布局时调用子view的measure方法传入的模式是EXACTLY,因为子view会占据剩余容器的空间,所以它大小是确定的。而当设置为wrap_content时,容器传进去的是AT_MOST, 表示子view的大小最多是多少,这样子view会根据这个上限来设置自己的尺寸。当子view的大小设置为精确值时,容器传入的是EXACTLY, 而MeasureSpec的UNSPECIFIED模式目前还没有发现在什么情况下使用。

View的onMeasure方法默认行为是当模式为UNSPECIFIED时,设置尺寸为mMinWidth(通常为0)或者背景drawable的最小尺寸,当模式为EXACTLY或者AT_MOST时,尺寸设置为传入的MeasureSpec的大小。

有个观念需要纠正的是,fill_parent应该是子view会占据剩下容器的空间,而不会覆盖前面已布局好的其他view空间,当然后面布局子view就没有空间给分配了,所以fill_parent属性对布局顺序很重要。以前所想的是把所有容器的空间都占满了,难怪google在2.2版本里把fill_parent的名字改为match_parent.



http://blog.csdn.net/czh0766/article/details/5837731

http://blog.csdn.net/czh0766/article/details/5837731

  1. http://blog.csdn.net/czh0766/article/details/5790295
  2. http://blog.csdn.net/czh0766/article/details/5790295
  3. http://blog.csdn.net/czh0766/article/details/5790295
  4. http://blog.csdn.net/czh0766/article/details/5790295

对View组件布局和绘制过程, 以及Drawable绘制的理解

分类:Android 5684人阅读 评论(3) 收藏 举报 layout android c

Android的view组件显示主要经过mesure, layout和draw这三个过程。在mesure阶段里调用mesure(int widthSpec, int heightSpec)方法,这个方法是final不能被重写,在这个过程里会调用onMesure(int widthSpec, int heightSpec)方法。当组件设置好大小后,调用final layout(int l, int t, int r, int b)方法进行布局,在这个过程里会调用onLayout(boolean changed, int l, int t, int r, int b)方法,所以处理组件的布局通常要重写onMesure和onLayout这两个方法。

View组件的绘制会调用draw(Canvas canvas)方法,这个方法在源代码里看不到在哪里调用...draw过程中主要是先画Drawable背景,对drawable调用setBounds()然后是draw(Canvas c)方法.有点注意的是背景drawable的实际大小会影响view组件的大小,drawable的实际大小通过getIntrinsicWidth()和getIntrinsicHeight()获取,当背景比较大时view组件大小等于背景drawable的大小,不过俺没有在源代码里找到布局时调用过getIntrinsicWidth()和getIntrinsicHeight()方法...

画完背景后,draw过程会调用onDraw(Canvas canvas)方法,然后就是dispatchDraw(Canvas canvas)方法, dispatchDraw()主要是分发给子组件进行绘制,我们通常定制组件的时候重写的是onDraw()方法。值得注意的是ViewGroup容器组件的绘制,当它没有背景时直接调用的是dispatchDraw()方法, 而绕过了draw()方法,当它有背景的时候就调用draw()方法,而draw()方法里包含了dispatchDraw()方法的调用。因此要在ViewGroup上绘制东西的时候往往重写的是dispatchDraw()方法而不是onDraw()方法,或者自定制一个Drawable,重写它的draw(Canvas c)和getIntrinsicWidth(),

getIntrinsicHeight()方法,然后设为背景。





更多相关文章

  1. Android不错的图片压缩方法
  2. Android延时任务方法
  3. Android listview中使用button解决方法
  4. android 判断横竖屏的方法
  5. Android WIFI热点默认安全性的修改方法
  6. 组件居中显示 安卓
  7. android 3.0编译环境需要的所有组件
  8. Android UI 开源组件

随机推荐

  1. android handler和thread的使用
  2. android各版本特性
  3. 什么是Android上的USB调试模式以及如何启
  4. android 硬件加速
  5. Android软件安全开发实践
  6. 【攻城狮看过来】UC招聘Android、Java高
  7. 《Android核心分析》(一)
  8. Android(安卓)网络连接判断并进行相关处
  9. 开源项目之Android 结束篇
  10. Android media 播放mp3时ID3 tag 显示乱