Android 图形用户界面 之 绘图(一)

直接贴上代码:

 

BasicViewDraw.java

 

Java代码   收藏代码
  1. package com.view;  
  2.   
  3. import com.test.R;  
  4. import android.view.View;  
  5. import android.content.Context;  
  6. import android.graphics.Canvas;  
  7. import android.graphics.Color;  
  8. import android.graphics.Paint;  
  9. import android.graphics.RectF;  
  10. import android.graphics.Path;  
  11. import android.graphics.Shader;  
  12. import android.graphics.LinearGradient;  
  13.   
  14. /* 自定义继承View 的MyView*/  
  15. public class BasicViewDraw extends View {  
  16.     public BasicViewDraw(Context context) {  
  17.         super(context);  
  18.     }  
  19.   
  20.     /* 重写onDraw() */  
  21.     @Override  
  22.     protected void onDraw(Canvas canvas) {  
  23.         super.onDraw(canvas);  
  24.         /* 设置背景为白色 */                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  
  25.         canvas.drawColor(Color.WHITE);  
  26.         Paint paint = new Paint();  
  27.         /* 去锯齿 */  
  28.         paint.setAntiAlias(true);  
  29.         /* 设置paint的颜色 */  
  30.         paint.setColor(Color.RED);  
  31.         /* 设置paint的 style 为STROKE:空心 */  
  32.         paint.setStyle(Paint.Style.STROKE);  
  33.         /* 设置paint的外框宽度 */  
  34.         paint.setStrokeWidth(3);  
  35.         /* 画一个空心圆形 */  
  36.         canvas.drawCircle(404030, paint);  
  37.         /* 画一个空心正方形 */  
  38.         canvas.drawRect(109070150, paint);  
  39.         /* 画一个空心长方形 */  
  40.         canvas.drawRect(1017070200, paint);  
  41.         /* 画一个空心椭圆形 */  
  42.         RectF re = new RectF(1022070250);  
  43.         canvas.drawOval(re, paint);  
  44.         /* 画一个空心三角形 */  
  45.         Path path = new Path();  
  46.         path.moveTo(10330);  
  47.         path.lineTo(70330);  
  48.         path.lineTo(40270);  
  49.         path.close();//记得要close  
  50.         canvas.drawPath(path, paint);  
  51.         /* 画一个空心梯形 */  
  52.         Path path1 = new Path();  
  53.         path1.moveTo(10410);  
  54.         path1.lineTo(70410);  
  55.         path1.lineTo(55350);  
  56.         path1.lineTo(25350);  
  57.         path1.close();  
  58.         canvas.drawPath(path1, paint);  
  59.   
  60.         /* 设置paint 的style为 FILL:实心 */  
  61.         paint.setStyle(Paint.Style.FILL);  
  62.         /* 设置paint的颜色 */  
  63.         paint.setColor(Color.BLUE);  
  64.         /* 画一个实心圆 */  
  65.         canvas.drawCircle(1204030, paint);  
  66.         /* 画一个实心正方形 */  
  67.         canvas.drawRect(9090150150, paint);  
  68.         /* 画一个实心长方形 */  
  69.         canvas.drawRect(90170150200, paint);  
  70.         /* 画一个实心椭圆 */  
  71.         RectF re2 = new RectF(90220150250);  
  72.         canvas.drawOval(re2, paint);  
  73.         /* 画一个实心三角形 */  
  74.         Path path2 = new Path();  
  75.         path2.moveTo(90330);  
  76.         path2.lineTo(150330);  
  77.         path2.lineTo(120270);  
  78.         path2.close();  
  79.         canvas.drawPath(path2, paint);  
  80.         /* 画一个实心梯形 */  
  81.         Path path3 = new Path();  
  82.         path3.moveTo(90410);  
  83.         path3.lineTo(150410);  
  84.         path3.lineTo(135350);  
  85.         path3.lineTo(105350);  
  86.         path3.close();  
  87.         canvas.drawPath(path3, paint);  
  88.         /* 设置渐变色 */  
  89.         Shader mShader = new LinearGradient(00100100new int[] {  
  90.                 Color.RED, Color.GREEN, Color.BLUE, Color.YELLOW }, null,  
  91.                 Shader.TileMode.REPEAT);  
  92.         paint.setShader(mShader);  
  93.   
  94.         /* 画一个渐变色圆 */  
  95.         canvas.drawCircle(2004030, paint);  
  96.         /* 画一个渐变色正方形 */  
  97.         canvas.drawRect(17090230150, paint);  
  98.         /* 画一个渐变色长方形 */  
  99.         canvas.drawRect(170170230200, paint);  
  100.         /* 画一个渐变色椭圆 */  
  101.         RectF re3 = new RectF(170220230250);  
  102.         canvas.drawOval(re3, paint);  
  103.         /* 画一个渐变色三角形 */  
  104.         Path path4 = new Path();  
  105.         path4.moveTo(170330);  
  106.         path4.lineTo(230330);  
  107.         path4.lineTo(200270);  
  108.         path4.close();  
  109.         canvas.drawPath(path4, paint);  
  110.         /* 画一个渐变色梯形 */  
  111.         Path path5 = new Path();  
  112.         path5.moveTo(170410);  
  113.         path5.lineTo(230410);  
  114.         path5.lineTo(215350);  
  115.         path5.lineTo(185350);  
  116.         path5.close();  
  117.         canvas.drawPath(path5, paint);  
  118.   
  119.         /* 写字 */  
  120.         paint.setTextSize(24);  
  121.         canvas.drawText(getResources().getString(R.string.str_text1), 24050,paint);  
  122.         canvas.drawText(getResources().getString(R.string.str_text2), 240120,paint);  
  123.         canvas.drawText(getResources().getString(R.string.str_text3), 240190,paint);  
  124.         canvas.drawText(getResources().getString(R.string.str_text4), 240250,paint);  
  125.         canvas.drawText(getResources().getString(R.string.str_text5), 240320,paint);  
  126.         canvas.drawText(getResources().getString(R.string.str_text6), 240390,paint);  
  127.     }  
  128. }  

 

 

BasicView2Draw.java

 

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

 

 

ClipRectDraw.java

 

Java代码   收藏代码
  1. package com.view;  
  2.   
  3. import android.content.Context;  
  4. import android.graphics.Canvas;  
  5. import android.graphics.Color;  
  6. import android.graphics.Paint;  
  7. import android.graphics.Path;  
  8. import android.graphics.Region;  
  9. import android.util.AttributeSet;  
  10. import android.view.View;  
  11.   
  12. /** 
  13.  *  ---------------------------------------------------矩形区域------------------------------------------------- 
  14.  *  canvas.clipRect(左上角x轴坐标, 左上角y轴坐标, 右下角x轴坐标, 右下角y轴坐标, Region.Op.XOR); 
  15.  *  最后一个参数有多个选择分别是: 
  16.  *  //DIFFERENCE是第一次不同于第二次的部分显示出来  
  17.     //REPLACE是显示第二次的  
  18.     //REVERSE_DIFFERENCE 是第二次不同于第一次的部分显示  
  19.     //INTERSECT:交集显示  
  20.     //UNION:全部显示  
  21.     //XOR补集,就是全集的减去交集剩余部分显示 
  22.      
  23.  * @author emmet1988.iteye.com 
  24.  * 
  25.  */  
  26. public class ClipRectDraw extends View {  
  27.       
  28.     Context context;  
  29.     Paint paint;  
  30.     Path path;  
  31.       
  32.     public ClipRectDraw(Context context) {  
  33.         super(context);  
  34.         init();  
  35.     }  
  36.       
  37.     public ClipRectDraw(Context context, AttributeSet attrs) {  
  38.         super(context, attrs);  
  39.         init();  
  40.     }  
  41.       
  42.     public ClipRectDraw(Context context, AttributeSet attrs, int defStyle) {  
  43.         super(context, attrs, defStyle);  
  44.         init();  
  45.     }  
  46.       
  47.     private void init(){  
  48.         paint = new Paint();  
  49.         paint.setAntiAlias(true);  
  50.         paint.setStrokeWidth(5);  
  51.         paint.setTextSize(15);  
  52.         paint.setTextAlign(Paint.Align.RIGHT);  
  53.         path = new Path();  
  54.     }  
  55.       
  56.     @Override  
  57.     protected void onDraw(Canvas canvas) {  
  58.         super.onDraw(canvas);  
  59.         canvas.drawColor(Color.GRAY);  
  60.         //左上图  
  61.         canvas.save();  
  62.         canvas.translate(1010);  
  63.         drawScene(canvas);  
  64.         canvas.restore();  
  65.         //右上图  
  66.         canvas.save();  
  67.         canvas.translate(16010);  
  68.         canvas.clipRect(10109090);  
  69.         canvas.clipRect(30307070, Region.Op.XOR);  
  70.         drawScene(canvas);  
  71.         canvas.restore();  
  72.         //左中图  
  73.         canvas.save();  
  74.         canvas.translate(10130);  
  75.         path.reset();  
  76.         /*抛物曲线*/  
  77.         path.cubicTo(001000100100);  
  78.         path.cubicTo(100100010000);  
  79.         canvas.clipPath(path, Region.Op.REPLACE);  
  80.         drawScene(canvas);  
  81.         canvas.restore();  
  82.         //右中图  
  83.         canvas.save();  
  84.         canvas.translate(160130);  
  85.         canvas.clipRect(006060);  
  86.         canvas.clipRect(4040100100, Region.Op.UNION);  
  87.         drawScene(canvas);  
  88.         canvas.restore();  
  89.         //左下图  
  90.         canvas.save();  
  91.         canvas.translate(10250);  
  92.         canvas.clipRect(006060);  
  93.         canvas.clipRect(4040100100, Region.Op.XOR);  
  94.         drawScene(canvas);  
  95.         canvas.restore();  
  96.         //右下图  
  97.         canvas.translate(160250);  
  98.         canvas.clipRect(006060);  
  99.         canvas.clipRect(4040100100, Region.Op.REVERSE_DIFFERENCE);  
  100.         drawScene(canvas);  
  101.         canvas.restore();  
  102.     }  
  103.       
  104.     private void drawScene(Canvas canvas){  
  105.         canvas.clipRect(00100100);  
  106.         canvas.drawColor(Color.WHITE);  
  107.           
  108.         paint.setColor(Color.RED);  
  109.         canvas.drawLine(00100100, paint);  
  110.           
  111.         paint.setColor(Color.GREEN);  
  112.         canvas.drawCircle(307030, paint);  
  113.           
  114.         paint.setColor(Color.BLUE);  
  115.         canvas.drawText("ChenJianLi"10030, paint);  
  116.     }  
  117.   
  118. }  

 

 

MatrixDraw.java

 

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

 

 

Matrix2Draw.java

 

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

 

SimpleDraw.java

 

Java代码   收藏代码
  1. package com.view;  
  2.   
  3. import android.content.Context;  
  4. import android.graphics.Canvas;  
  5. import android.graphics.Color;  
  6. import android.graphics.Paint;  
  7. import android.graphics.Rect;  
  8. import android.view.View;  
  9.   
  10. public class SimpleDraw extends View implements Runnable {  
  11.   
  12.     /* 
  13.      * 我们继续来介绍Android平台底层绘图类的相关内容,在Android UI开发专题(一) 
  14.      * 之界面设计中我们介绍了有关Android平台资源使用以及Bitmap相关类的操作 
  15.      * ,接下来将会以实例的方式给大家演示各种类的用处以及注意点。今天我们继续 
  16.      * 了解android.graphics包中比较重要的绘图类。 
  17.      *  
  18.      * 一、 android.graphics.Matrix有关图形的变换、缩放等相关操作常用的方法有: 
  19.      * Java代码: void reset() // 重置一个matrix对象。 
  20.      * void set(Matrix src) //复制一个源矩阵,和本类的构造方法 Matrix(Matrix src) 一样 
  21.      * boolean isIdentity() //返回这个矩阵是否定义(已经有意义) 
  22.      * void setRotate(float degrees) //指定一个角度以0,0为坐标进行旋转 
  23.      * void setRotate(float degrees, float px, float py) //指定一个角度以px,py为坐标进行旋转 
  24.      *  void setScale(float sx, float sy) // 缩放 
  25.      * void setScale(float sx, float sy, float px, float py) //以坐标px,py进行缩放 
  26.      * void setTranslate(float dx, float dy) //平移 
  27.      * void setSkew (float kx, float ky, float px, float py) //以坐标px,py进行倾斜 
  28.      * void setSkew (float kx, float ky) //倾斜 复制代码 二、android.graphics.NinePatch 
  29.      *  
  30.      * NinePatch是Android平台特有的一种非矢量图形自然拉伸处理方法,可以帮助常规的 
  31.      * 图形在拉伸时不会缩放, 
  32.      * 实例中Android开发网提示大家对于Toast的显示就是该原理,同时SDK中提供了一 
  33.      * 个工具名为Draw 
  34.      * 9-Patch,有关该工具的使用方法可以参考我们经发布的 Draw 
  35.      * 9-Patch使用方法介绍一文。由于该类提供了高质量支持透明的缩放方式,所以图形 
  36.      * 格式为PNG,文件命名方式为.9.png 
  37.      * 的后缀比如eoeandroid。 
  38.      *  
  39.      * 三、android.graphics.Paint。Paint类我们可以理解为画笔、画刷的属性定义,本类 
  40.      * 常用的方法如下: 
  41.      *  
  42.      * Java代码: void reset() //重置 
  43.      * void setARGB(int a, int r, int g, int b) 或 void setColor(int color) 
  44.      * //均为设置Paint对象的颜色 
  45.      * void setAntiAlias(boolean aa) 
  46.      *  
  47.      * //是否抗锯齿,需要配合void setFlags (Paint.ANTI_ALIAS_FLAG) 来帮助消除锯齿 
  48.      * 使其边缘更平滑。 
  49.      * Shader setShader(Shader shader) 
  50.      *  
  51.      * //设置阴影,Shader类是一个矩阵对象,如果为NULL将清除阴影。 
  52.      * void setStyle(Paint.Style style) //设置样式,一般为 FILL 填充,或者STROKE凹陷 
  53.      * 效果。 
  54.      * void setTextSize(float textSize) //设置字体大小 
  55.      * void setTextAlign(Paint.Align align) //文本对齐方式 
  56.      * Typeface setTypeface(Typeface typeface) 
  57.      * //设置字体,通过Typeface可以加载Android内部的字体,一般为宋体对于中文, 
  58.      * 部分ROM可以自己添加比如雅黑等等 
  59.      * void setUnderlineText(boolean underlineText) 
  60.      *  
  61.      * //是否设置下划线,需要撇和void setFlags (Paint.UNDERLINE_TEXT_FLAG) 方法。 复制代码 
  62.      * 四、android.graphics.Rect 
  63.      *  
  64.      * Rect我们可以理解为矩形区域,类似的还有Point一个点,Rect类除了表示一个矩 
  65.      * 形区域位置描述外, 
  66.      * eoeandroid提示主要可以帮助我们计算图形之间是否碰撞 
  67.      * (包含)关系,对于Android游戏开发比较有用,其主要的成员contains包含了三种 
  68.      * 重载方法,来判断包含关系. 
  69.      *  
  70.      * Java代码:  
  71.      * boolean contains(int left, int top, int right, int bottom) 
  72.      * boolean contains(int x, int y) 
  73.      *  
  74.      * boolean contains(Rect r) 复制代码 五、android.graphics.Region 
  75.      * Region在Android平台中表示一个区域和Rect不同的是 
  76.      * ,它表示的是一个不规则的样子,可以是椭圆、多边形等等,而Rect仅仅是矩形。 
  77.      * 同样Region的boolean contains(int x, 
  78.      * int y) 成员可以判断一个点是否在该区域内。 
  79.      *  
  80.      * 六、android.graphics.Typeface 
  81.      * Typeface类是帮助描述一个字体对象,在TextView中通过使用setTypeface方法来 
  82.      * 制定一个输出文本的字体 
  83.      * ,其直接构造调用成员create方法可以直接指定一个字体名称和样式,比如 
  84.      * Java代码: static Typeface create(Typeface family, int style) 
  85.      *  
  86.      * static Typeface create(String familyName, int style) 复制代码 
  87.      * 同时使用isBold和isItalic方法可以判断出是否包含粗体或斜体的字型。 
  88.      *  
  89.      * Java代码: final boolean isBold() 
  90.      * final boolean isItalic() 复制代码 该类的创建方法还有从apk的资源或从一个具体的 
  91.      * 文件路径,其具体方法为 
  92.      * Java代码: static Typeface createFromAsset(AssetManager mgr, String path) 
  93.      * static Typeface createFromFile(File path) 
  94.      * static Typeface createFromFile(String path) 复制代码 
  95.      */  
  96.   
  97.     private Paint paint;  
  98.   
  99.     public SimpleDraw(Context context) {  
  100.         super(context);  
  101.         paint = new Paint();  
  102.         new Thread(this).start();  
  103.     }  
  104.   
  105.     @Override  
  106.     protected void onDraw(Canvas canvas) {  
  107.         super.onDraw(canvas);  
  108.   
  109.         canvas.drawColor(Color.GRAY);//  
  110.         paint.setAntiAlias(true);//  
  111.   
  112.         canvas.save();//  
  113.         canvas.clipRect(1010110110);//  
  114.         canvas.drawColor(Color.WHITE);//  
  115.         // canvas.rotate(m);//以屏幕左上角为坐标原点旋转  
  116.         m += 45.0f;  
  117.         if (m == 360.0f) {  
  118.             m = 0.0f;  
  119.         }  
  120.         canvas.rotate(m, 6060);// 以(60,60)为原点旋转  
  121.         paint.setColor(Color.GREEN);  
  122.         canvas.drawRect(new Rect(50507070), paint);  
  123.         canvas.restore();  
  124.   
  125.         canvas.save();  
  126.         canvas.translate(14010);  
  127.         canvas.clipRect(00100100);// 一定要先剪辑出矩形区域再设画布背景,  
  128.         //否则会覆盖整张画布  
  129.         canvas.drawColor(Color.BLACK);  
  130.         paint.setColor(Color.BLUE);  
  131.         canvas.drawRect(new Rect(10105050), paint);  
  132.         canvas.restore();  
  133.         //  
  134.         canvas.save();  
  135.         canvas.translate(120120);  
  136.         canvas.clipRect(new Rect(00100100));  
  137.         canvas.drawColor(Color.GREEN);  
  138.         // paint.setColor(Color.BLUE);  
  139.         paint.setStrokeWidth(4);  
  140.         paint.setColor(Color.BLACK);  
  141.         canvas.drawLine(06010060, paint);  
  142.         paint.setARGB(255515151);  
  143.         paint.setTextSize(20);  
  144.         paint.setFlags(Paint.ANTI_ALIAS_FLAG);  
  145.         paint.setUnderlineText(true);  
  146.         // paint.setFlags(Paint.UNDERLINE_TEXT_FLAG);  
  147.         canvas.drawText("陈建立"2580, paint);  
  148.         paint.setColor(Color.WHITE);  
  149.         canvas.drawRect(new Rect(10105050), paint);  
  150.         canvas.restore();  
  151.     }  
  152.   
  153.     float m = 0.0f;  
  154.   
  155.     public void run() {  
  156.         while (!Thread.currentThread().isInterrupted()) {  
  157.             try {  
  158.                 Thread.sleep(500);// 每半秒执行一次  
  159.             } catch (InterruptedException e) {  
  160.                 Thread.currentThread().interrupt();  
  161.             }  
  162.             postInvalidate();  
  163.         }  
  164.     }  
  165. }  

 

 

TextDraw.java

 

Java代码   收藏代码
  1. package com.view;  
  2.   
  3. import android.content.Context;  
  4. import android.graphics.Canvas;  
  5. import android.graphics.Color;  
  6. import android.graphics.Paint;  
  7. import android.graphics.Paint.FontMetrics;  
  8. import android.util.Log;  
  9. import android.view.View;  
  10.   
  11. public class TextDraw extends View {  
  12.   
  13.     public TextDraw(Context context) {  
  14.         super(context);  
  15.     }  
  16.   
  17.     @Override  
  18.     protected void onDraw(Canvas canvas) {  
  19.         super.onDraw(canvas);  
  20.         Paint textPaint = new Paint( Paint.ANTI_ALIAS_FLAG);  
  21.         textPaint.setTextSize( 35);  
  22.         textPaint.setColor( Color.WHITE);  
  23.   
  24.         // FontMetrics  
  25.         FontMetrics fontMetrics = textPaint.getFontMetrics();  
  26.   
  27.         String text = "abcdefghijklm";  
  28.   
  29.         //   
  30.         float baseX = 0;  
  31.         float baseY = 100;  
  32.         Log.d("textDraw""top = "+fontMetrics.top+  
  33.                                         "ascent = "+fontMetrics.ascent+  
  34.                                         "descent = "+fontMetrics.descent+  
  35.                                         "bottom = "+fontMetrics.bottom+"\n");  
  36.         float topY = baseY + fontMetrics.top;  
  37.         float ascentY = baseY + fontMetrics.ascent;  
  38.         float descentY = baseY + fontMetrics.descent;  
  39.         float bottomY = baseY + fontMetrics.bottom;  
  40.         Log.d("textDraw""topY = "+topY+  
  41.                                         "ascentY = "+ascentY+  
  42.                                         "descentY = "+descentY+  
  43.                                         "bottomY = "+bottomY);  
  44.         //   
  45.         canvas.drawText( text, baseX, baseY, textPaint);  
  46.   
  47.         // BaseLine  
  48.         Paint baseLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG);  
  49.         baseLinePaint.setColor( Color.RED);  
  50.         canvas.drawLine(0, baseY, getWidth(), baseY, baseLinePaint);  
  51.   
  52.         // Base  
  53.         canvas.drawCircle( baseX, baseY, 5, baseLinePaint);  
  54.   
  55.         // TopLine  
  56.         Paint topLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG);  
  57.         topLinePaint.setColor( Color.LTGRAY);  
  58.         canvas.drawLine(0, topY, getWidth(), topY, topLinePaint);  
  59.   
  60.         // AscentLine  
  61.         Paint ascentLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG);  
  62.         ascentLinePaint.setColor( Color.GREEN);  
  63.         canvas.drawLine(0, ascentY, getWidth(), ascentY, ascentLinePaint);  
  64.   
  65.         // DescentLine  
  66.         Paint descentLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG);  
  67.         descentLinePaint.setColor( Color.YELLOW);  
  68.         canvas.drawLine(0, descentY, getWidth(), descentY, descentLinePaint);  
  69.   
  70.         // ButtomLine  
  71.         Paint bottomLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG);  
  72.         bottomLinePaint.setColor( Color.MAGENTA);  
  73.         canvas.drawLine(0, bottomY, getWidth(), bottomY, bottomLinePaint);  
  74.     }  
  75. }  

 

RoundAndReflectionDraw.java

 

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

 

SurfaceViewDraw.java

 

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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值