下文来自:

http://emmet1988.iteye.com/blog/1058517


----------------------------------

BasicViewDraw.java

Java代码
  1. packagecom.view;
  2. importcom.test.R;
  3. importandroid.view.View;
  4. importandroid.content.Context;
  5. importandroid.graphics.Canvas;
  6. importandroid.graphics.Color;
  7. importandroid.graphics.Paint;
  8. importandroid.graphics.RectF;
  9. importandroid.graphics.Path;
  10. importandroid.graphics.Shader;
  11. importandroid.graphics.LinearGradient;
  12. /*自定义继承View的MyView*/
  13. publicclassBasicViewDrawextendsView{
  14. publicBasicViewDraw(Contextcontext){
  15. super(context);
  16. }
  17. /*重写onDraw()*/
  18. @Override
  19. protectedvoidonDraw(Canvascanvas){
  20. super.onDraw(canvas);
  21. /*设置背景为白色*/
  22. canvas.drawColor(Color.WHITE);
  23. Paintpaint=newPaint();
  24. /*去锯齿*/
  25. paint.setAntiAlias(true);
  26. /*设置paint的颜色*/
  27. paint.setColor(Color.RED);
  28. /*设置paint的style为STROKE:空心*/
  29. paint.setStyle(Paint.Style.STROKE);
  30. /*设置paint的外框宽度*/
  31. paint.setStrokeWidth(3);
  32. /*画一个空心圆形*/
  33. canvas.drawCircle(40,40,30,paint);
  34. /*画一个空心正方形*/
  35. canvas.drawRect(10,90,70,150,paint);
  36. /*画一个空心长方形*/
  37. canvas.drawRect(10,170,70,200,paint);
  38. /*画一个空心椭圆形*/
  39. RectFre=newRectF(10,220,70,250);
  40. canvas.drawOval(re,paint);
  41. /*画一个空心三角形*/
  42. Pathpath=newPath();
  43. path.moveTo(10,330);
  44. path.lineTo(70,330);
  45. path.lineTo(40,270);
  46. path.close();//记得要close
  47. canvas.drawPath(path,paint);
  48. /*画一个空心梯形*/
  49. Pathpath1=newPath();
  50. path1.moveTo(10,410);
  51. path1.lineTo(70,410);
  52. path1.lineTo(55,350);
  53. path1.lineTo(25,350);
  54. path1.close();
  55. canvas.drawPath(path1,paint);
  56. /*设置paint的style为FILL:实心*/
  57. paint.setStyle(Paint.Style.FILL);
  58. /*设置paint的颜色*/
  59. paint.setColor(Color.BLUE);
  60. /*画一个实心圆*/
  61. canvas.drawCircle(120,40,30,paint);
  62. /*画一个实心正方形*/
  63. canvas.drawRect(90,90,150,150,paint);
  64. /*画一个实心长方形*/
  65. canvas.drawRect(90,170,150,200,paint);
  66. /*画一个实心椭圆*/
  67. RectFre2=newRectF(90,220,150,250);
  68. canvas.drawOval(re2,paint);
  69. /*画一个实心三角形*/
  70. Pathpath2=newPath();
  71. path2.moveTo(90,330);
  72. path2.lineTo(150,330);
  73. path2.lineTo(120,270);
  74. path2.close();
  75. canvas.drawPath(path2,paint);
  76. /*画一个实心梯形*/
  77. Pathpath3=newPath();
  78. path3.moveTo(90,410);
  79. path3.lineTo(150,410);
  80. path3.lineTo(135,350);
  81. path3.lineTo(105,350);
  82. path3.close();
  83. canvas.drawPath(path3,paint);
  84. /*设置渐变色*/
  85. ShadermShader=newLinearGradient(0,0,100,100,newint[]{
  86. Color.RED,Color.GREEN,Color.BLUE,Color.YELLOW},null,
  87. Shader.TileMode.REPEAT);
  88. paint.setShader(mShader);
  89. /*画一个渐变色圆*/
  90. canvas.drawCircle(200,40,30,paint);
  91. /*画一个渐变色正方形*/
  92. canvas.drawRect(170,90,230,150,paint);
  93. /*画一个渐变色长方形*/
  94. canvas.drawRect(170,170,230,200,paint);
  95. /*画一个渐变色椭圆*/
  96. RectFre3=newRectF(170,220,230,250);
  97. canvas.drawOval(re3,paint);
  98. /*画一个渐变色三角形*/
  99. Pathpath4=newPath();
  100. path4.moveTo(170,330);
  101. path4.lineTo(230,330);
  102. path4.lineTo(200,270);
  103. path4.close();
  104. canvas.drawPath(path4,paint);
  105. /*画一个渐变色梯形*/
  106. Pathpath5=newPath();
  107. path5.moveTo(170,410);
  108. path5.lineTo(230,410);
  109. path5.lineTo(215,350);
  110. path5.lineTo(185,350);
  111. path5.close();
  112. canvas.drawPath(path5,paint);
  113. /*写字*/
  114. paint.setTextSize(24);
  115. canvas.drawText(getResources().getString(R.string.str_text1),240,50,paint);
  116. canvas.drawText(getResources().getString(R.string.str_text2),240,120,paint);
  117. canvas.drawText(getResources().getString(R.string.str_text3),240,190,paint);
  118. canvas.drawText(getResources().getString(R.string.str_text4),240,250,paint);
  119. canvas.drawText(getResources().getString(R.string.str_text5),240,320,paint);
  120. canvas.drawText(getResources().getString(R.string.str_text6),240,390,paint);
  121. }
  122. }

BasicView2Draw.java

Java代码
  1. classBasicView2DrawextendsView{
  2. Paintpaint;
  3. Bitmapbitmap;
  4. publicBasicView2Draw(Contextcontext){
  5. super(context);
  6. paint=newPaint(Paint.ANTI_ALIAS_FLAG);
  7. bitmap=BitmapFactory.decodeResource(getResources(),R.drawable.icon);
  8. }
  9. privateBitmapcreateBitmap1(){
  10. Bitmapbitmap1=Bitmap.createBitmap(100,100,Config.ARGB_8888);
  11. Canvascanvas=newCanvas(bitmap1);
  12. canvas.drawColor(Color.BLUE);
  13. //canvas.drawARGB(0,0,0,0);//透明色
  14. canvas.drawBitmap(bitmap,0,0,paint);
  15. canvas.drawText("HelloAndroid",25,55,paint);
  16. returnbitmap1;
  17. }
  18. @Override
  19. protectedvoidonDraw(Canvascanvas){
  20. super.onDraw(canvas);
  21. //绘制位图
  22. //1.绘制位图在(10,10)位置上
  23. canvas.drawBitmap(createBitmap1(),10,10,paint);
  24. //2.canvas.drawBitmap(Bitmapbitmap,Rectsrc,Rectdest,Paintpaint);
  25. //canvas.drawBitmap(Bitmapbitmap,Rectsrc,RectFdest,Paintpaint);
  26. //绘制位图到一个指定的矩形dest中,位图会自动进行平移和缩放等操作,如果src的参数不为null
  27. //则会裁剪位图的部分区域来进行绘制
  28. Rectrect=newRect(10,10,50,60);
  29. RectFrectF1=newRectF(180.0f,20.0f,240.0f,80.0f);
  30. RectFrectF2=newRectF(180.0f,100.0f,240.0f,160.0f);
  31. canvas.drawBitmap(createBitmap1(),null,rectF1,paint);
  32. canvas.drawBitmap(createBitmap1(),rect,rectF2,paint);
  33. //点
  34. paint.setStyle(Paint.Style.FILL_AND_STROKE);
  35. paint.setStrokeWidth(5.0f);
  36. paint.setColor(Color.YELLOW);
  37. canvas.drawPoints(newfloat[]{120,120,140,140,160,160,180,180},paint);
  38. //线
  39. paint.reset();//重置画笔
  40. paint.setColor(Color.GREEN);
  41. paint.setAntiAlias(true);
  42. canvas.drawLine(30,30,130,40,paint);
  43. paint.setColor(Color.RED);
  44. canvas.drawLines(newfloat[]{40,40,140,40,50,50,90,90},paint);
  45. //矩形
  46. paint.setColor(Color.CYAN);
  47. canvas.drawRect(10,150,150,250,paint);
  48. paint.setColor(Color.GRAY);
  49. canvas.drawRect(newRect(10,260,150,280),paint);
  50. paint.setColor(Color.DKGRAY);
  51. canvas.drawRect(newRectF(20.2f,290.9f,120.2f,300.3f),paint);
  52. //绘制文本
  53. //paint.setTextSize(20);
  54. //paint.setColor(0x40ffffff);//半透明白色
  55. //paint.setTextAlign(Paint.Align.RIGHT);//对齐方向
  56. //canvas.drawText("CoolAndroid",250,180,paint);//这里注意,坐标(180,180)是文本的左下点坐标
  57. //画布平移:
  58. //平移的单位是像素,分别是在x,y轴上平移的像素点
  59. //正数代表的正方向,x轴为平面的右侧,y轴为平面的下方,相应的,负数则向反方向平移
  60. //canvas.translate(30.0f,30.0f);
  61. //画布缩放:
  62. //参数分别是在想x,y轴上放大或缩小的倍数,大雨1为放大,小于1为缩小,
  63. //缩放的原点默认为画布的原点(0,0),也可以指定缩放的原点
  64. //canvas.scale(2.0f,1.5f);
  65. //canvas.scale(0.5f,0.5f,100.0f,100.0f);//指定坐标(100.0f,100.0f)为缩放原点
  66. //这里剖析一下第二个缩放方法,其实系统为我们做的事情是这样的
  67. /*
  68. scale(floatsx,floatsy,floatpx,floatpy){
  69. translate(px,py);
  70. scale(sx,sy);
  71. translate(-px,-py);
  72. }
  73. */
  74. //画布旋转
  75. //1.以画布为原点,顺时针旋转40.0f度
  76. //canvas.rotate(40.0f);
  77. //2.以(100.11f,100.22f)为原点,顺时针旋转50.0f度
  78. //canvas.rotate(50.0f,100.11f,100.22f);
  79. //相应的,为了加深理解,我们再剖析一下第二个旋转方法
  80. //,其实系统为我们做的事情是这样的
  81. /*
  82. rotate(floatdegrees,floatpx,floatpy){
  83. translate(px,py);
  84. rotate(degrees);
  85. translate(-px,-py);
  86. }
  87. */
  88. //画布倾斜
  89. //skew(floatsx,floatxy);将画布在x及y轴方向上倾斜相应的角度,sx或sy为倾斜角度的tan值,
  90. //如canvas.skew(1,0);为在x方向上倾斜45度>>tan(45)=1
  91. //canvas.skew(1,0);
  92. }
  93. }

ClipRectDraw.java

Java代码
  1. packagecom.view;
  2. importandroid.content.Context;
  3. importandroid.graphics.Canvas;
  4. importandroid.graphics.Color;
  5. importandroid.graphics.Paint;
  6. importandroid.graphics.Path;
  7. importandroid.graphics.Region;
  8. importandroid.util.AttributeSet;
  9. importandroid.view.View;
  10. /**
  11. *---------------------------------------------------矩形区域-------------------------------------------------
  12. *canvas.clipRect(左上角x轴坐标,左上角y轴坐标,右下角x轴坐标,右下角y轴坐标,Region.Op.XOR);
  13. *最后一个参数有多个选择分别是:
  14. *//DIFFERENCE是第一次不同于第二次的部分显示出来
  15. //REPLACE是显示第二次的
  16. //REVERSE_DIFFERENCE是第二次不同于第一次的部分显示
  17. //INTERSECT:交集显示
  18. //UNION:全部显示
  19. //XOR补集,就是全集的减去交集剩余部分显示
  20. *@authoremmet1988.iteye.com
  21. *
  22. */
  23. publicclassClipRectDrawextendsView{
  24. Contextcontext;
  25. Paintpaint;
  26. Pathpath;
  27. publicClipRectDraw(Contextcontext){
  28. super(context);
  29. init();
  30. }
  31. publicClipRectDraw(Contextcontext,AttributeSetattrs){
  32. super(context,attrs);
  33. init();
  34. }
  35. publicClipRectDraw(Contextcontext,AttributeSetattrs,intdefStyle){
  36. super(context,attrs,defStyle);
  37. init();
  38. }
  39. privatevoidinit(){
  40. paint=newPaint();
  41. paint.setAntiAlias(true);
  42. paint.setStrokeWidth(5);
  43. paint.setTextSize(15);
  44. paint.setTextAlign(Paint.Align.RIGHT);
  45. path=newPath();
  46. }
  47. @Override
  48. protectedvoidonDraw(Canvascanvas){
  49. super.onDraw(canvas);
  50. canvas.drawColor(Color.GRAY);
  51. //左上图
  52. canvas.save();
  53. canvas.translate(10,10);
  54. drawScene(canvas);
  55. canvas.restore();
  56. //右上图
  57. canvas.save();
  58. canvas.translate(160,10);
  59. canvas.clipRect(10,10,90,90);
  60. canvas.clipRect(30,30,70,70,Region.Op.XOR);
  61. drawScene(canvas);
  62. canvas.restore();
  63. //左中图
  64. canvas.save();
  65. canvas.translate(10,130);
  66. path.reset();
  67. /*抛物曲线*/
  68. path.cubicTo(0,0,100,0,100,100);
  69. path.cubicTo(100,100,0,100,0,0);
  70. canvas.clipPath(path,Region.Op.REPLACE);
  71. drawScene(canvas);
  72. canvas.restore();
  73. //右中图
  74. canvas.save();
  75. canvas.translate(160,130);
  76. canvas.clipRect(0,0,60,60);
  77. canvas.clipRect(40,40,100,100,Region.Op.UNION);
  78. drawScene(canvas);
  79. canvas.restore();
  80. //左下图
  81. canvas.save();
  82. canvas.translate(10,250);
  83. canvas.clipRect(0,0,60,60);
  84. canvas.clipRect(40,40,100,100,Region.Op.XOR);
  85. drawScene(canvas);
  86. canvas.restore();
  87. //右下图
  88. canvas.translate(160,250);
  89. canvas.clipRect(0,0,60,60);
  90. canvas.clipRect(40,40,100,100,Region.Op.REVERSE_DIFFERENCE);
  91. drawScene(canvas);
  92. canvas.restore();
  93. }
  94. privatevoiddrawScene(Canvascanvas){
  95. canvas.clipRect(0,0,100,100);
  96. canvas.drawColor(Color.WHITE);
  97. paint.setColor(Color.RED);
  98. canvas.drawLine(0,0,100,100,paint);
  99. paint.setColor(Color.GREEN);
  100. canvas.drawCircle(30,70,30,paint);
  101. paint.setColor(Color.BLUE);
  102. canvas.drawText("ChenJianLi",100,30,paint);
  103. }
  104. }

MatrixDraw.java

Java代码
  1. packagecom.view;
  2. importcom.test.R;
  3. importandroid.content.Context;
  4. importandroid.graphics.Bitmap;
  5. importandroid.graphics.Canvas;
  6. importandroid.graphics.Matrix;
  7. importandroid.graphics.Paint;
  8. importandroid.graphics.drawable.BitmapDrawable;
  9. importandroid.view.View;
  10. /**
  11. *在Android里面,Matrix由9个float值构成,是一个3*3的矩阵。
  12. *cosX,-sinX,translateX
  13. *sinX,cosX,translateY
  14. *0,0,scale
  15. *解释一下,上面的sinX和cosX,表示旋转角度的cos值和sin值,注意,
  16. *旋转角度是按顺时针方向计算的。translateX和translateY表示x和y的平移量。
  17. *scale是缩放的比例,1是不变,2是表示缩放1/2,
  18. *@authoremmet1988.iteye.com
  19. *
  20. */
  21. publicclassMatrixDrawextendsViewimplementsRunnable{
  22. Bitmapbitmap;
  23. Matrixmatrix=newMatrix();
  24. Paintpaint;
  25. publicMatrixDraw(Contextcontext){
  26. super(context);
  27. bitmap=((BitmapDrawable)getResources().getDrawable(R.drawable.rotate_surfaceview)).getBitmap();
  28. paint=newPaint();
  29. paint.setAntiAlias(true);
  30. newThread(this).start();
  31. }
  32. floatm;
  33. floatn;
  34. @Override
  35. protectedvoidonDraw(Canvascanvas){
  36. /*
  37. floatcosValue=(float)Math.cos(-Math.PI/m);
  38. floatsinValue=(float)Math.sin(-Math.PI/m);
  39. Log.d("matrixdraw","Math.PI="+Math.PI);
  40. Log.d("matrixdraw","Math.PI/m="+Math.PI/m);
  41. Log.d("matrixdraw","Math.cos(-Math.PI/m)="+(float)Math.cos(-Math.PI/m));
  42. Log.d("matrixdraw","Math.sin(-Math.PI/m)="+(float)Math.sin(-Math.PI/m));
  43. matrix.setValues(newfloat[]{
  44. cosValue,-sinValue,100,
  45. sinValue,cosValue,100,
  46. 0,0,2
  47. });//举例,若缩放值为0.9,代表放大原图的十分之一
  48. //super.onDraw(canvas);//当然,如果界面上还有其他元素需要绘制,只需要将这句话写上就行了。
  49. //Matrixmatrix2=newMatrix(matrix);
  50. canvas.drawBitmap(bitmap,matrix,paint);
  51. //canvas.drawBitmap(bitmap,matrix2,paint);
  52. */
  53. n++;
  54. if(n==60){
  55. n=0;
  56. }
  57. matrix.postRotate(n);
  58. matrix.postTranslate(n,n);
  59. matrix.postScale(1,1,n,n);
  60. canvas.drawBitmap(bitmap,matrix,paint);
  61. }
  62. @Override
  63. publicvoidrun(){
  64. while(!Thread.currentThread().isInterrupted()){
  65. try{
  66. Thread.sleep(100);
  67. postInvalidate();
  68. }catch(InterruptedExceptione){
  69. Thread.currentThread().interrupt();
  70. }
  71. }
  72. }
  73. /**
  74. *以左上角为顶点,缩放一半,逆时针旋转30度,
  75. *然后沿x轴和y轴分别平移50个像素,
  76. *代码里面写的是100,为什么是平移50呢,
  77. *因为缩放了一半。
  78. *大家可以自己设置一下Matrix的值,或者尝试一下两个
  79. *Matrix相乘,得到的值设置进去,
  80. *这样才能对Matrix更加熟练。
  81. */
  82. }

Matrix2Draw.java

Java代码
  1. publicclassMatrix2DrawextendsView{
  2. privateBitmapmBitmap;
  3. privateMatrixmMatrix=newMatrix();
  4. publicMatrix2Draw(Contextcontext){
  5. super(context);
  6. initialize();
  7. }
  8. privatevoidinitialize(){
  9. Bitmapbmp=((BitmapDrawable)getResources().getDrawable(R.drawable.rotate_surfaceview)).getBitmap();
  10. mBitmap=bmp;
  11. /*首先,将缩放为100*100。这里scale的参数是比例。有一点要注意,如果直接用100/
  12. bmp.getWidth()的话,会得到0,因为是整型相除,所以必须其中有一个是float型的,
  13. 直接用100f就好。*/
  14. mMatrix.setScale(100f/bmp.getWidth(),100f/bmp.getHeight());
  15. /*//post方式:后乘>>当前的矩阵乘以参数给出的矩阵。可以连续多次使用post,来完成所需的整个变换。
  16. //平移到(100,100)处
  17. mMatrix.postTranslate(100,100);
  18. //倾斜x和y轴,以(100,100)为中心。
  19. mMatrix.postSkew(0.2f,0.2f,100,100);*/
  20. //pre方式:前乘>>参数给出的矩阵乘以当前的矩阵。所以操作是在当前矩阵的最前面发生的。
  21. //平移到(100,100)处
  22. mMatrix.preTranslate(100,100);
  23. //倾斜x和y轴,以(100,100)为中心。
  24. mMatrix.preSkew(0.2f,0.2f,100,100);
  25. }
  26. @OverrideprotectedvoidonDraw(Canvascanvas){
  27. //super.onDraw(canvas);//如果界面上还有其他元素需要绘制,只需要将这句话写上就行了。
  28. Paintpaint=newPaint(Paint.ANTI_ALIAS_FLAG);
  29. canvas.drawBitmap(mBitmap,mMatrix,paint);
  30. }
  31. }
  32. /**
  33. Matrix的操作:
  34. 总共分为translate(平移),rotate(旋转),scale(缩放)和skew(倾斜)四种,每一种变换在
  35. Android的API里都提供了set,post和pre三种操作方式,除了translate,其他三种操作都可以指定中心点。
  36. set是直接设置Matrix的值,每次set一次,整个Matrix的数组都会变掉。
  37. post是后乘,当前的矩阵乘以参数给出的矩阵。可以连续多次使用post,来完成所需的整个变换。
  38. pre是前乘,参数给出的矩阵乘以当前的矩阵。所以操作是在当前矩阵的最前面发生的。
  39. 旋转、缩放和倾斜都可以围绕一个中心点来进行,如果不指定,默认情况下,是围绕(0,0)点来进行。
  40. */

SimpleDraw.java

Java代码
  1. packagecom.view;
  2. importandroid.content.Context;
  3. importandroid.graphics.Canvas;
  4. importandroid.graphics.Color;
  5. importandroid.graphics.Paint;
  6. importandroid.graphics.Rect;
  7. importandroid.view.View;
  8. publicclassSimpleDrawextendsViewimplementsRunnable{
  9. /*
  10. *我们继续来介绍Android平台底层绘图类的相关内容,在AndroidUI开发专题(一)
  11. *之界面设计中我们介绍了有关Android平台资源使用以及Bitmap相关类的操作
  12. *,接下来将会以实例的方式给大家演示各种类的用处以及注意点。今天我们继续
  13. *了解android.graphics包中比较重要的绘图类。
  14. *
  15. *一、android.graphics.Matrix有关图形的变换、缩放等相关操作常用的方法有:
  16. *Java代码:voidreset()//重置一个matrix对象。
  17. *voidset(Matrixsrc)//复制一个源矩阵,和本类的构造方法Matrix(Matrixsrc)一样
  18. *booleanisIdentity()//返回这个矩阵是否定义(已经有意义)
  19. *voidsetRotate(floatdegrees)//指定一个角度以0,0为坐标进行旋转
  20. *voidsetRotate(floatdegrees,floatpx,floatpy)//指定一个角度以px,py为坐标进行旋转
  21. *voidsetScale(floatsx,floatsy)//缩放
  22. *voidsetScale(floatsx,floatsy,floatpx,floatpy)//以坐标px,py进行缩放
  23. *voidsetTranslate(floatdx,floatdy)//平移
  24. *voidsetSkew(floatkx,floatky,floatpx,floatpy)//以坐标px,py进行倾斜
  25. *voidsetSkew(floatkx,floatky)//倾斜复制代码二、android.graphics.NinePatch
  26. *
  27. *NinePatch是Android平台特有的一种非矢量图形自然拉伸处理方法,可以帮助常规的
  28. *图形在拉伸时不会缩放,
  29. *实例中Android开发网提示大家对于Toast的显示就是该原理,同时SDK中提供了一
  30. *个工具名为Draw
  31. *9-Patch,有关该工具的使用方法可以参考我们经发布的Draw
  32. *9-Patch使用方法介绍一文。由于该类提供了高质量支持透明的缩放方式,所以图形
  33. *格式为PNG,文件命名方式为.9.png
  34. *的后缀比如eoeandroid。
  35. *
  36. *三、android.graphics.Paint。Paint类我们可以理解为画笔、画刷的属性定义,本类
  37. *常用的方法如下:
  38. *
  39. *Java代码:voidreset()//重置
  40. *voidsetARGB(inta,intr,intg,intb)或voidsetColor(intcolor)
  41. *//均为设置Paint对象的颜色
  42. *voidsetAntiAlias(booleanaa)
  43. *
  44. *//是否抗锯齿,需要配合voidsetFlags(Paint.ANTI_ALIAS_FLAG)来帮助消除锯齿
  45. *使其边缘更平滑。
  46. *ShadersetShader(Shadershader)
  47. *
  48. *//设置阴影,Shader类是一个矩阵对象,如果为NULL将清除阴影。
  49. *voidsetStyle(Paint.Stylestyle)//设置样式,一般为FILL填充,或者STROKE凹陷
  50. *效果。
  51. *voidsetTextSize(floattextSize)//设置字体大小
  52. *voidsetTextAlign(Paint.Alignalign)//文本对齐方式
  53. *TypefacesetTypeface(Typefacetypeface)
  54. *//设置字体,通过Typeface可以加载Android内部的字体,一般为宋体对于中文,
  55. *部分ROM可以自己添加比如雅黑等等
  56. *voidsetUnderlineText(booleanunderlineText)
  57. *
  58. *//是否设置下划线,需要撇和voidsetFlags(Paint.UNDERLINE_TEXT_FLAG)方法。复制代码
  59. *四、android.graphics.Rect
  60. *
  61. *Rect我们可以理解为矩形区域,类似的还有Point一个点,Rect类除了表示一个矩
  62. *形区域位置描述外,
  63. *eoeandroid提示主要可以帮助我们计算图形之间是否碰撞
  64. *(包含)关系,对于Android游戏开发比较有用,其主要的成员contains包含了三种
  65. *重载方法,来判断包含关系.
  66. *
  67. *Java代码:
  68. *booleancontains(intleft,inttop,intright,intbottom)
  69. *booleancontains(intx,inty)
  70. *
  71. *booleancontains(Rectr)复制代码五、android.graphics.Region
  72. *Region在Android平台中表示一个区域和Rect不同的是
  73. *,它表示的是一个不规则的样子,可以是椭圆、多边形等等,而Rect仅仅是矩形。
  74. *同样Region的booleancontains(intx,
  75. *inty)成员可以判断一个点是否在该区域内。
  76. *
  77. *六、android.graphics.Typeface
  78. *Typeface类是帮助描述一个字体对象,在TextView中通过使用setTypeface方法来
  79. *制定一个输出文本的字体
  80. *,其直接构造调用成员create方法可以直接指定一个字体名称和样式,比如
  81. *Java代码:staticTypefacecreate(Typefacefamily,intstyle)
  82. *
  83. *staticTypefacecreate(StringfamilyName,intstyle)复制代码
  84. *同时使用isBold和isItalic方法可以判断出是否包含粗体或斜体的字型。
  85. *
  86. *Java代码:finalbooleanisBold()
  87. *finalbooleanisItalic()复制代码该类的创建方法还有从apk的资源或从一个具体的
  88. *文件路径,其具体方法为
  89. *Java代码:staticTypefacecreateFromAsset(AssetManagermgr,Stringpath)
  90. *staticTypefacecreateFromFile(Filepath)
  91. *staticTypefacecreateFromFile(Stringpath)复制代码
  92. */
  93. privatePaintpaint;
  94. publicSimpleDraw(Contextcontext){
  95. super(context);
  96. paint=newPaint();
  97. newThread(this).start();
  98. }
  99. @Override
  100. protectedvoidonDraw(Canvascanvas){
  101. super.onDraw(canvas);
  102. canvas.drawColor(Color.GRAY);//
  103. paint.setAntiAlias(true);//
  104. canvas.save();//
  105. canvas.clipRect(10,10,110,110);//
  106. canvas.drawColor(Color.WHITE);//
  107. //canvas.rotate(m);//以屏幕左上角为坐标原点旋转
  108. m+=45.0f;
  109. if(m==360.0f){
  110. m=0.0f;
  111. }
  112. canvas.rotate(m,60,60);//以(60,60)为原点旋转
  113. paint.setColor(Color.GREEN);
  114. canvas.drawRect(newRect(50,50,70,70),paint);
  115. canvas.restore();
  116. canvas.save();
  117. canvas.translate(140,10);
  118. canvas.clipRect(0,0,100,100);//一定要先剪辑出矩形区域再设画布背景,
  119. //否则会覆盖整张画布
  120. canvas.drawColor(Color.BLACK);
  121. paint.setColor(Color.BLUE);
  122. canvas.drawRect(newRect(10,10,50,50),paint);
  123. canvas.restore();
  124. //
  125. canvas.save();
  126. canvas.translate(120,120);
  127. canvas.clipRect(newRect(0,0,100,100));
  128. canvas.drawColor(Color.GREEN);
  129. //paint.setColor(Color.BLUE);
  130. paint.setStrokeWidth(4);
  131. paint.setColor(Color.BLACK);
  132. canvas.drawLine(0,60,100,60,paint);
  133. paint.setARGB(255,51,51,51);
  134. paint.setTextSize(20);
  135. paint.setFlags(Paint.ANTI_ALIAS_FLAG);
  136. paint.setUnderlineText(true);
  137. //paint.setFlags(Paint.UNDERLINE_TEXT_FLAG);
  138. canvas.drawText("陈建立",25,80,paint);
  139. paint.setColor(Color.WHITE);
  140. canvas.drawRect(newRect(10,10,50,50),paint);
  141. canvas.restore();
  142. }
  143. floatm=0.0f;
  144. publicvoidrun(){
  145. while(!Thread.currentThread().isInterrupted()){
  146. try{
  147. Thread.sleep(500);//每半秒执行一次
  148. }catch(InterruptedExceptione){
  149. Thread.currentThread().interrupt();
  150. }
  151. postInvalidate();
  152. }
  153. }
  154. }

TextDraw.java

Java代码
  1. packagecom.view;
  2. importandroid.content.Context;
  3. importandroid.graphics.Canvas;
  4. importandroid.graphics.Color;
  5. importandroid.graphics.Paint;
  6. importandroid.graphics.Paint.FontMetrics;
  7. importandroid.util.Log;
  8. importandroid.view.View;
  9. publicclassTextDrawextendsView{
  10. publicTextDraw(Contextcontext){
  11. super(context);
  12. }
  13. @Override
  14. protectedvoidonDraw(Canvascanvas){
  15. super.onDraw(canvas);
  16. PainttextPaint=newPaint(Paint.ANTI_ALIAS_FLAG);
  17. textPaint.setTextSize(35);
  18. textPaint.setColor(Color.WHITE);
  19. //FontMetrics
  20. FontMetricsfontMetrics=textPaint.getFontMetrics();
  21. Stringtext="abcdefghijklm";
  22. //
  23. floatbaseX=0;
  24. floatbaseY=100;
  25. Log.d("textDraw","top="+fontMetrics.top+
  26. "ascent="+fontMetrics.ascent+
  27. "descent="+fontMetrics.descent+
  28. "bottom="+fontMetrics.bottom+"\n");
  29. floattopY=baseY+fontMetrics.top;
  30. floatascentY=baseY+fontMetrics.ascent;
  31. floatdescentY=baseY+fontMetrics.descent;
  32. floatbottomY=baseY+fontMetrics.bottom;
  33. Log.d("textDraw","topY="+topY+
  34. "ascentY="+ascentY+
  35. "descentY="+descentY+
  36. "bottomY="+bottomY);
  37. //
  38. canvas.drawText(text,baseX,baseY,textPaint);
  39. //BaseLine
  40. PaintbaseLinePaint=newPaint(Paint.ANTI_ALIAS_FLAG);
  41. baseLinePaint.setColor(Color.RED);
  42. canvas.drawLine(0,baseY,getWidth(),baseY,baseLinePaint);
  43. //Base
  44. canvas.drawCircle(baseX,baseY,5,baseLinePaint);
  45. //TopLine
  46. PainttopLinePaint=newPaint(Paint.ANTI_ALIAS_FLAG);
  47. topLinePaint.setColor(Color.LTGRAY);
  48. canvas.drawLine(0,topY,getWidth(),topY,topLinePaint);
  49. //AscentLine
  50. PaintascentLinePaint=newPaint(Paint.ANTI_ALIAS_FLAG);
  51. ascentLinePaint.setColor(Color.GREEN);
  52. canvas.drawLine(0,ascentY,getWidth(),ascentY,ascentLinePaint);
  53. //DescentLine
  54. PaintdescentLinePaint=newPaint(Paint.ANTI_ALIAS_FLAG);
  55. descentLinePaint.setColor(Color.YELLOW);
  56. canvas.drawLine(0,descentY,getWidth(),descentY,descentLinePaint);
  57. //ButtomLine
  58. PaintbottomLinePaint=newPaint(Paint.ANTI_ALIAS_FLAG);
  59. bottomLinePaint.setColor(Color.MAGENTA);
  60. canvas.drawLine(0,bottomY,getWidth(),bottomY,bottomLinePaint);
  61. }
  62. }

RoundAndReflectionDraw.java

Java代码
  1. classRoundImageViewextendsView{
  2. privateBitmapbitmap;
  3. intbitmapWidth;
  4. intbitmapHeight;
  5. publicRoundImageView(Contextcontext){
  6. super(context);
  7. bitmap=BitmapFactory.decodeResource(getResources(),R.drawable.rotate_surfaceview);
  8. bitmapWidth=bitmap.getWidth();
  9. bitmapHeight=bitmap.getHeight();
  10. }
  11. @Override
  12. protectedvoidonDraw(Canvascanvas){
  13. super.onDraw(canvas);
  14. //第一种方法:
  15. /*BitmaproundBitmap=Bitmap.createBitmap(bitmapWidth,bitmapHeight,Bitmap.Config.ARGB_8888);
  16. canvas=newCanvas(roundBitmap);
  17. Paintpaint=newPaint(Paint.ANTI_ALIAS_FLAG);
  18. paint.setColor(Color.BLUE);
  19. canvas.drawRoundRect(newRectF(0,0,bitmapWidth,bitmapHeight),20.0f,20.0f,paint);
  20. paint.setXfermode(newPorterDuffXfermode(PorterDuff.Mode.DST_IN));
  21. canvas.drawBitmap(bitmap,0,0,null);
  22. canvas.drawBitmap(roundBitmap,0,0,paint);*/
  23. //第二种方法:
  24. Paintpaint=newPaint(Paint.ANTI_ALIAS_FLAG);
  25. paint.setColor(0xffffffff);
  26. paint.setTextSize(15);
  27. canvas.drawText("生成带圆角的图片",10,25,paint);
  28. canvas.drawBitmap(getRoundedCornerBitmap(bitmap),10,30,paint);
  29. canvas.drawText("生成带倒影的图片",170,160,paint);
  30. canvas.drawBitmap(createReflectionImageWithOrigin(bitmap),170,165,paint);
  31. }
  32. publicBitmapgetRoundedCornerBitmap(Bitmapbitmap){
  33. //创建一个指定宽度和高度的空位图对象
  34. Bitmapoutput=Bitmap.createBitmap(bitmap.getWidth(),bitmap.getHeight(),Config.ARGB_8888);
  35. //用该位图创建画布
  36. Canvascanvas=newCanvas(output);
  37. //画笔对象
  38. finalPaintpaint=newPaint();
  39. //画笔的颜色
  40. finalintcolor=0xff424242;
  41. //矩形区域对象
  42. finalRectrect=newRect(0,0,bitmap.getWidth(),bitmap.getHeight());
  43. //未知
  44. finalRectFrectF=newRectF(rect);
  45. //拐角的半径
  46. finalfloatroundPx=12;
  47. //消除锯齿
  48. paint.setAntiAlias(true);
  49. //画布背景色
  50. canvas.drawARGB(0,0,0,0);
  51. //设置画笔颜色
  52. paint.setColor(color);
  53. //绘制圆角矩形
  54. canvas.drawRoundRect(rectF,roundPx,roundPx,paint);
  55. //未知
  56. paint.setXfermode(newPorterDuffXfermode(Mode.SRC_IN));
  57. //把该图片绘制在该圆角矩形区域中
  58. canvas.drawBitmap(bitmap,rect,rect,paint);
  59. //最终在画布上呈现的就是该圆角矩形图片,然后我们返回该Bitmap对象
  60. returnoutput;
  61. }
  62. //获得带倒影的图片方法
  63. publicBitmapcreateReflectionImageWithOrigin(Bitmapbitmap){
  64. //图片与倒影之间的距离间隔
  65. finalintreflectionGap=2;
  66. //原图的宽度
  67. intwidth=bitmap.getWidth();
  68. //原图的高度
  69. intheight=bitmap.getHeight();
  70. //图片旋转,缩放等控制对象
  71. Matrixmatrix=newMatrix();
  72. //缩放(这里pre,set,post三种效果是不一样的,注意区别)
  73. matrix.preScale(1,-1);
  74. /**
  75. set是直接设置Matrix的值,每次set一次,整个Matrix的数组都会变掉。
  76. post是后乘,当前的矩阵乘以参数给出的矩阵。可以连续多次使用post,
  77. 来完成所需的整个变换。例如,要将一个图片旋
  78. 转30度,然后平移到(100,100)的地方,那么可以这样做:
  79. Matrixm=newMatrix();
  80. m.postRotate(30);
  81. m.postTranslate(100,100);
  82. 这样就达到了想要的效果。
  83. pre是前乘,参数给出的矩阵乘以当前的矩阵。所以操作是在当前矩阵的最前面发生的。
  84. 例如上面的例子,如果用pre的话,就要这样:
  85. Matrixm=newMatrix();
  86. m.setTranslate(100,100);
  87. m.preRotate(30);
  88. 旋转、缩放和倾斜都可以围绕一个中心点来进行,如果不指定,默认情况下,
  89. 是围绕(0,0)点来进行。
  90. 关于缩放:
  91. scale的参数是比例。例如,我们缩放为100%,则有一点要注意,如果直接用
  92. 100/bmp.getWidth()的话,会得到0,因为是整型相除,所以必须其中有一个是
  93. float型的,直接用100f就好。
  94. 如:matrix.setScale(100f/bmp.getWidth(),100f/bmp.getHeight());
  95. */
  96. //创建一个初始的倒影位图
  97. BitmapreflectionImage=Bitmap.createBitmap(bitmap,0,height/2,width,height/2,matrix,false);
  98. //新建一个宽度为原图宽度,高度为原图高度的3/2的位图,用于绘制新的位图,即整体的效果图位图对象
  99. BitmapbitmapWithReflection=Bitmap.createBitmap(width,(height+height/2),Config.ARGB_8888);
  100. //由该位图对象创建初始画布(规定了画布的宽高)
  101. Canvascanvas=newCanvas(bitmapWithReflection);
  102. //在该画布上绘制原图
  103. canvas.drawBitmap(bitmap,0,0,null);
  104. //创建一个画笔
  105. PaintdeafalutPaint=newPaint();
  106. //绘制一个矩形区域,该矩形区域便是原图和倒影图之间的间隔图
  107. canvas.drawRect(0,height,width,height+reflectionGap,deafalutPaint);
  108. //绘制该倒影图于间隔图的下方
  109. canvas.drawBitmap(reflectionImage,0,height+reflectionGap,null);
  110. //创建一个画笔
  111. Paintpaint=newPaint();
  112. //创建一个线性渐变对象
  113. LinearGradientshader=newLinearGradient(
  114. 0,bitmap.getHeight(),
  115. 0,bitmapWithReflection.getHeight()+reflectionGap,
  116. 0x70ffffff,0x00ffffff,
  117. TileMode.CLAMP
  118. );
  119. //把渐变效果应用在画笔上
  120. paint.setShader(shader);
  121. //SettheTransfermodetobeporterduffanddestinationin
  122. //未知
  123. paint.setXfermode(newPorterDuffXfermode(Mode.DST_IN));
  124. //Drawarectangleusingthepaintwithourlineargradient
  125. //绘制出该渐变效果,也就是最终的倒影效果图
  126. canvas.drawRect(0,height,width,bitmapWithReflection.getHeight()+reflectionGap,paint);
  127. //返回
  128. returnbitmapWithReflection;
  129. }
  130. }
  131. /**
  132. *绘制圆角背景以及图片圆角的处理
  133. .配置文件实现
  134. <?xmlversion="1.0"encoding="utf-8"?>
  135. <layer-list
  136. *xmlns:android="http://schemas.android.com/apk/res/android"><item
  137. *android:drawable="@drawable/icon_home_button_img"/><item
  138. *android:drawable="@drawable/icon_home_shape_overlay"/>
  139. *</layer-list>
  140. *icon_home_shape_overlay如下
  141. *<?xmlversion="1.0"encoding="utf-8"?>
  142. *<shape
  143. *xmlns:android="http://schemas.android.com/apk/res/android"><solid
  144. *android:color="#60000000"/>
  145. *<strokeandroid:width="3dp"
  146. *color="#ff000000"/>
  147. *<cornersandroid:radius="10dp"/>
  148. *</shape>
  149. *或者直接使用一种效果
  150. *<?xmlversion="1.0"encoding="UTF-8"?>
  151. *<shape
  152. *xmlns:android="http://schemas.android.com/apk/res/android">
  153. *<solid
  154. *android:color="#99FFFFFF"/>
  155. *<cornersandroid:radius="30px"/>
  156. *<padding
  157. *android:left="0dp"android:top="0dp"android:right="0dp"
  158. *android:bottom="0dp"/>
  159. *</shape>
  160. *然后
  161. *android:background="@drawable/my_shape_file"
  162. *
  163. *
  164. *2.图片本身加上圆角BitmapmyCoolBitmap=...;//<--Yourbitmapyouwantrounded
  165. *
  166. *intw=myCoolBitmap.getWidth(),h=myCoolBitmap.getHeight();
  167. *Bitmaprounder=Bitmap.createBitmap(w,h,Bitmap.Config.ARGB_8888);Canvas
  168. *canvas=newCanvas(rounder);
  169. *
  170. *PaintxferPaint=newPaint(Paint.ANTI_ALIAS_FLAG);
  171. *xferPaint.setColor(Color.RED);
  172. *
  173. *canvas.drawRoundRect(newRectF(0,0,w,h),20.0f,20.0f,xferPaint);
  174. *
  175. *xferPaint.setXfermode(newPorterDuffXfermode(PorterDuff.Mode.DST_IN));
  176. *canvas.drawBitmap(myCoolBitmap,0,0,null);
  177. *canvas.drawBitmap(rounder,0,0,xferPaint);
  178. *或者
  179. *publicstaticBitmapgetRoundedCornerBitmap(Bitmapbitmap){
  180. *Bitmapoutput=Bitmap.createBitmap(bitmap.getWidth(),
  181. *bitmap.getHeight(),Config.ARGB_8888);
  182. *Canvascanvas=newCanvas(output);
  183. *
  184. *finalintcolor=0xff424242;finalPaintpaint=newPaint();finalRect
  185. *rect=newRect(0,0,bitmap.getWidth(),bitmap.getHeight());finalRectF
  186. *rectF=newRectF(rect);finalfloatroundPx=12;
  187. *
  188. *paint.setAntiAlias(true);canvas.drawARGB(0,0,0,0);
  189. *paint.setColor(color);canvas.drawRoundRect(rectF,roundPx,roundPx,paint);
  190. *
  191. *paint.setXfermode(newPorterDuffXfermode(Mode.SRC_IN));
  192. *canvas.drawBitmap(bitmap,rect,rect,paint);
  193. *
  194. *returnoutput;
  195. *}
  196. */

SurfaceViewDraw.java

Java代码
  1. packagecom.view;
  2. importcom.test.R;
  3. importandroid.content.Context;
  4. importandroid.graphics.Bitmap;
  5. importandroid.graphics.BitmapFactory;
  6. importandroid.graphics.Canvas;
  7. importandroid.graphics.Matrix;
  8. importandroid.graphics.Paint;
  9. importandroid.graphics.Rect;
  10. importandroid.util.Log;
  11. importandroid.view.SurfaceHolder;
  12. importandroid.view.SurfaceView;
  13. /**
  14. *http://wallage.blog.163.com/blog/static/173896242010101232220959/
  15. *@authoremmet1988.iteye.com
  16. *
  17. */
  18. publicclassSurfaceViewDrawextendsSurfaceViewimplementsRunnable,SurfaceHolder.Callback{
  19. privateBitmapbackgroundBitmap;
  20. privateBitmaprotateBitmap;
  21. SurfaceHoldersurfaceHolder;
  22. publicSurfaceViewDraw(Contextcontext){
  23. super(context);
  24. backgroundBitmap=BitmapFactory.decodeResource(getResources(),R.drawable.background_surfaceview);
  25. rotateBitmap=BitmapFactory.decodeResource(getResources(),R.drawable.rotate_surfaceview);
  26. surfaceHolder=this.getHolder();
  27. surfaceHolder.addCallback(this);
  28. }
  29. publicvoidsurfaceCreated(SurfaceHolderholder){
  30. newThread(this).start();
  31. Log.d("surfaceview","surfaceCreated");
  32. }
  33. publicvoidsurfaceChanged(SurfaceHolderholder,intformat,intwidth,
  34. intheight){
  35. Log.d("surfaceview","surfaceChanged");
  36. }
  37. publicvoidsurfaceDestroyed(SurfaceHolderholder){
  38. Log.d("surfaceview","surfaceDestroyed");
  39. }
  40. @Override
  41. publicvoidrun(){
  42. Log.d("surfaceview","run");
  43. Canvascanvas=null;
  44. introtateValue=0;//旋转角度
  45. intframeCount=0;//帧计数器
  46. while(!Thread.currentThread().isInterrupted()){
  47. try{
  48. //canvas=surfaceHolder.lockCanvas();//获取画布对象(获取整个屏幕的画布)
  49. canvas=surfaceHolder.lockCanvas(newRect(10,10,240,250));//获取某个区域的画布
  50. Paintpaint=newPaint();
  51. Log.d("surfaceview","rotateValue"+rotateValue+"|frameCount"+frameCount);
  52. if(frameCount++<2){//仅在第一次绘制时绘制背景
  53. /*
  54. *这里为什么设置成<2,而不是1,是由于SurfaceView本身的双缓冲技术。
  55. 覆盖刷新其实就是将每次的新的图形绘制到上一帧去,
  56. 所以如果图像是半透明的,就要考虑重复叠加导致的问题了,
  57. 而如果是完全不透明的图形则不会有任何问题。
  58. 背景会在背景图和黑色背景之间来回闪。
  59. 这个问题其实是源于SurfaceView的双缓冲机制,我理解就是它会缓冲
  60. 前两帧的图像交替传递给后面的帧用作覆盖,这样由于我们仅在第一帧
  61. 绘制了背景,第二帧就是无背景状态了,且通过双缓冲机制一直保持下
  62. 来,解决办法就是改为在前两帧都进行背景绘制。
  63. */
  64. canvas.drawBitmap(backgroundBitmap,0,0,paint);//绘制背景
  65. }
  66. //创建矩阵以控制图片的旋转和平移
  67. Matrixmatrix=newMatrix();
  68. rotateValue+=40;
  69. matrix.setRotate(rotateValue,rotateBitmap.getWidth()/2,rotateBitmap.getHeight()/2);
  70. //matrix.postRotate(rotateValue,rotateBitmap.getWidth()/2,rotateBitmap.getHeight()/2);
  71. //matrix.setTranslate(100,rotateValue);
  72. if(rotateValue==360){
  73. rotateValue=0;
  74. }
  75. matrix.setTranslate(80,50);//设置左边距和上边距
  76. //绘制问号
  77. Log.d("surfaceview","canvas"+canvas);
  78. Log.d("surfaceview","rotateBitmap"+rotateBitmap);
  79. Log.d("surfaceview","matrix"+matrix);
  80. Log.d("surfaceview","paint"+paint);
  81. if(canvas!=null){
  82. canvas.drawBitmap(rotateBitmap,matrix,paint);
  83. //解锁画布,提交画好的图像
  84. surfaceHolder.unlockCanvasAndPost(canvas);
  85. }
  86. Thread.sleep(30);
  87. }catch(InterruptedExceptione){
  88. Thread.currentThread().interrupt();
  89. Log.d("surfaceview","InterruptedException");
  90. }finally{
  91. Log.d("surfaceview","finally");
  92. }
  93. }
  94. }
  95. }

更多相关文章

  1. Android(安卓)Canvas学习笔记(1)
  2. Android(安卓)本地文件管理类
  3. Android将HTML文本显示在webView控件中
  4. 【Android】高德地图2DMap,隐藏“高德地图”logo样式(不同版本或有
  5. Android绘制波浪曲线,效果很赞的。
  6. android缩放大图片加载
  7. android浏览器和iPhone浏览器
  8. Android(安卓)Canvas类介绍和Android(安卓)Draw Rect 坐标图示
  9. Android中关于矩阵(Matrix)前乘后乘的一些认识

随机推荐

  1. android百问(更新中)
  2. Android特殊字体引入,以及描边和投影
  3. Android 编译环境配置搭建(Ubuntu 12.04)
  4. ShareSDK for Android(安卓)只有新浪微博
  5. 适用于Android的Google Fit:读取传感器数
  6. Android -Recovery
  7. Android SDK需要安装的包
  8. 【Flutter开发】------修改图标、应用名
  9. android笔试题
  10. Android核心模块内容概述