绘图系列(一)-Paint
paint:即笔,画图所需要的相关设置都是通过Paint实现,如:字体样式、透明度、字体大小、粗细等。
基本函数
paint.setAntiAlias(true);//抗锯齿功能
paint.setColor(Color.RED); //设置画笔颜色
paint.setStyle(Style.FILL);//设置填充样式
paint.setStrokeWidth(30);//设置画笔宽度
paint.setShadowLayer(10, 15, 15, Color.GREEN);//设置阴影
这里着重讲解写setShadowLayer(float radius,float dx,float dy,int color)函数:用于为图片或文字添加阴影:
- radius:模糊半径,半径越大越模糊,半径越小越清晰;如果为0,则阴影消失不见;
- dx:阴影的横向偏移距离,正值向右偏移,负值向左偏移;
- dy:阴影的纵向偏移;
- color:绘制阴影的画笔颜色,即阴影的颜色(对图片阴影无效)
注意:文字、图形(圆、矩形等)的阴影都是使用自定义的阴影画笔绘制出来的,而图片的阴影则直接产生一张相同的图片,仅仅对图片的边缘部分进行模糊,图形模糊也是仅模糊边缘部分;该函数只有在文字绘制阴影支持硬件加速,其他都不支持硬件加速;
如果我们要清除阴影:
public void clearShadowLayer()
setShadowLayer()是API 11引入的,TextView系列类布局文件中支持阴影设置:
android:shadowRadius
android:shadowDx
android:shadowDy
android:shadowColor
当然也可以通过代码设置阴影:
new TextView().setShadowLayer()
下面对一些常用的可能需要花一些时间去理解的函数做一些参数说明:
- void setStyle (Paint.Style style) 设置填充样式
Paint.Style.FILL :填充内部
Paint.Style.FILL_AND_STROKE :填充内部和描边
Paint.Style.STROKE :仅描边
paint设置文字相关函数:
- paint.setStrokeCap(Paint.Cap cap)
设置线帽样式,取值有:Cap.ROUND圆形线帽)、Cap.SQUARE(方形线帽)、Cap.BUTT(无线帽)
线帽:简单举个例子说明一下,比如我们画一段线段,在其两端分别加上一个装饰(线帽),如一个矩形
- setPathEffect(PathEffect effect)
当我们不设置路径效果是,一系列点连接,只会生硬的把两个点连接上,两个相邻线段间会形成一系列夹角,但是如果我们设置了效果,这些生硬的夹角会通过不同效果的替换,比如用圆弧替代生硬的夹角
取值:PathEffect子类
DashPathEffect(虚线效果)
public DashPathEffect(float intervals[], float phase)
intervals[]:需线段各个长度,整条虚线段就是有这些基本虚线不断循环而成。其值必须大于等于2,即至少一个实线段长度、一个空白间隙长度,如果其值个数为奇数,最后一个值将会被省略
paint关于文字设置
//普通设置
paint.setStrokeWidth (5);//设置画笔宽度
paint.setAntiAlias(true); //指定是否使用抗锯齿功能,如果使用,会使绘图速度变慢
paint.setStyle(Paint.Style.FILL);//绘图样式,对于设文字和几何图形都有效
paint.setTextAlign(Align.CENTER);//设置文字对齐方式,取值:align.CENTER、align.LEFT或align.RIGHT
paint.setTextSize(12);//设置文字大小
//样式设置
paint.setFakeBoldText(true);//设置是否为粗体文字
paint.setUnderlineText(true);//设置下划线
paint.setTextSkewX((float) -0.25);//设置字体水平倾斜度,普通斜体字是-0.25
paint.setStrikeThruText(true);//设置带有删除线效果
paint. setTextSkewX(float skewX)//设置文字水平倾斜度
TypeFace(字体样式)
通过paint.setTypeFace()设置。可以指定系统中的字体样式,也可以从自定义的样式文件中获取。
创建字体样式(Typeface)时,可以字体的Style如:斜体、粗体、正常体等。
创建Typeface:
-
Typeface create(String familyName, int style) //直接通过指定字体名来加载系统中自带的文字样式
-
Typeface create(Typeface family, int style) //通过其它Typeface变量来构建文字样式
-
Typeface defaultFromStyle(int style)//创建默认字体
-
Typeface createFromAsset(AssetManager mgr, String path) //通过从Asset中获取外部字体来显示字体样式
-
Typeface createFromFile(String path)//直接从路径创建
-
Typeface createFromFile(File path)//从外部路径来创建字体样式
上面参数都会用到style参数:其值为枚举类型,取值为:
Typeface.NORMAL //正常体
Typeface.BOLD //粗体
Typeface.ITALIC //斜体
Typeface.BOLD_ITALIC //粗斜体
设置系统字体样式就不详述了比较简单,这里我们就以自定义字体样式为例(后面三个方法实现):
从Assets路径加载字体文件中的字体样式:在assets目录下新建font文件夹,将字体文件放入文件夹下
Paint textPaint= new Paint();
textPaint.setTextSize(36);
textPaint.setAntiAlias(true);
textPaint.setColor(Color.YELLOW);
textPaint.setUnderlineText(true);
textPaint.setStrikeThruText(true);
textPaint.setTextSize(60);
//设置系统中的字体样式
//Typeface typeface = Typeface.create("宋体", Typeface.BOLD_ITALIC);
//textPaint.setTypeface(typeface);
//canvas.drawText("leslie hello world!!",100,100,textPaint);
//从Asset是中设置自定义字体样式
AssetManager manager = getContext().getAssets();
Typeface typeface1 = Typeface.createFromAsset(manager, "font/font.ttf");
textPaint.setTypeface(typeface1);
canvas.drawText("leslie hello world!!",200,300,textPaint);
绘制多条直线
- void drawLines (float[] pts, Paint paint)
- void drawLines (float[] pts, int offset, int count, Paint paint)
参数:
这里需要对着几个参数进行下说明:
pts:是点的集合,大家下面可以看到,这里不是形成连接线,而是每两个点形成一条直线,pts的组织方式为{x1,y1(坐标一),x2,y2(坐标二),x3,y3,……},两个坐标构成一条直线。
offset:偏移量,注意这里偏移的是pts中的点,而不是坐标(一个坐标有两个点组成)
count:从偏移量后面的count个pts值画线,当count不足4个点是,将不能构成一条直线,也就不不能画出直线来
画弧
- void drawArc (RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint)
参数:
RectF oval:生成椭圆的矩形
float startAngle:弧开始的角度,以X轴正方向为0度
float sweepAngle:弧持续的角度
boolean useCenter:是否有弧的两边,True,还两边,False,只有一条弧
绘制文字
-
void drawText (String text, float x, float y, Paint paint)
-
void drawText (CharSequence text, int start, int end, float x, float y, Paint paint)
-
void drawText (String text, int start, int end, float x, float y, Paint paint)
-
void drawText (char[] text, int index, int count, float x, float y, Paint paint)
start:开始绘制第一个文字的索引
x:文字的起始位置
指定每个文字位置
void drawPosText (char[] text, int index, int count, float[] pos, Paint paint)
void drawPosText (String text, float[] pos, Paint paint)
说明:
第一个构造函数:实现截取一部分文字绘制;
参数说明:
char[] text:要绘制的文字数组
int index::第一个要绘制的文字的索引
int count:要绘制的文字的个数,用来算最后一个文字的位置,从第一个绘制的文字开始算起
float[] pos:每个字体的位置,同样两两一组,如{x1,y1,x2,y2,x3,y3……}