android一直是作为自己的一项爱好在搞,年前已经把目前主流的东西做成个demo,
但是毕竟不是学java的,也不是专业干android的,基础不足,只是把东西东拼西凑的,汇总在一起。
一些很好用的第三方库,自己压根就写不出来,或者说是压根就不知道怎么去写。今年的目标就是能写点
自己的自定义控件出来(特别酷炫那种)。废话不多说了,进入正题吧。
屏幕参数
屏幕大小:屏幕对角线的长度,通常是寸来度量,如4.7寸。
分辨率:手机屏幕的像素点个数.如720*1280就是屏幕分辨率,宽宥720个像素点,高有1280个像素点。
PPI:每英寸像素,又被称为DPI.它是由对角线的像素点数除以屏幕的大小得到的,通常达到400PPI就已经是
非常高的屏幕密度了。
系统屏幕密度
各个厂商提供了不同的大小尺寸和像素密度的屏幕。以下定义了几个标准的DPI:
密度 | Ldpi | Mdpi | Hdpi | Xhdpi | Xxhdpi |
密度值 | 120 | 160 | 240 | 320 | 480 |
分辨率 | 240*320 | 320*480 | 480*800 | 720*1280 | 1080*1920 |
独立像素密度dp
相同长度的屏幕,高密度的屏幕包含更多的像素点。Android系统使用mdpi即密度为160的屏幕作为标准,
在这个屏幕上1px=1dp。各分辨率直接换算比例,lpdi:mdpi:hdpi:xhdpi:xxhdpi=3:4:6:8:12。
dp描述长和宽,sp描述文字,正常1sp=1dp,当文字有大、极大的要求时,1sp>1dp。
举例:一个文本框长100dp,在密度为160时,按100px显示。在密度为240时,按150px显示。即相同的dp
根据屏幕密度不同显示不同的大小。
2D绘图基础
系统提供canvas对象来提供绘图方法。Paint也是很重要的元素,有很多属性。
SetAntialias()//设置画笔的锯齿效果、setcolor//设置画笔的颜色、setARGB()//设置画笔的A、R、G、B值、
setalpha()//设置画笔的alpha值、settextsize()//设置字体的尺寸、setsytle()//设置画笔的风格、setstrokewidth()
//设置空心边框的宽度。
根据画笔的不同,再结合不同的绘图api。这样任意组合就可以实现不同的绘图效果。
Canvas对象的各个函数:
绘制点:
Canvas.drawPoint(x,y,paint);
绘制直线:
Canvas.drawLine(startX,startY,endX,endY,paint);
绘制矩形:
Canvas.drawRect(left,top,right,bottom,paint);
绘制圆角矩形:
Canvas.drawRoundRect(left,top,right,bottom,radiusX,radiusY,paint);
绘制圆:
Canvas.drawCircle(circleX,circleY,radidu,paint);
绘制弧形、扇形:
Canvas.drawArc(left,top,right,bottom,startAngle,sweepAngle,useCenter,paint);
绘制椭圆:
Canvas.deawOval(left,top,right,bottom,paint);
绘制文本:
Canvas.drawText(text,startX,startY,paint);
指定位置绘制文本:
Canvas.drawPosText(text,newfloat[]{X1,Y1,X2,Y2…..Xn,Yn},paint);
绘制路径:
Canvas.drawPath(path,paint);
XML绘图
XML在android系统中不仅仅是java中的一个布局文件、配置列表,也可以变成一张画、一幅图。
Bitmap
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/ic_launcher" />
这样就可以引用图片,并且直接将图片转化成Bitmap让我们在程序中使用。
Shape
通过shape可以在xml中绘制各种形状:
<shape xmlns:android=http://schemas.android.com/apk/res/android
//默认为rectangle
android:shape=["rectangle"|"oval"|"line"|"ring"]>
<corners //当shape="rectangle"时使用
//半径,会被后面的单个半径属性覆盖,默认为1dp
android:radius="integer"
android:topLeftRaduis="integer"
android:topRightRadius="integer"
android:bottomLeftRadius="integer"
android:bottonRightRadius="integer"/>
<gradient //渐变
android:angle="integer"
android:centerX="integer"
android:centerY="integer"
android:centerColor="integer"
android:endColor="color"
android:gradientRadius="integer"
android:startColor="color"
android:type=["linear"|"radial"|"sweep"]
android:useLevel=["true"|"false"]/>
<padding
android:left="integer"
android:top="integer"
android:right="integer"
android:bottom="integer"/>
<size //指定大小,一般用在imageView配合scaleType属性使用
android:witdh="integer"
android:height="integer"/>
<solid //填充颜色
android:color="color"
/>
<stroke//指定边框
android:width="integer"
android:color="color"
android:dashWidth="integer"//虚线宽度
android:dashGap="integer"//虚线间隔宽度
/>
</shape>
Shape是xml绘图的精华所在。
Layer
Layer是在Photoshop中常用的功能。在android中同样可以通过Layer来实现类似Photoshop中图层的概念。
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!--图片1-->
<item
android:drawable="@drawable/ic_launcher"/>
<!--图片2-->
<item
android:drawable="@drawable/ic_launcher"
android:left="10.0dip"
android:top="10.0dip"
android:right="10.0dip"
android:bottom="10.0dip"
/>
</layer-list>
Selector
用于帮助开发者实现静态绘图中的事件反馈,通过给不同的事件设置不同的图像,从而在程序中根据用户输入,
返回不同的效果。
<selector xmlns:androd="http://schemas.android.com/apk/res/android">
<!--默认时的背景图片-->
<item android:drawable="@drawable/X1"/>
<!--没有焦点时的背景图片-->
<item android:state_window_focused="false"
android:drawable="@drawable/X2">
<!--非触摸模式下获得焦点并单击时的背景图片-->
<item android:state_window_focused="true"
android:state_pressed="true"
android:drawable="@drawable/X3">
<!--触摸模式下单击时的背景图片-->
<item android:state_window_focused="false"
android:state_pressed="true"
android:drawable="@drawable/X4">
<!--选中图片时的图片背景-->
<item android:state_selected="true"
android:drawable="@drawable/X5">
<!--获得焦点时的图片背景-->
<item
android:state_focused="true"
android:drawable="@drawable/X5">
</selector>