这里写目录标题
Android屏幕相关知识
屏幕参数
屏幕大小:屏幕对角线长度,用寸来衡量
分辨率:手机屏幕像素点个数,例如 720*1280
PPI:每英寸像素,又称DPI.有一些固定的DPI,就是我们熟悉的dipi,mdpi,xhdpi等等。
独立像素密度dp:平时我们控制view之间的距离就是用dp,不同的dpi,会有不同的换算。例如 mdpi中 ldp=1px,hdpi中,1dp=1.5px等等。
对于sp,dp转为px的工具类有许多现成的,应该可以搜索到并引入项目中使用。
关于sp:android系统是可以设置字体大小的,参照物就是设置的字体大小.然而,系统字体放大了一倍,那么,如果使用sp为单位的字就会放大一倍显示,如果以dp为单位的字体就不会放大.所以说,sp根本就是和系统字体大小有关的单位!!!
2D绘图
在代码里,通过Canvas对象,和画笔 paint,来实现一些图像的绘制。
xml绘图
bitmap
可以在xml文件中,将图片转为bitmap对象,供我们在程序中使用。
shape
这个是应用最多的,一般可以通过shape绘制一些图像,然后作为一些控件的背景,这样就省得自己花费大量精力去自定义view了(如果只是想改变控件的外形)。
shape也十分强大,可以实现一些扁平化,拟物,阴影等效果。一些边框,渐变,填充等等常用属性可见书中。
图层 Layer
图层在实际开发过程中,也是广泛应用的。一般就是通过xml文件的图层来组合图片,来达到一些不同效果的实现。我们的app图标,其实也是应用了图层。
选择器 Selector
选择器我们也比较熟悉且应用广泛,一般应用于View对点击触摸事件。通过xml里编写选择器(例如颜色选择器),然后作为一些控件的背景,这样控件就会根据事件产生改变。状态有focus,selected,pressed等等。
Android绘图技巧
Canvas
Canvas.save():保存画布,使得后续操作就如在一个新的画布操作一样。
Canvas.restore(): 合并sava前后的图层。
Canvas.translate(): 画布平移,其实就是使得画布的原点从左上角的(0,0),移动到(x,y).
Canvas.rotate(): 将坐标系旋转一定角度,这在画时钟之类的圆周,有规律图的时候十分有用。
Layer图层
在通过Canvas画图时,可以通过saveLayer(),saveLayerAlpha()方法将一个图像入栈,之后所有canvas方法画图操作都发生在入栈的图上,使用restore(),restoreToCount()方法将图像出栈,出栈时,出栈图像会被绘制在上层canvas上。
Android图像处理-色彩特效
内容较多,后面专门写博客记录。
Android图像处理-图形特效
内容较多,后面专门写博客记录。
Android图像处理-画笔特效
内容较多,后面专门写博客记录。
Android-SurfaceView
简介
Android系统的对View的绘图可以满足大部分的需求,但也有不足之处。
View通过刷新来重绘视图,通过系统发出的VSYNC信号来进行屏幕的重绘,刷新间隔为16ms,如果view的绘制没有在16ms内完成,就会出现卡帧。如果执行的操作逻辑太多,特别是需要不断刷新界面,从而不断阻塞主线程,导致画面卡帧。
我们经常会见到这样的警告:
“Sky xx frames !the application may be doing too munch woirk on its main thread”
SurfaceView就是解决这些的问题的。
- View适用于主动更新,而SurfaceView适用于被动更新
- View在主线程刷新,而SurfaceViw在子线程更新
- View在画图时没有双缓冲机制,surfaceView在底层实现双缓冲机制
总而言之,surfaceView适用于频繁刷新,或者刷新时数据量比较大的情况
什么是双缓冲机制?
https://www.jianshu.com/p/03449246930b
SurfaceView的使用
一般需要定义的三个成员变量:
surfaceViewHolder mHoler
Canvas mcanvas
Bolean mIsDrawing//子线程标志位
可以通过sleep来控制绘制的节奏和节约资源。
记得surfaceViewHolder的初始化,并注册回调。
通过surfaceViewHolder的lockCanvas()方法可以获取到Cancas对象,这个对象是上次绘制的canvans,而不是全新的对象。
书里有模板代码和一些小例子,使用的时候可以查询书。