复制简书上一篇基础文章,很基础但是很受用 原文地址
本章主要介绍的是Android的绘图机制和处理技巧
1.屏幕尺寸的信息:
- 屏幕参数有
屏幕大小
即屏幕对角线的长度,用“寸”来表示、分辨率
、PPI
即每英寸像素,它由对角线的像素点除以屏幕大小获得。 - 系统屏幕密度如下
ldpi---120---240X320分辨率
mdpi---160---320X480分辨率
hdpi---240---480X800分辨率
xhdpi---320---720X1280分辨率
xxhdpi---480---1080X1920分辨率
2.单位转换工具类(这种百度一堆 在此省略)
3.2D绘图基础:
Paint类的一些属性和对应的功能:
setAntiAlias();//设置画笔的锯齿效果
setColor();//设置画笔的颜色
setARGB();//设置画笔的A,R,G,B的值
setAlpha();//设置画笔的Alpha值
setTextSize();//设置字体的尺寸
setStyle();//设置画笔的风格(空心或者实心)
setStrokeWidth();//设置空心边框的宽度
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,radius,paint);//绘制圆
canvas.drawOval(left,top,right,bottom,paint);//通过椭圆的外接矩形来绘制椭圆
canvas.drawText(text,startX,startY,paint);//绘制文字
canvas.drawPosText(text,new float[]{x1,y1,...,xn,yn},paint);//指定位置绘制文本
-
//绘制多条直线 float[] pts={ startX1,startY1,endX1,endY1 ...... startXn,startYn,endXn,endYn} canvas.drawLines(pts,paint); //绘制路径 Path path=new Path(); path.moveTo(50,50); path.lineTo(100,100); path.lineTo(300,50); canvas.drawPath(path,paint) //绘制弧形或扇形 canvas.drawArc(left,top,right,bottom,startAngle,sweepAngle,useCenter,paint); 这里useCenter传入true则绘制扇形 反之绘制弧形
4.Android的Xml绘图:
- Bitmap:
这样就能直接将图片转成bitmap在程序中使用了<bitmap xmlns:android="http://schemas.android.com/apk/res/android" android:src="@drawable/ic_launcher"/>
-
Shape:
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="line|oval|ring|rectangle"> <!--默认为rectangle--> <corners android:bottomLeftRadius="integer" android:bottomRightRadius="integer" android:radius="integer" android:topLeftRadius="integer" android:topRightRadius="integer" /> <!--当shape为rectangle时才有,radius默认为1dp--> <gradient android:angle="integer" android:centerColor="color" android:centerX="integer" android:centerY="integer" android:endColor="color" android:gradientRadius="integer" android:startColor="color" android:type="linear|radial|sweep" android:useLevel="boolean" /> <padding android:bottom="integer" android:left="integer" android:right="integer" android:top="integer" /> <size android:width="integer" android:height="integer" /> <!--指定大小,一般用在imageview配合scaleType使用--> <solid android:color="color" /> <!--填充颜色--> <stroke android:width="integer" android:color="color" android:dashGap="integer" android:dashWidth="integer" /> <!--边框,dashGap为虚线间隔宽度,dashWidth为虚线宽度--> </shape>
- Layer:大家可以自己试试效果 这里就不贴图了
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@mipmap/ic_launcher" /> <item android:drawable="@mipmap/ic_launcher" android:left="10dp" android:top="10dp" /> <item android:drawable="@mipmap/ic_launcher" android:left="20dp" android:top="20dp" /> </layer-list>
- Selector:
通常用于view的触摸反馈<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true"> <shape android:shape="rectangle"> <solid android:color="#334444" /> </shape> </item> <item android:state_pressed="false"> <shape android:shape="rectangle"> <solid android:color="#444444" /> </shape> </item> </selector>
5.Android绘图技巧:
canvas.save()
:保存之前在画布上的操作,之后的操作就像是在新的图层操作一样。
canvas.restore()
:可以理解为Photoshop中合并图层的操作,作用是将save后的图层与之前的图层合并。
canvas.translate()
:将画布进行平移。
canvas.rotate()
:将画布进行旋转。这两个方法都是用来简化绘图而创建的。
canvas.saveLayer()
:创建一个图层,并将他加入一个图层的栈,通过调用restore或者restoreToCount使其出栈,出栈后会把图像绘制到上层canvas上。
canvas.saveLayerAlpha()
:同上,区别是可以设置图层的透明度