Android群英传笔记——第五章:AndroidScroll分析(1)一.屏幕的尺寸信息屏幕的尺寸,主要还是因为Android的屏幕确实五花八门,所以在一定程度上的适配问题也是很捉急的,所以我们要对这块屏幕充分的认识1.屏幕参数一块屏幕通常具备以下的几个参数屏幕大小指屏幕对角线的长度,通常用寸来表示,例如4.7寸,5.5寸分辨率分辨率是指实际屏幕的像素点个数,例如720X1280就是指屏幕的分辨率,宽有720个像素点,高有1280个像素点PPI每英寸像素又称为DPI,他是由对角线的的像素点数除以屏幕的大小所得,通常有400PPI就已经很6了2.系统屏幕密度每个厂商的安卓手机具有不同的大小尺寸和像素密度的屏幕,安卓系统如果要精确到每种DPI的屏幕,基本上是不可能的,因此系统定义了几个标准的DPI3.独立像素密度dp这是由于各种屏幕密度的不同,导致同样像素大小的长度,在不同密度的屏幕上显示长度不同,因此相同长度的屏幕,高密度的屏幕包含更多的像素点,在安卓系统中使用mdpi密度值为160的屏幕作为标准,在这个屏幕上,1px=1dp,其他屏幕则可以通过比例进行换算,例如同样是100dp的长度,mdpi中为100px,而在hdpi中为150,我们也可以得出在各个密度值中的换算公式,在mdpi中1dp=1px,在hdpi中,1dp=1.5px,在xhdpi中,1dp=2px,在xxhdpi中1dp=3px,由此可见,我们换算公司l:m:h:xh:xxh=3:4:6:8:124.单位换算在程序中,我们可以非常方便地对一些单位的换算,下面的代码给出了一种换算的方法我们可以把这些代码作为工具类保存在项目中packagecom.lgl.playview;importandroid.content.Context;/***dp,sp转换成px的工具类*Createdbylglon16/3/23.*/publicclassDisplayUtils{/***将px值转换成dpi或者dp值,保持尺寸不变**@paramcontent*@parampxValus*@return*/publicstaticintpx2dip(Contextcontent,floatpxValus){finalfloatscale=content.getResources().getDisplayMetrics().density;return(int)(pxValus/scale+0.5f);}/***将dip和dp转化成px,保证尺寸大小不变。**@paramcontent*@parampxValus*@return*/publicstaticintdip2px(Contextcontent,floatpxValus){finalfloatscale=content.getResources().getDisplayMetrics().density;return(int)(pxValus/scale+0.5f);}/***将px转化成sp,保证文字大小不变。**@paramcontent*@parampxValus*@return*/publicstaticintpx2sp(Contextcontent,floatpxValus){finalfloatfontScale=content.getResources().getDisplayMetrics().scaledDensity;return(int)(pxValus/fontScale+0.5f);}/***将sp转化成px,保证文字大小不变。**@paramcontent*@parampxValus*@return*/publicstaticintsp2px(Contextcontent,floatpxValus){finalfloatfontScale=content.getResources().getDisplayMetrics().scaledDensity;return(int)(pxValus/fontScale+0.5f);}}其实的density就是前面所说的换算比例,这里使用的是公式换算方法进行转换,同时系统也提供了TypedValue帮助我们转换/***dp2px*@paramdp*@return*/protectedintdp2px(intdp){return(int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,dp,getResources().getDisplayMetrics());}/***sp2px*@paramdp*@return*/protectedintsp2px(intsp){return(int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,sp,getResources().getDisplayMetrics());}二.2D绘图基础系统通过提供的Canvas对象来提供绘图方法,它提供了各种绘制图像的API,drawLine,deawPoint,drawRect,drawVertices,drawAce,drawCircle等等,我以前写过Android绘图机制(二)——自定义View绘制形,圆形,三角形,扇形,椭圆,曲线,文字和图片的坐标讲解,通过他们的名字我们基本可以大致了解他们的功能,当然,Paint作为一个非常重要的元素功能也非常强大这里也简单地列举了一些他的属性Android绘图机制(一)——自定义View的基础属性和方法setAntiAlias();//设置画笔的锯齿效果setColor();//设置画笔的颜色setARGB();//设置画笔的A、R、G、B值setAlpha();//设置画笔的Alpha值setTextSize();//设置字体的尺寸setStyle();//设置画笔的风格(空心或实心)setStrokeWidth();//设置空心边框的宽度getColor();//获取画笔的颜色是由于画笔功能的不一样,再结合各种不同的绘图API,这样任意组合就可以实现不同的绘图效果,比如同样是矩形设置Paint就Style可以画出空心或者实心,我们来看看RectViewpackagecom.lgl.playview;importandroid.content.Context;importandroid.graphics.Canvas;importandroid.graphics.Color;importandroid.graphics.Paint;importandroid.util.AttributeSet;importandroid.view.View;/***Createdbylglon16/3/23.*/publicclassRectViewextendsView{privatePaintpaint1,paint2;publicRectView(Contextcontext,AttributeSetattrs){super(context,attrs);initView();}privatevoidinitView(){paint1=newPaint();paint1.setColor(Color.BLUE);paint1.setAntiAlias(true);//空心paint1.setStyle(Paint.Style.STROKE);paint2=newPaint();paint2.setColor(Color.BLUE);//实心paint2.setStyle(Paint.Style.FILL);}@OverrideprotectedvoidonDraw(Canvascanvas){super.onDraw(canvas);canvas.drawRect(50,100,300,300,paint1);canvas.drawRect(350,400,700,700,paint2);}}运行起来就是三.AndroidXML绘图XML在安卓系统中可不仅仅是Java中的一个布局文件配置列表,在安卓开发者的手头上他甚至可以变成一张画,一幅画,Android开发者给XML提供了几个强大的属性1.Bitmap在XML中使用Bitmap很简单?xmlversion=1.0encoding=utf-8?bitmapxmlns:android=:src=@mipmap/ic_launcher/bitmap通过这样引用图片就可以将图片直接转化成Bitmap让我们在程序中使用2.Shape通过Shape可以绘制各种图形,下面展示一下shape的参数?xmlversion=1.0encoding=utf-8?shapexmlns:android=:shape=rectangle!--默认是rectangle--!--当shape=rectangle的时候使用--cornersandroid:bottomLeftRadius=1dpandroid:bottomRightRadius=1dpandroid:radius=1dpandroid:topLeftRadius=1dpandroid:topRightRadius=1dp/!--半径,会被后面的单个半径属性覆盖,默认是1dp--!--渐变--gradientandroid:angle=1dpandroid:centerColor=@color/colorAccentandroid:centerX=1dpandroid:centerY=1dpandroid:gradientRadius=1dpandroid:startColor=@color/colorAccentandroid:type=linearandroid:useLevel=true/!--内间距--paddingandroid:bottom=1dpandroid:left=1dpandroid:right=1dpandroid:top=1dp/!--大小,主要用于imageview用于scaletype--sizeandroid:width=1dpandroid:height=1dp/!--填充颜色--solidandroid:color=@color/colorAccent/!--指定边框--strokeandroid:width=1dpandroid:color=@color/colorAccent/!--虚线宽度--android:dashWidth=1dp!--虚线间隔宽度--android:dashGap=1dp/shapeshape可以说是xml绘图的精华所在,而且功能十分的强大,无论是扁平化,拟物化还是渐变,都是十分的OK,我们现在来做一个阴影的效果?xmlversion=1.0encoding=utf-8?shapexmlns:android=:shape=rectanglegradientandroid:angle=45android:endColor=#805FBBFFandroid:startColor=#FF5DA2FF/paddingandroid:bottom=7dpandroid:left=7dpandroid:right=7dpandroid:top=7dp/cornersandroid:radius=8dp//shape看效果3.LayerLayer是在PhotoShop中是非常