Android 中如何自己通过代码绘图

下文来自:

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. }
package com.view; import com.test.R; import android.view.View; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.RectF; import android.graphics.Path; import android.graphics.Shader; import android.graphics.LinearGradient; /* 自定义继承View 的MyView*/ public class BasicViewDraw extends View { public BasicViewDraw(Context context) { super(context); } /* 重写onDraw() */ @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); /* 设置背景为白色 */ canvas.drawColor(Color.WHITE); Paint paint = new Paint(); /* 去锯齿 */ paint.setAntiAlias(true); /* 设置paint的颜色 */ paint.setColor(Color.RED); /* 设置paint的 style 为STROKE:空心 */ paint.setStyle(Paint.Style.STROKE); /* 设置paint的外框宽度 */ paint.setStrokeWidth(3); /* 画一个空心圆形 */ canvas.drawCircle(40, 40, 30, paint); /* 画一个空心正方形 */ canvas.drawRect(10, 90, 70, 150, paint); /* 画一个空心长方形 */ canvas.drawRect(10, 170, 70, 200, paint); /* 画一个空心椭圆形 */ RectF re = new RectF(10, 220, 70, 250); canvas.drawOval(re, paint); /* 画一个空心三角形 */ Path path = new Path(); path.moveTo(10, 330); path.lineTo(70, 330); path.lineTo(40, 270); path.close();//记得要close canvas.drawPath(path, paint); /* 画一个空心梯形 */ Path path1 = new Path(); path1.moveTo(10, 410); path1.lineTo(70, 410); path1.lineTo(55, 350); path1.lineTo(25, 350); path1.close(); canvas.drawPath(path1, paint); /* 设置paint 的style为 FILL:实心 */ paint.setStyle(Paint.Style.FILL); /* 设置paint的颜色 */ paint.setColor(Color.BLUE); /* 画一个实心圆 */ canvas.drawCircle(120, 40, 30, paint); /* 画一个实心正方形 */ canvas.drawRect(90, 90, 150, 150, paint); /* 画一个实心长方形 */ canvas.drawRect(90, 170, 150, 200, paint); /* 画一个实心椭圆 */ RectF re2 = new RectF(90, 220, 150, 250); canvas.drawOval(re2, paint); /* 画一个实心三角形 */ Path path2 = new Path(); path2.moveTo(90, 330); path2.lineTo(150, 330); path2.lineTo(120, 270); path2.close(); canvas.drawPath(path2, paint); /* 画一个实心梯形 */ Path path3 = new Path(); path3.moveTo(90, 410); path3.lineTo(150, 410); path3.lineTo(135, 350); path3.lineTo(105, 350); path3.close(); canvas.drawPath(path3, paint); /* 设置渐变色 */ Shader mShader = new LinearGradient(0, 0, 100, 100, new int[] { Color.RED, Color.GREEN, Color.BLUE, Color.YELLOW }, null, Shader.TileMode.REPEAT); paint.setShader(mShader); /* 画一个渐变色圆 */ canvas.drawCircle(200, 40, 30, paint); /* 画一个渐变色正方形 */ canvas.drawRect(170, 90, 230, 150, paint); /* 画一个渐变色长方形 */ canvas.drawRect(170, 170, 230, 200, paint); /* 画一个渐变色椭圆 */ RectF re3 = new RectF(170, 220, 230, 250); canvas.drawOval(re3, paint); /* 画一个渐变色三角形 */ Path path4 = new Path(); path4.moveTo(170, 330); path4.lineTo(230, 330); path4.lineTo(200, 270); path4.close(); canvas.drawPath(path4, paint); /* 画一个渐变色梯形 */ Path path5 = new Path(); path5.moveTo(170, 410); path5.lineTo(230, 410); path5.lineTo(215, 350); path5.lineTo(185, 350); path5.close(); canvas.drawPath(path5, paint); /* 写字 */ paint.setTextSize(24); canvas.drawText(getResources().getString(R.string.str_text1), 240, 50,paint); canvas.drawText(getResources().getString(R.string.str_text2), 240, 120,paint); canvas.drawText(getResources().getString(R.string.str_text3), 240, 190,paint); canvas.drawText(getResources().getString(R.string.str_text4), 240, 250,paint); canvas.drawText(getResources().getString(R.string.str_text5), 240, 320,paint); canvas.drawText(getResources().getString(R.string.str_text6), 240, 390,paint); } }

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. }
class BasicView2Draw extends View{ Paint paint; Bitmap bitmap; public BasicView2Draw(Context context) { super(context); paint = new Paint(Paint.ANTI_ALIAS_FLAG); bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.icon); } private Bitmap createBitmap1(){ Bitmap bitmap1 = Bitmap.createBitmap(100, 100, Config.ARGB_8888); Canvas canvas = new Canvas(bitmap1); canvas.drawColor(Color.BLUE); // canvas.drawARGB(0, 0, 0, 0);// 透明色 canvas.drawBitmap(bitmap, 0, 0, paint); canvas.drawText("Hello Android", 25, 55, paint); return bitmap1; } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); // 绘制位图 // 1.绘制位图在(10,10)位置上 canvas.drawBitmap(createBitmap1(), 10, 10, paint); // 2. canvas.drawBitmap(Bitmap bitmap,Rect src,Rect dest,Paint paint); // canvas.drawBitmap(Bitmap bitmap,Rect src,RectF dest,Paint paint); // 绘制位图到一个指定的矩形dest中,位图会自动进行平移和缩放等操作,如果src的参数不为null // 则会裁剪位图的部分区域来进行绘制 Rect rect = new Rect(10, 10, 50, 60); RectF rectF1 = new RectF(180.0f, 20.0f, 240.0f, 80.0f); RectF rectF2 = new RectF(180.0f, 100.0f, 240.0f, 160.0f); canvas.drawBitmap(createBitmap1(), null, rectF1, paint); canvas.drawBitmap(createBitmap1(), rect, rectF2, paint); // 点 paint.setStyle(Paint.Style.FILL_AND_STROKE); paint.setStrokeWidth(5.0f); paint.setColor(Color.YELLOW); canvas.drawPoints(new float[]{120,120,140,140,160,160,180,180}, paint); // 线 paint.reset();// 重置画笔 paint.setColor(Color.GREEN); paint.setAntiAlias(true); canvas.drawLine(30, 30, 130, 40, paint); paint.setColor(Color.RED); canvas.drawLines(new float[]{ 40,40,140,40 ,50,50,90,90 }, paint); // 矩形 paint.setColor(Color.CYAN); canvas.drawRect(10, 150, 150, 250, paint); paint.setColor(Color.GRAY); canvas.drawRect(new Rect(10, 260, 150, 280), paint); paint.setColor(Color.DKGRAY); canvas.drawRect(new RectF(20.2f, 290.9f, 120.2f, 300.3f), paint); // 绘制文本 // paint.setTextSize(20); // paint.setColor(0x40ffffff);// 半透明白色 // paint.setTextAlign(Paint.Align.RIGHT);// 对齐方向 // canvas.drawText("Cool Android", 250, 180, paint);// 这里注意,坐标(180,180)是文本的左下点坐标 // 画布平移: // 平移的单位是像素,分别是在x,y轴上平移的像素点 // 正数代表的正方向,x轴为平面的右侧,y轴为平面的下方,相应的,负数则向反方向平移 // canvas.translate(30.0f, 30.0f); // 画布缩放: // 参数分别是在想x,y轴上放大或缩小的倍数,大雨1为放大,小于1为缩小, // 缩放的原点默认为画布的原点(0,0),也可以指定缩放的原点 // canvas.scale(2.0f, 1.5f); // canvas.scale(0.5f, 0.5f, 100.0f, 100.0f);// 指定坐标(100.0f,100.0f)为缩放原点 // 这里剖析一下第二个缩放方法,其实系统为我们做的事情是这样的 /* scale(float sx, float sy, float px, float py){ translate(px,py); scale(sx,sy); translate(-px,-py); } */ // 画布旋转 // 1.以画布为原点,顺时针旋转40.0f度 // canvas.rotate(40.0f); // 2.以(100.11f, 100.22f)为原点,顺时针旋转50.0f度 // canvas.rotate(50.0f, 100.11f, 100.22f); // 相应的,为了加深理解,我们再剖析一下第二个旋转方法 // ,其实系统为我们做的事情是这样的 /* rotate(float degrees, float px, float py){ translate(px,py); rotate(degrees); translate(-px,-py); } */ // 画布倾斜 // skew(float sx,float xy);将画布在x及y轴方向上倾斜相应的角度,sx或sy为倾斜角度的tan值, // 如canvas.skew(1,0);为在x方向上倾斜45度 >> tan(45) = 1 // canvas.skew(1,0); } }

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. }
package com.view; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Path; import android.graphics.Region; import android.util.AttributeSet; import android.view.View; /** * ---------------------------------------------------矩形区域------------------------------------------------- * canvas.clipRect(左上角x轴坐标, 左上角y轴坐标, 右下角x轴坐标, 右下角y轴坐标, Region.Op.XOR); * 最后一个参数有多个选择分别是: * //DIFFERENCE是第一次不同于第二次的部分显示出来 //REPLACE是显示第二次的 //REVERSE_DIFFERENCE 是第二次不同于第一次的部分显示 //INTERSECT:交集显示 //UNION:全部显示 //XOR补集,就是全集的减去交集剩余部分显示 * @author emmet1988.iteye.com * */ public class ClipRectDraw extends View { Context context; Paint paint; Path path; public ClipRectDraw(Context context) { super(context); init(); } public ClipRectDraw(Context context, AttributeSet attrs) { super(context, attrs); init(); } public ClipRectDraw(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(); } private void init(){ paint = new Paint(); paint.setAntiAlias(true); paint.setStrokeWidth(5); paint.setTextSize(15); paint.setTextAlign(Paint.Align.RIGHT); path = new Path(); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawColor(Color.GRAY); //左上图 canvas.save(); canvas.translate(10, 10); drawScene(canvas); canvas.restore(); //右上图 canvas.save(); canvas.translate(160, 10); canvas.clipRect(10, 10, 90, 90); canvas.clipRect(30, 30, 70, 70, Region.Op.XOR); drawScene(canvas); canvas.restore(); //左中图 canvas.save(); canvas.translate(10, 130); path.reset(); /*抛物曲线*/ path.cubicTo(0, 0, 100, 0, 100, 100); path.cubicTo(100, 100, 0, 100, 0, 0); canvas.clipPath(path, Region.Op.REPLACE); drawScene(canvas); canvas.restore(); //右中图 canvas.save(); canvas.translate(160, 130); canvas.clipRect(0, 0, 60, 60); canvas.clipRect(40, 40, 100, 100, Region.Op.UNION); drawScene(canvas); canvas.restore(); //左下图 canvas.save(); canvas.translate(10, 250); canvas.clipRect(0, 0, 60, 60); canvas.clipRect(40, 40, 100, 100, Region.Op.XOR); drawScene(canvas); canvas.restore(); //右下图 canvas.translate(160, 250); canvas.clipRect(0, 0, 60, 60); canvas.clipRect(40, 40, 100, 100, Region.Op.REVERSE_DIFFERENCE); drawScene(canvas); canvas.restore(); } private void drawScene(Canvas canvas){ canvas.clipRect(0, 0, 100, 100); canvas.drawColor(Color.WHITE); paint.setColor(Color.RED); canvas.drawLine(0, 0, 100, 100, paint); paint.setColor(Color.GREEN); canvas.drawCircle(30, 70, 30, paint); paint.setColor(Color.BLUE); canvas.drawText("ChenJianLi", 100, 30, paint); } }

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. }
package com.view; import com.test.R; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.drawable.BitmapDrawable; import android.view.View; /** * 在 Android 里面, Matrix 由 9 个 float 值构成,是一个 3*3 的矩阵。 * cosX, -sinX,translateX * sinX, cosX,translateY * 0, 0, scale * 解释一下,上面的 sinX 和 cosX ,表示旋转角度的 cos 值和 sin 值,注意, * 旋转角度是按顺时针方向计算的。 translateX 和 translateY 表示 x 和 y 的平移量。 * scale 是缩放的比例, 1 是不变, 2 是表示缩放 1/2 , * @author emmet1988.iteye.com * */ public class MatrixDraw extends View implements Runnable{ Bitmap bitmap; Matrix matrix = new Matrix(); Paint paint; public MatrixDraw(Context context) { super(context); bitmap = ((BitmapDrawable)getResources().getDrawable(R.drawable.rotate_surfaceview)).getBitmap(); paint = new Paint(); paint.setAntiAlias(true); new Thread(this).start(); } float m; float n; @Override protected void onDraw(Canvas canvas) { /* float cosValue = (float)Math.cos(-Math.PI/m); float sinValue = (float)Math.sin(-Math.PI/m); Log.d("matrixdraw", "Math.PI =" + Math.PI); Log.d("matrixdraw", "Math.PI/m =" + Math.PI/m); Log.d("matrixdraw", "Math.cos(-Math.PI/m) =" + (float)Math.cos(-Math.PI/m)); Log.d("matrixdraw", "Math.sin(-Math.PI/m) =" + (float)Math.sin(-Math.PI/m)); matrix.setValues(new float[]{ cosValue,-sinValue,100, sinValue,cosValue,100, 0, 0, 2 });//举例,若缩放值为0.9,代表放大原图的十分之一 // super.onDraw(canvas);//当然,如果界面上还有其他元素需要绘制,只需要将这句话写上就行了。 // Matrix matrix2 = new Matrix(matrix); canvas.drawBitmap(bitmap, matrix, paint); // canvas.drawBitmap(bitmap, matrix2, paint); */ n ++; if (n == 60) { n = 0; } matrix.postRotate(n); matrix.postTranslate(n, n); matrix.postScale(1, 1, n, n); canvas.drawBitmap(bitmap, matrix, paint); } @Override public void run() { while(!Thread.currentThread().isInterrupted()){ try { Thread.sleep(100); postInvalidate(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } } /** * 以左上角为顶点,缩放一半,逆时针旋转30度, * 然后沿x轴和y轴分别平移50个像素, * 代码 里面写的是100,为什么是平移50呢, * 因为缩放了一半。 * 大家可以自己设置一下Matrix的值,或者尝试一下两个 * Matrix相乘,得到的值设置进去, * 这样才能对Matrix更加熟练。 */ }

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. */
public class Matrix2Draw extends View { private Bitmap mBitmap; private Matrix mMatrix = new Matrix(); public Matrix2Draw(Context context) { super(context); initialize(); } private void initialize() { Bitmap bmp = ((BitmapDrawable)getResources().getDrawable(R.drawable.rotate_surfaceview)).getBitmap(); mBitmap = bmp; /*首先,将缩放为100*100。这里scale的参数是比例。有一点要注意,如果直接用100/ bmp.getWidth()的话,会得到0,因为是整型相除,所以必须其中有一个是float型的, 直接用100f就好。*/ mMatrix.setScale(100f/bmp.getWidth(), 100f/bmp.getHeight()); /*// post 方式:后乘 >> 当前的矩阵乘以参数给出的矩阵。可以连续多次使用post,来完成所需的整个变换。 //平移到(100,100)处 mMatrix.postTranslate(100, 100); //倾斜x和y轴,以(100,100)为中心。 mMatrix.postSkew(0.2f, 0.2f, 100, 100);*/ // pre 方式:前乘 >> 参数给出的矩阵乘以当前的矩阵。所以操作是在当前矩阵的最前面发生的。 //平移到(100,100)处 mMatrix.preTranslate(100, 100); //倾斜x和y轴,以(100,100)为中心。 mMatrix.preSkew(0.2f, 0.2f, 100, 100); } @Override protected void onDraw(Canvas canvas) { // super.onDraw(canvas); //如果界面上还有其他元素需要绘制,只需要将这句话写上就行了。 Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); canvas.drawBitmap(mBitmap, mMatrix, paint); } } /** Matrix的操作: 总共分为translate(平移),rotate(旋转),scale(缩放)和skew(倾斜)四种,每一种变换在 Android的API里都提供了set, post和pre三种操作方式,除了translate,其他三种操作都可以指定中心点。 set是直接设置Matrix的值,每次set一次,整个Matrix的数组都会变掉。 post是后乘,当前的矩阵乘以参数给出的矩阵。可以连续多次使用post,来完成所需的整个变换。 pre是前乘,参数给出的矩阵乘以当前的矩阵。所以操作是在当前矩阵的最前面发生的。 旋转、缩放和倾斜都可以围绕一个中心点来进行,如果不指定,默认情况下,是围绕(0,0)点来进行。 */

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. }
package com.view; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; import android.view.View; public class SimpleDraw extends View implements Runnable { /* * 我们继续来介绍Android平台底层绘图类的相关内容,在Android UI开发专题(一) * 之界面设计中我们介绍了有关Android平台资源使用以及Bitmap相关类的操作 * ,接下来将会以实例的方式给大家演示各种类的用处以及注意点。今天我们继续 * 了解android.graphics包中比较重要的绘图类。 * * 一、 android.graphics.Matrix有关图形的变换、缩放等相关操作常用的方法有: * Java代码: void reset() // 重置一个matrix对象。 * void set(Matrix src) //复制一个源矩阵,和本类的构造方法 Matrix(Matrix src) 一样 * boolean isIdentity() //返回这个矩阵是否定义(已经有意义) * void setRotate(float degrees) //指定一个角度以0,0为坐标进行旋转 * void setRotate(float degrees, float px, float py) //指定一个角度以px,py为坐标进行旋转 * void setScale(float sx, float sy) // 缩放 * void setScale(float sx, float sy, float px, float py) //以坐标px,py进行缩放 * void setTranslate(float dx, float dy) //平移 * void setSkew (float kx, float ky, float px, float py) //以坐标px,py进行倾斜 * void setSkew (float kx, float ky) //倾斜 复制代码 二、android.graphics.NinePatch * * NinePatch是Android平台特有的一种非矢量图形自然拉伸处理方法,可以帮助常规的 * 图形在拉伸时不会缩放, * 实例中Android开发网提示大家对于Toast的显示就是该原理,同时SDK中提供了一 * 个工具名为Draw * 9-Patch,有关该工具的使用方法可以参考我们经发布的 Draw * 9-Patch使用方法介绍一文。由于该类提供了高质量支持透明的缩放方式,所以图形 * 格式为PNG,文件命名方式为.9.png * 的后缀比如eoeandroid。 * * 三、android.graphics.Paint。Paint类我们可以理解为画笔、画刷的属性定义,本类 * 常用的方法如下: * * Java代码: void reset() //重置 * void setARGB(int a, int r, int g, int b) 或 void setColor(int color) * //均为设置Paint对象的颜色 * void setAntiAlias(boolean aa) * * //是否抗锯齿,需要配合void setFlags (Paint.ANTI_ALIAS_FLAG) 来帮助消除锯齿 * 使其边缘更平滑。 * Shader setShader(Shader shader) * * //设置阴影,Shader类是一个矩阵对象,如果为NULL将清除阴影。 * void setStyle(Paint.Style style) //设置样式,一般为 FILL 填充,或者STROKE凹陷 * 效果。 * void setTextSize(float textSize) //设置字体大小 * void setTextAlign(Paint.Align align) //文本对齐方式 * Typeface setTypeface(Typeface typeface) * //设置字体,通过Typeface可以加载Android内部的字体,一般为宋体对于中文, * 部分ROM可以自己添加比如雅黑等等 * void setUnderlineText(boolean underlineText) * * //是否设置下划线,需要撇和void setFlags (Paint.UNDERLINE_TEXT_FLAG) 方法。 复制代码 * 四、android.graphics.Rect * * Rect我们可以理解为矩形区域,类似的还有Point一个点,Rect类除了表示一个矩 * 形区域位置描述外, * eoeandroid提示主要可以帮助我们计算图形之间是否碰撞 * (包含)关系,对于Android游戏开发比较有用,其主要的成员contains包含了三种 * 重载方法,来判断包含关系. * * Java代码: * boolean contains(int left, int top, int right, int bottom) * boolean contains(int x, int y) * * boolean contains(Rect r) 复制代码 五、android.graphics.Region * Region在Android平台中表示一个区域和Rect不同的是 * ,它表示的是一个不规则的样子,可以是椭圆、多边形等等,而Rect仅仅是矩形。 * 同样Region的boolean contains(int x, * int y) 成员可以判断一个点是否在该区域内。 * * 六、android.graphics.Typeface * Typeface类是帮助描述一个字体对象,在TextView中通过使用setTypeface方法来 * 制定一个输出文本的字体 * ,其直接构造调用成员create方法可以直接指定一个字体名称和样式,比如 * Java代码: static Typeface create(Typeface family, int style) * * static Typeface create(String familyName, int style) 复制代码 * 同时使用isBold和isItalic方法可以判断出是否包含粗体或斜体的字型。 * * Java代码: final boolean isBold() * final boolean isItalic() 复制代码 该类的创建方法还有从apk的资源或从一个具体的 * 文件路径,其具体方法为 * Java代码: static Typeface createFromAsset(AssetManager mgr, String path) * static Typeface createFromFile(File path) * static Typeface createFromFile(String path) 复制代码 */ private Paint paint; public SimpleDraw(Context context) { super(context); paint = new Paint(); new Thread(this).start(); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawColor(Color.GRAY);// paint.setAntiAlias(true);// canvas.save();// canvas.clipRect(10, 10, 110, 110);// canvas.drawColor(Color.WHITE);// // canvas.rotate(m);//以屏幕左上角为坐标原点旋转 m += 45.0f; if (m == 360.0f) { m = 0.0f; } canvas.rotate(m, 60, 60);// 以(60,60)为原点旋转 paint.setColor(Color.GREEN); canvas.drawRect(new Rect(50, 50, 70, 70), paint); canvas.restore(); canvas.save(); canvas.translate(140, 10); canvas.clipRect(0, 0, 100, 100);// 一定要先剪辑出矩形区域再设画布背景, //否则会覆盖整张画布 canvas.drawColor(Color.BLACK); paint.setColor(Color.BLUE); canvas.drawRect(new Rect(10, 10, 50, 50), paint); canvas.restore(); // canvas.save(); canvas.translate(120, 120); canvas.clipRect(new Rect(0, 0, 100, 100)); canvas.drawColor(Color.GREEN); // paint.setColor(Color.BLUE); paint.setStrokeWidth(4); paint.setColor(Color.BLACK); canvas.drawLine(0, 60, 100, 60, paint); paint.setARGB(255, 51, 51, 51); paint.setTextSize(20); paint.setFlags(Paint.ANTI_ALIAS_FLAG); paint.setUnderlineText(true); // paint.setFlags(Paint.UNDERLINE_TEXT_FLAG); canvas.drawText("陈建立", 25, 80, paint); paint.setColor(Color.WHITE); canvas.drawRect(new Rect(10, 10, 50, 50), paint); canvas.restore(); } float m = 0.0f; public void run() { while (!Thread.currentThread().isInterrupted()) { try { Thread.sleep(500);// 每半秒执行一次 } catch (InterruptedException e) { Thread.currentThread().interrupt(); } postInvalidate(); } } }

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. }
package com.view; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Paint.FontMetrics; import android.util.Log; import android.view.View; public class TextDraw extends View { public TextDraw(Context context) { super(context); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); Paint textPaint = new Paint( Paint.ANTI_ALIAS_FLAG); textPaint.setTextSize( 35); textPaint.setColor( Color.WHITE); // FontMetrics FontMetrics fontMetrics = textPaint.getFontMetrics(); String text = "abcdefghijklm"; // float baseX = 0; float baseY = 100; Log.d("textDraw", "top = "+fontMetrics.top+ "ascent = "+fontMetrics.ascent+ "descent = "+fontMetrics.descent+ "bottom = "+fontMetrics.bottom+"\n"); float topY = baseY + fontMetrics.top; float ascentY = baseY + fontMetrics.ascent; float descentY = baseY + fontMetrics.descent; float bottomY = baseY + fontMetrics.bottom; Log.d("textDraw", "topY = "+topY+ "ascentY = "+ascentY+ "descentY = "+descentY+ "bottomY = "+bottomY); // canvas.drawText( text, baseX, baseY, textPaint); // BaseLine Paint baseLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG); baseLinePaint.setColor( Color.RED); canvas.drawLine(0, baseY, getWidth(), baseY, baseLinePaint); // Base canvas.drawCircle( baseX, baseY, 5, baseLinePaint); // TopLine Paint topLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG); topLinePaint.setColor( Color.LTGRAY); canvas.drawLine(0, topY, getWidth(), topY, topLinePaint); // AscentLine Paint ascentLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG); ascentLinePaint.setColor( Color.GREEN); canvas.drawLine(0, ascentY, getWidth(), ascentY, ascentLinePaint); // DescentLine Paint descentLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG); descentLinePaint.setColor( Color.YELLOW); canvas.drawLine(0, descentY, getWidth(), descentY, descentLinePaint); // ButtomLine Paint bottomLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG); bottomLinePaint.setColor( Color.MAGENTA); canvas.drawLine(0, bottomY, getWidth(), bottomY, bottomLinePaint); } }

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. */
class RoundImageView extends View { private Bitmap bitmap; int bitmapWidth; int bitmapHeight; public RoundImageView(Context context) { super(context); bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.rotate_surfaceview); bitmapWidth = bitmap.getWidth(); bitmapHeight = bitmap.getHeight(); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); // 第一种方法: /*Bitmap roundBitmap = Bitmap.createBitmap(bitmapWidth, bitmapHeight,Bitmap.Config.ARGB_8888); canvas = new Canvas(roundBitmap); Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); paint.setColor(Color.BLUE); canvas.drawRoundRect(new RectF(0, 0, bitmapWidth, bitmapHeight),20.0f, 20.0f, paint); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN)); canvas.drawBitmap(bitmap, 0, 0, null); canvas.drawBitmap(roundBitmap, 0, 0, paint);*/ // 第二种方法: Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); paint.setColor(0xffffffff); paint.setTextSize(15); canvas.drawText("生成带圆角的图片", 10, 25, paint); canvas.drawBitmap(getRoundedCornerBitmap(bitmap), 10, 30, paint); canvas.drawText("生成带倒影的图片", 170, 160, paint); canvas.drawBitmap(createReflectionImageWithOrigin(bitmap), 170, 165, paint); } public Bitmap getRoundedCornerBitmap(Bitmap bitmap) { // 创建一个指定宽度和高度的空位图对象 Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),bitmap.getHeight(), Config.ARGB_8888); // 用该位图创建画布 Canvas canvas = new Canvas(output); // 画笔对象 final Paint paint = new Paint(); // 画笔的颜色 final int color = 0xff424242; // 矩形区域对象 final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); // 未知 final RectF rectF = new RectF(rect); // 拐角的半径 final float roundPx = 12; // 消除锯齿 paint.setAntiAlias(true); // 画布背景色 canvas.drawARGB(0, 0, 0, 0); // 设置画笔颜色 paint.setColor(color); // 绘制圆角矩形 canvas.drawRoundRect(rectF, roundPx, roundPx,paint); // 未知 paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); // 把该图片绘制在该圆角矩形区域中 canvas.drawBitmap(bitmap, rect, rect, paint); // 最终在画布上呈现的就是该圆角矩形图片,然后我们返回该Bitmap对象 return output; } //获得带倒影的图片方法 public Bitmap createReflectionImageWithOrigin(Bitmap bitmap){ // 图片与倒影之间的距离间隔 final int reflectionGap = 2; // 原图的宽度 int width = bitmap.getWidth(); // 原图的高度 int height = bitmap.getHeight(); // 图片旋转,缩放等控制对象 Matrix matrix = new Matrix(); // 缩放(这里pre,set,post三种效果是不一样的,注意区别) matrix.preScale(1, -1); /** set是直接设置Matrix的值,每次set一次,整个Matrix的数组都会变掉。 post是后乘,当前的矩阵乘以参数给出的矩阵。可以连续多次使用post, 来完成所需的整个变换。例如,要将一个图片旋 转30度,然后平移到(100,100)的地方,那么可以这样做: Matrix m = new Matrix(); m.postRotate(30); m.postTranslate(100, 100); 这样就达到了想要的效果。 pre是前乘,参数给出的矩阵乘以当前的矩阵。所以操作是在当前矩阵的最前面发生的。 例如上面的例子,如果用pre的话,就要这样: Matrix m = new Matrix(); m.setTranslate(100, 100); m.preRotate(30); 旋转、缩放和倾斜都可以围绕一个中心点来进行,如果不指定,默认情况下, 是围绕(0,0)点来进行。 关于缩放: scale的参数是比例。例如,我们缩放为100%,则有一点要注意,如果直接用 100/bmp.getWidth()的话,会得到0,因为是整型相除,所以必须其中有一个是 float型的,直接用100f就好 。 如:matrix.setScale(100f/bmp.getWidth(), 100f/bmp.getHeight()); */ // 创建一个初始的倒影位图 Bitmap reflectionImage = Bitmap.createBitmap(bitmap, 0, height/2, width, height/2, matrix, false); // 新建一个宽度为原图宽度,高度为原图高度的3/2的位图,用于绘制新的位图,即整体的效果图位图对象 Bitmap bitmapWithReflection = Bitmap.createBitmap(width, (height + height/2), Config.ARGB_8888); // 由该位图对象创建初始画布(规定了画布的宽高) Canvas canvas = new Canvas(bitmapWithReflection); // 在该画布上绘制原图 canvas.drawBitmap(bitmap, 0, 0, null); // 创建一个画笔 Paint deafalutPaint = new Paint(); // 绘制一个矩形区域,该矩形区域便是原图和倒影图之间的间隔图 canvas.drawRect(0, height,width,height + reflectionGap,deafalutPaint); // 绘制该倒影图于间隔图的下方 canvas.drawBitmap(reflectionImage, 0, height + reflectionGap, null); // 创建一个画笔 Paint paint = new Paint(); // 创建一个线性渐变对象 LinearGradient shader = new LinearGradient( 0, bitmap.getHeight(), 0, bitmapWithReflection.getHeight() + reflectionGap, 0x70ffffff, 0x00ffffff, TileMode.CLAMP ); // 把渐变效果应用在画笔上 paint.setShader(shader); // Set the Transfer mode to be porter duff and destination in // 未知 paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN)); // Draw a rectangle using the paint with our linear gradient // 绘制出该渐变效果,也就是最终的倒影效果图 canvas.drawRect(0, height, width, bitmapWithReflection.getHeight() + reflectionGap, paint); // 返回 return bitmapWithReflection; } } /** * 绘制圆角背景以及图片圆角的处理 .配置文件实现 <?xml version="1.0" encoding="utf-8"?> <layer-list * xmlns:android="http://schemas.android.com/apk/res/android"> <item * android:drawable="@drawable/icon_home_button_img"/> <item * android:drawable="@drawable/icon_home_shape_overlay"/> * </layer-list> * icon_home_shape_overlay如下 * <?xml version="1.0" encoding="utf-8"?> * <shape * xmlns:android="http://schemas.android.com/apk/res/android"> <solid * android:color="#60000000"/> * <stroke android:width="3dp" * color="#ff000000"/> * <corners android:radius="10dp" /> * </shape> * 或者直接使用一种效果 * <?xml version="1.0" encoding="UTF-8"?> * <shape * xmlns:android="http://schemas.android.com/apk/res/android"> * <solid * android:color="#99FFFFFF"/> * <corners android:radius="30px"/> * <padding * android:left="0dp" android:top="0dp" android:right="0dp" * android:bottom="0dp" /> * </shape> * 然后 * android:background="@drawable/my_shape_file" * * * 2.图片本身加上圆角 Bitmap myCoolBitmap = ... ; // <-- Your bitmap you want rounded * * int w = myCoolBitmap.getWidth(), h = myCoolBitmap.getHeight(); * Bitmap rounder = Bitmap.createBitmap(w,h,Bitmap.Config.ARGB_8888); Canvas * canvas = new Canvas(rounder); * * Paint xferPaint = new Paint(Paint.ANTI_ALIAS_FLAG); * xferPaint.setColor(Color.RED); * * canvas.drawRoundRect(new RectF(0,0,w,h), 20.0f, 20.0f, xferPaint); * * xferPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN)); * canvas.drawBitmap(myCoolBitmap, 0,0, null); * canvas.drawBitmap(rounder, 0,0, xferPaint); * 或者 * public static Bitmap getRoundedCornerBitmap(Bitmap bitmap) { * Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), * bitmap.getHeight(), Config.ARGB_8888); * Canvas canvas = newCanvas(output); * * final int color = 0xff424242; final Paint paint = new Paint(); final Rect * rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); final RectF * rectF = new RectF(rect); final float roundPx = 12; * * paint.setAntiAlias(true); canvas.drawARGB(0, 0, 0, 0); * paint.setColor(color); canvas.drawRoundRect(rectF, roundPx, roundPx,paint); * * paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); * canvas.drawBitmap(bitmap, rect, rect, paint); * * return output; * } */

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. }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值