Android自定义View-关于Graphics的解释(一)

1、Paint类对应的方法

1.1 图形绘制相关方法

方法定义 说明 备注
public void set(Paint src)  根据已有画笔的属性进行赋值  
public void setColor(int color) 设置颜色  
public void setAlpha(int alpha) 设置透明度,alpha为透明度,取值范围为0~255,数值越小越透明  
public void setARGB(int a, int r, int g, int b)  设置透明度和颜色,a代表透明度,r,g,b代表颜色值  
public void setAntiAlias(boolean aa) 

设置是否使用抗锯齿功能,比较耗资源,减慢绘制速度

详细的解释见3.1
public void setDither(boolean dither) 

设定是否使用图像抖动,如true,绘制出来的图片颜色更饱满、清晰  

详细的解释见3.2
public void setStyle(android.graphics._Original_Paint.Style style) 

设置画笔的样式,为FILL,FILL_OR_STROKE,或STROKE  

说明:当我们在调用drawCircle、drawOval、drawArc、drawRect等方法时,我们既可以绘制对应图形的填充面,也可以只绘制该图形的轮廓线,控制的关键在于画笔Paint中的style。Paint通过setStyle方法设置要绘制的类型,style有取三种值:Paint.Style.FILL、Paint.Style.STROKE和Paint.Style.FILL_AND_STROKE。

当style为FILL时,绘制是填充面,FILL是Paint默认的style;

当style为STROKE时,绘制的是图形的轮廓线;

当style为FILL_AND_STROKE时,同时绘制填充面和轮廓线,不过这种情况用的不多,因为填充面和轮廓线是用同一种颜色绘制的,区分不出轮廓线的效果。

public void setStrokeCap(Cap cap)  当画笔样式为STROKE或FILL_OR_STROKE时,设置笔刷的图形样式,如圆形样式  Cap.ROUND,或方形样式Cap.SQUARE    
public void setStrokeWidth(float width)  当画笔样式为STROKE或FILL_OR_STROKE时,设置笔刷的粗细度        

1.2 文字绘制相关方法

方法 说明 备注
public void setTextSize(float textSize) 设置文字大小  
public void setTextScaleX(float scaleX) 设置文字x轴的缩放比例,可以实现文字的拉伸效果    
public void setTextSkewX(float skewX) 设置文字倾斜弧度   
public void setUnderlineText(boolean flag) 设置文字下划线效果      
public void setStrikeThruText(boolean flag) 设置删除线效果  
public Typeface setTypeface(Typeface typeface) 设置字体风格    

接收参数为 Typeface对象,在Typeface.java类中,比较简单的,有defaultFromStyle方法返回Typeface对象

代码:paint.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));    

public void setTextAlign(android.graphics._Original_Paint.Align align) 设置文字的对齐方向   可选LEFT、CENTER和RIGHT。


2、Canvas类对应的方法

2.1  总的说明

 这个类相当于一个画布,你可以在里面画很多东西;

我们可以把这个Canvas理解成系统提供给我们的一块内存区域(但实际上它只是一套画图的API,真正的内存是下面的Bitmap),而且它还提供了一整套对这个内存区域进行操作的方法,所有的这些操作都是画图API。也就是说在这种方式下我们已经能一笔一划或者使用Graphic来画我们所需要的东西了,要画什么要显示什么都由我们自己控制。

这种方式根据环境还分为两种:一种就是使用普通View的canvas画图,还有一种就是使用专门的SurfaceView的canvas来画图。两种的主要是区别就是可以在SurfaceView中定义一个专门的线程来完成画图工作,应用程序不需要等待View的刷图,提高性能。前面一种适合处理量比较小,帧率比较小的动画,比如说象棋游戏之类的;而后一种主要用在游戏,高品质动画方面的画图。

2.2 draw方法的解释

方法 说明 代码例子
设置ARGB、颜色填充画布 public void drawARGB(int a, int r, int g, int b) {}  
public void drawColor(int color) {}  
public void drawRGB(int r, int g, int b) {} 
canvas.drawARGB(50, 255, 0, 0);//参数即为ARGB的值 
画点 public native void drawPoint(float x, float y, Paint paint);   //参数比较明显,就是点的坐标,需要注意的是,在绘制点之前,需要设置画笔的宽度,否则不能画出来  
  paint.setStrokeWidth(13);     
  //另外,还可以设置画笔的样式,来指定所画的点的样式,圆形还是方形  
  paint.setStrokeCap(Paint.Cap.ROUND);//或者paint.setStrokeCap(Paint.Cap.BUTT);  
  canvas.drawPoint(100, 100, paint); 
画直线 public void drawLine(float startX, float startY, float stopX, float stopY, Paint paint) {}   canvas.drawLine(100, 100, 500, 500, paint);//参数为起点和终点的XY坐标 
画圆 public void drawCircle(float cx, float cy, float radius, Paint paint) {}   canvas.drawCircle(200, 200, 100, paint);//参数为圆心坐标和半径  
绘制矩形 public void drawRect(float left, float top, float right, float bottom, Paint paint) {}  
public void drawRect(RectF rect, Paint paint) {}  
public void drawRect(Rect r, Paint paint) {}  
// RectF 和 Rect  都可用来定义一个矩形区域,主要区别是参数类型不同,一个是int类型,一个是float类型  
private RectF mRectF;  
mRectF = new RectF(100, 100, 200, 500);  
canvas.drawRect(mRectF, paint);  
绘制圆角矩形 public void drawRoundRect(RectF rect, float rx, float ry, Paint paint) {}   private RectF mRectF;  
mRectF = new RectF(100, 100, 500, 500);//定义一个区域  
canvas.drawRoundRect(mRectF, 20, 50, paint); //第二、三个参数分别定义x和y方向的圆角弧度
绘制一个区域的内切圆或椭圆(视所定义的矩形而定) public void drawOval(RectF oval, Paint paint) {}   private RectF mRectF;  
mRectF = new RectF(100, 100, 200, 500);  
canvas.drawOval(mRectF, paint);
绘制弧形区域 public void drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter,Paint paint) {} private RectF mRectF;  
mRectF = new RectF(100, 100, 200, 200);//定义一个矩形区域  
canvas.drawArc(mRectF, 0, 90, false, paint);  
//第二个参数为起始弧度,第三个为终止弧度,第四个为显示方式 
绘制文本 public void drawText(String text, float x, float y, Paint paint) {}  
public void drawText(char[] text, int index, int count, float x, float y, Paint paint) {}  
public void drawText(String text, int start, int end, float x, float y, Paint paint) {}  
canvas.drawText("hwgt", 100, 100, paint);  
canvas.drawText(new char [] {'h','w','g','t','3','1','3','3'}, 2, 3, 100, 100, paint);  
canvas.drawText("hwgt3133", 2, 4, 100, 100, paint); //含头不含尾 
按照指定点的坐标绘制文本 public void drawPosText(String text, float[] pos, Paint paint) {}  
public void drawPosText(char[] text, int index, int count, float[] pos, Paint paint) {} 
canvas.drawPosText("hwgt", new float[]{50.0f,50.0f,100.0f,100.0f,250.0f,250.0f,500.0f,500.0f,}, paint);  
canvas.drawPosText(new char[]{'h','w','g','t'}, 3, 1, new float[]{50.0f,50.0f,100.0f,100.0f,250.0f,250.0f,500.0f,500.0f,}, paint);  
//推荐使用第二个方法,if (index < 0 || index + count > text.length || count*2 > pos.length),就会报错  
按照指定的路径绘制文本 public void drawTextOnPath(String text, Path path, float hOffset, float vOffset, Paint paint) {}    


3、一些方法的重点理解

3.1 setAntiAlias(boolean)方法解释

该方法作用是抗锯齿,什么意思呢,我们看下效果图,就知道了 

Paint.setAntiAlias()的作用

左边是没有设置抗锯齿的,右边是设置了抗锯齿的,边界明显变模糊了。

3.2  setDither(boolean)方法解释

该方法是设置防抖动。 
我们先看下没有设置防抖动的绘制出来的图 

Paint.setDither()方法的作用

然后我们看下设置了防抖动的绘制出来的图 

Paint.setDither()方法的作用

第二个是不是比第一个图柔和点,这就是防抖动的效果。 

3.3  drawRect()方法解释

该方法是绘制矩形

new Rect(150, 75, 260, 120)  

这个构造方法需要四个参数这四个参数 指明了什么位置 ?我们就来解释怎么画 这个 矩形 
这四个 参数 分别代表的意思是:left   top   right   bottom  上下左右呗。啊,不是 是 左 上 右 下。 下面给大家解释  
left : 矩形左边的X坐标  150        ---->图片中的A点 
top:    矩形顶部的Y坐标   75         ---->图片中的B点 
right :  矩形右边的X坐标   260       ----->图片中的C点 
bottom: 矩形底部的Y坐标 120     ------->图片中的D点 
说白了就是左上角的坐标是(150,75),右下角的坐标是(260,120),这样就好理解了

3.4   drawArc方法解释

    public void drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint)

  • oval :指定圆弧的外轮廓矩形区域。
  • startAngle: 圆弧起始角度,单位为度。
  • sweepAngle: 圆弧扫过的角度,顺时针方向,单位为度。
  • useCenter: 如果为True时,在绘制圆弧时将圆心包括在内,通常用来绘制扇形。
  • paint: 绘制圆弧的画板属性,如颜色,是否填充等。

关于圆弧起始角度的解释:

@Override  
protected void onDraw(Canvas canvas) {  
    super.onDraw(canvas);  
    canvas.drawArc(mRectF, 0, 90, false, mPaint);  
    mPaint.setColor(Color.RED);  
    canvas.drawArc(mRectF, 90, 90, false, mPaint);  
    mPaint.setColor(Color.YELLOW);  
    canvas.drawArc(mRectF, 180, 90, false, mPaint);  
    mPaint.setColor(Color.GRAY);  
    canvas.drawArc(mRectF, 270, 90, false, mPaint);  
    canvas.drawRect(mRectF,mPaint2);  
} 

效果如下图所示:

关于useCenter通过下面来进行描述:

参考地址:

            http://www.cnblogs.com/hwgt/p/5416866.html

            http://blog.csdn.net/rhljiayou/article/details/7212620/

        1、android绘图Paint.setAnitAlias()和Paint.setDither()方法的作用
            http://blog.csdn.net/lovexieyuan520/article/details/50732023
        2、Android Paint setAntiAlias
            http://blog.csdn.net/shichaosong/article/details/21157751

        3、关于Rect参数解释的比较好的文章
            http://blog.csdn.net/chengyingzhilian/article/details/7452082

        4、关于drawArc方法解释参考的文章

            http://blog.sina.com.cn/s/blog_783ede0301012im3.html

            http://blog.csdn.net/senyangs/article/details/44240307

猜你喜欢

转载自my.oschina.net/u/2253892/blog/916602