天天看點

Android 圖形使用者界面 之 繪圖(一)

直接貼上代碼:

BasicViewDraw.java

Java代碼  

Android 圖形使用者界面 之 繪圖(一)
Android 圖形使用者界面 之 繪圖(一)
  1. package com.view;  
  2. import com.test.R;  
  3. import android.view.View;  
  4. import android.content.Context;  
  5. import android.graphics.Canvas;  
  6. import android.graphics.Color;  
  7. import android.graphics.Paint;  
  8. import android.graphics.RectF;  
  9. import android.graphics.Path;  
  10. import android.graphics.Shader;  
  11. import android.graphics.LinearGradient;  
  12. public class BasicViewDraw extends View {  
  13.     public BasicViewDraw(Context context) {  
  14.         super(context);  
  15.     }  
  16.     @Override  
  17.     protected void onDraw(Canvas canvas) {  
  18.         super.onDraw(canvas);  
  19.         canvas.drawColor(Color.WHITE);  
  20.         Paint paint = new Paint();  
  21.         paint.setAntiAlias(true);  
  22.         paint.setColor(Color.RED);  
  23.         paint.setStyle(Paint.Style.STROKE);  
  24.         paint.setStrokeWidth(3);  
  25.         canvas.drawCircle(40, 40, 30, paint);  
  26.         canvas.drawRect(10, 90, 70, 150, paint);  
  27.         canvas.drawRect(10, 170, 70, 200, paint);  
  28.         RectF re = new RectF(10, 220, 70, 250);  
  29.         canvas.drawOval(re, paint);  
  30.         Path path = new Path();  
  31.         path.moveTo(10, 330);  
  32.         path.lineTo(70, 330);  
  33.         path.lineTo(40, 270);  
  34.         path.close();//記得要close  
  35.         canvas.drawPath(path, paint);  
  36.         Path path1 = new Path();  
  37.         path1.moveTo(10, 410);  
  38.         path1.lineTo(70, 410);  
  39.         path1.lineTo(55, 350);  
  40.         path1.lineTo(25, 350);  
  41.         path1.close();  
  42.         canvas.drawPath(path1, paint);  
  43.         paint.setStyle(Paint.Style.FILL);  
  44.         paint.setColor(Color.BLUE);  
  45.         canvas.drawCircle(120, 40, 30, paint);  
  46.         canvas.drawRect(90, 90, 150, 150, paint);  
  47.         canvas.drawRect(90, 170, 150, 200, paint);  
  48.         RectF re2 = new RectF(90, 220, 150, 250);  
  49.         canvas.drawOval(re2, paint);  
  50.         Path path2 = new Path();  
  51.         path2.moveTo(90, 330);  
  52.         path2.lineTo(150, 330);  
  53.         path2.lineTo(120, 270);  
  54.         path2.close();  
  55.         canvas.drawPath(path2, paint);  
  56.         Path path3 = new Path();  
  57.         path3.moveTo(90, 410);  
  58.         path3.lineTo(150, 410);  
  59.         path3.lineTo(135, 350);  
  60.         path3.lineTo(105, 350);  
  61.         path3.close();  
  62.         canvas.drawPath(path3, paint);  
  63.         Shader mShader = new LinearGradient(0, 0, 100, 100, new int[] {  
  64.                 Color.RED, Color.GREEN, Color.BLUE, Color.YELLOW }, null,  
  65.                 Shader.TileMode.REPEAT);  
  66.         paint.setShader(mShader);  
  67.         canvas.drawCircle(200, 40, 30, paint);  
  68.         canvas.drawRect(170, 90, 230, 150, paint);  
  69.         canvas.drawRect(170, 170, 230, 200, paint);  
  70.         RectF re3 = new RectF(170, 220, 230, 250);  
  71.         canvas.drawOval(re3, paint);  
  72.         Path path4 = new Path();  
  73.         path4.moveTo(170, 330);  
  74.         path4.lineTo(230, 330);  
  75.         path4.lineTo(200, 270);  
  76.         path4.close();  
  77.         canvas.drawPath(path4, paint);  
  78.         Path path5 = new Path();  
  79.         path5.moveTo(170, 410);  
  80.         path5.lineTo(230, 410);  
  81.         path5.lineTo(215, 350);  
  82.         path5.lineTo(185, 350);  
  83.         path5.close();  
  84.         canvas.drawPath(path5, paint);  
  85.         paint.setTextSize(24);  
  86.         canvas.drawText(getResources().getString(R.string.str_text1), 240, 50,paint);  
  87.         canvas.drawText(getResources().getString(R.string.str_text2), 240, 120,paint);  
  88.         canvas.drawText(getResources().getString(R.string.str_text3), 240, 190,paint);  
  89.         canvas.drawText(getResources().getString(R.string.str_text4), 240, 250,paint);  
  90.         canvas.drawText(getResources().getString(R.string.str_text5), 240, 320,paint);  
  91.         canvas.drawText(getResources().getString(R.string.str_text6), 240, 390,paint);  
  92.     }  
  93. }  
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代碼  

Android 圖形使用者界面 之 繪圖(一)
Android 圖形使用者界面 之 繪圖(一)
  1. class BasicView2Draw extends View{  
  2.         Paint paint;  
  3.         Bitmap bitmap;  
  4.         public BasicView2Draw(Context context) {  
  5.             super(context);  
  6.             paint = new Paint(Paint.ANTI_ALIAS_FLAG);  
  7.             bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.icon);  
  8.         }  
  9.         private Bitmap createBitmap1(){  
  10.             Bitmap bitmap1 = Bitmap.createBitmap(100, 100, Config.ARGB_8888);  
  11.             Canvas canvas = new Canvas(bitmap1);  
  12.             canvas.drawColor(Color.BLUE);  
  13. //          canvas.drawARGB(0, 0, 0, 0);// 透明色  
  14.             canvas.drawBitmap(bitmap, 0, 0, paint);  
  15.             canvas.drawText("Hello Android", 25, 55, paint);  
  16.             return bitmap1;  
  17.         }  
  18.         @Override  
  19.         protected void onDraw(Canvas canvas) {  
  20.             super.onDraw(canvas);  
  21.             // 繪制位圖  
  22.             // 1.繪制位圖在(10,10)位置上  
  23.             canvas.drawBitmap(createBitmap1(), 10, 10, paint);  
  24.             // 2.   canvas.drawBitmap(Bitmap bitmap,Rect src,Rect dest,Paint paint);  
  25.             //      canvas.drawBitmap(Bitmap bitmap,Rect src,RectF dest,Paint paint);  
  26.             //  繪制位圖到一個指定的矩形dest中,位圖會自動進行平移和縮放等操作,如果src的參數不為null  
  27.             // 則會裁剪位圖的部分區域來進行繪制  
  28.             Rect rect = new Rect(10, 10, 50, 60);  
  29.             RectF rectF1 = new RectF(180.0f, 20.0f, 240.0f, 80.0f);  
  30.             RectF rectF2 = new RectF(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(new float[]{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(new float[]{  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(new Rect(10, 260, 150, 280), paint);  
  50.             paint.setColor(Color.DKGRAY);  
  51.             canvas.drawRect(new RectF(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("Cool Android", 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.             // 1.以畫布為原點,順時針旋轉40.0f度  
  69. //          canvas.rotate(40.0f);  
  70.             // 2.以(100.11f, 100.22f)為原點,順時針旋轉50.0f度  
  71. //          canvas.rotate(50.0f, 100.11f, 100.22f);  
  72.             // 相應的,為了加深了解,我們再剖析一下第二個旋轉方法  
  73.             // ,其實系統為我們做的事情是這樣的  
  74.             // 畫布傾斜  
  75.             // skew(float sx,float xy);将畫布在x及y軸方向上傾斜相應的角度,sx或sy為傾斜角度的tan值,  
  76.             // 如canvas.skew(1,0);為在x方向上傾斜45度 >> tan(45) = 1  
  77. //          canvas.skew(1,0);  
  78.         }  
  79.     }  
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代碼  

Android 圖形使用者界面 之 繪圖(一)
Android 圖形使用者界面 之 繪圖(一)
  1. package com.view;  
  2. import android.content.Context;  
  3. import android.graphics.Canvas;  
  4. import android.graphics.Color;  
  5. import android.graphics.Paint;  
  6. import android.graphics.Path;  
  7. import android.graphics.Region;  
  8. import android.util.AttributeSet;  
  9. import android.view.View;  
  10. public class ClipRectDraw extends View {  
  11.     Context context;  
  12.     Paint paint;  
  13.     Path path;  
  14.     public ClipRectDraw(Context context) {  
  15.         super(context);  
  16.         init();  
  17.     }  
  18.     public ClipRectDraw(Context context, AttributeSet attrs) {  
  19.         super(context, attrs);  
  20.         init();  
  21.     }  
  22.     public ClipRectDraw(Context context, AttributeSet attrs, int defStyle) {  
  23.         super(context, attrs, defStyle);  
  24.         init();  
  25.     }  
  26.     private void init(){  
  27.         paint = new Paint();  
  28.         paint.setAntiAlias(true);  
  29.         paint.setStrokeWidth(5);  
  30.         paint.setTextSize(15);  
  31.         paint.setTextAlign(Paint.Align.RIGHT);  
  32.         path = new Path();  
  33.     }  
  34.     @Override  
  35.     protected void onDraw(Canvas canvas) {  
  36.         super.onDraw(canvas);  
  37.         canvas.drawColor(Color.GRAY);  
  38.         //左上圖  
  39.         canvas.save();  
  40.         canvas.translate(10, 10);  
  41.         drawScene(canvas);  
  42.         canvas.restore();  
  43.         //右上圖  
  44.         canvas.save();  
  45.         canvas.translate(160, 10);  
  46.         canvas.clipRect(10, 10, 90, 90);  
  47.         canvas.clipRect(30, 30, 70, 70, Region.Op.XOR);  
  48.         drawScene(canvas);  
  49.         canvas.restore();  
  50.         //左中圖  
  51.         canvas.save();  
  52.         canvas.translate(10, 130);  
  53.         path.reset();  
  54.         path.cubicTo(0, 0, 100, 0, 100, 100);  
  55.         path.cubicTo(100, 100, 0, 100, 0, 0);  
  56.         canvas.clipPath(path, Region.Op.REPLACE);  
  57.         drawScene(canvas);  
  58.         canvas.restore();  
  59.         //右中圖  
  60.         canvas.save();  
  61.         canvas.translate(160, 130);  
  62.         canvas.clipRect(0, 0, 60, 60);  
  63.         canvas.clipRect(40, 40, 100, 100, Region.Op.UNION);  
  64.         drawScene(canvas);  
  65.         canvas.restore();  
  66.         //左下圖  
  67.         canvas.save();  
  68.         canvas.translate(10, 250);  
  69.         canvas.clipRect(0, 0, 60, 60);  
  70.         canvas.clipRect(40, 40, 100, 100, Region.Op.XOR);  
  71.         drawScene(canvas);  
  72.         canvas.restore();  
  73.         //右下圖  
  74.         canvas.translate(160, 250);  
  75.         canvas.clipRect(0, 0, 60, 60);  
  76.         canvas.clipRect(40, 40, 100, 100, Region.Op.REVERSE_DIFFERENCE);  
  77.         drawScene(canvas);  
  78.         canvas.restore();  
  79.     }  
  80.     private void drawScene(Canvas canvas){  
  81.         canvas.clipRect(0, 0, 100, 100);  
  82.         canvas.drawColor(Color.WHITE);  
  83.         paint.setColor(Color.RED);  
  84.         canvas.drawLine(0, 0, 100, 100, paint);  
  85.         paint.setColor(Color.GREEN);  
  86.         canvas.drawCircle(30, 70, 30, paint);  
  87.         paint.setColor(Color.BLUE);  
  88.         canvas.drawText("ChenJianLi", 100, 30, paint);  
  89.     }  
  90. }  
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代碼  

Android 圖形使用者界面 之 繪圖(一)
Android 圖形使用者界面 之 繪圖(一)
  1. package com.view;  
  2. import com.test.R;  
  3. import android.content.Context;  
  4. import android.graphics.Bitmap;  
  5. import android.graphics.Canvas;  
  6. import android.graphics.Matrix;  
  7. import android.graphics.Paint;  
  8. import android.graphics.drawable.BitmapDrawable;  
  9. import android.view.View;  
  10. public class MatrixDraw extends View implements Runnable{  
  11.     Bitmap bitmap;  
  12.     Matrix matrix = new Matrix();  
  13.     Paint paint;  
  14.     public MatrixDraw(Context context) {  
  15.         super(context);  
  16.         bitmap = ((BitmapDrawable)getResources().getDrawable(R.drawable.rotate_surfaceview)).getBitmap();  
  17.         paint = new Paint();  
  18.         paint.setAntiAlias(true);  
  19.         new Thread(this).start();  
  20.     }  
  21.     float m;  
  22.     float n;  
  23.     @Override  
  24.     protected void onDraw(Canvas canvas) {  
  25.         n ++;  
  26.         if (n == 60) {  
  27.             n = 0;  
  28.         }  
  29.         matrix.postRotate(n);  
  30.         matrix.postTranslate(n, n);  
  31.         matrix.postScale(1, 1, n, n);  
  32.         canvas.drawBitmap(bitmap, matrix, paint);  
  33.     }  
  34.     @Override  
  35.     public void run() {  
  36.         while(!Thread.currentThread().isInterrupted()){  
  37.             try {  
  38.                 Thread.sleep(100);  
  39.                 postInvalidate();  
  40.             } catch (InterruptedException e) {  
  41.                 Thread.currentThread().interrupt();  
  42.             }  
  43.         }  
  44.     }  
  45. }  
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代碼  

Android 圖形使用者界面 之 繪圖(一)
Android 圖形使用者界面 之 繪圖(一)
  1. public class Matrix2Draw extends View {  
  2.         private Bitmap mBitmap;  
  3.         private Matrix mMatrix = new Matrix();  
  4.         public Matrix2Draw(Context context) {  
  5.             super(context);  
  6.             initialize();  
  7.         }  
  8.         private void initialize() {  
  9.             Bitmap bmp = ((BitmapDrawable)getResources().getDrawable(R.drawable.rotate_surfaceview)).getBitmap();  
  10.             mBitmap = bmp;  
  11.             mMatrix.setScale(100f/bmp.getWidth(), 100f/bmp.getHeight());  
  12.             // pre 方式:前乘 >> 參數給出的矩陣乘以目前的矩陣。是以操作是在目前矩陣的最前面發生的。  
  13.             //平移到(100,100)處  
  14.             mMatrix.preTranslate(100, 100);  
  15.             //傾斜x和y軸,以(100,100)為中心。  
  16.             mMatrix.preSkew(0.2f, 0.2f, 100, 100);  
  17.         }  
  18.         @Override protected void onDraw(Canvas canvas) {  
  19. //          super.onDraw(canvas);  //如果界面上還有其他元素需要繪制,隻需要将這句話寫上就行了。  
  20.             Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);  
  21.             canvas.drawBitmap(mBitmap, mMatrix, paint);  
  22.         }  
  23.     }  
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代碼  

Android 圖形使用者界面 之 繪圖(一)
Android 圖形使用者界面 之 繪圖(一)
  1. package com.view;  
  2. import android.content.Context;  
  3. import android.graphics.Canvas;  
  4. import android.graphics.Color;  
  5. import android.graphics.Paint;  
  6. import android.graphics.Rect;  
  7. import android.view.View;  
  8. public class SimpleDraw extends View implements Runnable {  
  9.     private Paint paint;  
  10.     public SimpleDraw(Context context) {  
  11.         super(context);  
  12.         paint = new Paint();  
  13.         new Thread(this).start();  
  14.     }  
  15.     @Override  
  16.     protected void onDraw(Canvas canvas) {  
  17.         super.onDraw(canvas);  
  18.         canvas.drawColor(Color.GRAY);//  
  19.         paint.setAntiAlias(true);//  
  20.         canvas.save();//  
  21.         canvas.clipRect(10, 10, 110, 110);//  
  22.         canvas.drawColor(Color.WHITE);//  
  23.         // canvas.rotate(m);//以螢幕左上角為坐标原點旋轉  
  24.         m += 45.0f;  
  25.         if (m == 360.0f) {  
  26.             m = 0.0f;  
  27.         }  
  28.         canvas.rotate(m, 60, 60);// 以(60,60)為原點旋轉  
  29.         paint.setColor(Color.GREEN);  
  30.         canvas.drawRect(new Rect(50, 50, 70, 70), paint);  
  31.         canvas.restore();  
  32.         canvas.save();  
  33.         canvas.translate(140, 10);  
  34.         canvas.clipRect(0, 0, 100, 100);// 一定要先剪輯出矩形區域再設畫布背景,  
  35.         //否則會覆寫整張畫布  
  36.         canvas.drawColor(Color.BLACK);  
  37.         paint.setColor(Color.BLUE);  
  38.         canvas.drawRect(new Rect(10, 10, 50, 50), paint);  
  39.         canvas.restore();  
  40.         //  
  41.         canvas.save();  
  42.         canvas.translate(120, 120);  
  43.         canvas.clipRect(new Rect(0, 0, 100, 100));  
  44.         canvas.drawColor(Color.GREEN);  
  45.         // paint.setColor(Color.BLUE);  
  46.         paint.setStrokeWidth(4);  
  47.         paint.setColor(Color.BLACK);  
  48.         canvas.drawLine(0, 60, 100, 60, paint);  
  49.         paint.setARGB(255, 51, 51, 51);  
  50.         paint.setTextSize(20);  
  51.         paint.setFlags(Paint.ANTI_ALIAS_FLAG);  
  52.         paint.setUnderlineText(true);  
  53.         // paint.setFlags(Paint.UNDERLINE_TEXT_FLAG);  
  54.         canvas.drawText("陳建立", 25, 80, paint);  
  55.         paint.setColor(Color.WHITE);  
  56.         canvas.drawRect(new Rect(10, 10, 50, 50), paint);  
  57.         canvas.restore();  
  58.     }  
  59.     float m = 0.0f;  
  60.     public void run() {  
  61.         while (!Thread.currentThread().isInterrupted()) {  
  62.             try {  
  63.                 Thread.sleep(500);// 每半秒執行一次  
  64.             } catch (InterruptedException e) {  
  65.                 Thread.currentThread().interrupt();  
  66.             }  
  67.             postInvalidate();  
  68.         }  
  69.     }  
  70. }  
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代碼  

Android 圖形使用者界面 之 繪圖(一)
Android 圖形使用者界面 之 繪圖(一)
  1. package com.view;  
  2. import android.content.Context;  
  3. import android.graphics.Canvas;  
  4. import android.graphics.Color;  
  5. import android.graphics.Paint;  
  6. import android.graphics.Paint.FontMetrics;  
  7. import android.util.Log;  
  8. import android.view.View;  
  9. public class TextDraw extends View {  
  10.     public TextDraw(Context context) {  
  11.         super(context);  
  12.     }  
  13.     @Override  
  14.     protected void onDraw(Canvas canvas) {  
  15.         super.onDraw(canvas);  
  16.         Paint textPaint = new Paint( Paint.ANTI_ALIAS_FLAG);  
  17.         textPaint.setTextSize( 35);  
  18.         textPaint.setColor( Color.WHITE);  
  19.         // FontMetrics  
  20.         FontMetrics fontMetrics = textPaint.getFontMetrics();  
  21.         String text = "abcdefghijklm";  
  22.         //   
  23.         float baseX = 0;  
  24.         float baseY = 100;  
  25.         Log.d("textDraw", "top = "+fontMetrics.top+  
  26.                                         "ascent = "+fontMetrics.ascent+  
  27.                                         "descent = "+fontMetrics.descent+  
  28.                                         "bottom = "+fontMetrics.bottom+"\n");  
  29.         float topY = baseY + fontMetrics.top;  
  30.         float ascentY = baseY + fontMetrics.ascent;  
  31.         float descentY = baseY + fontMetrics.descent;  
  32.         float bottomY = 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.         Paint baseLinePaint = new Paint( 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.         Paint topLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG);  
  47.         topLinePaint.setColor( Color.LTGRAY);  
  48.         canvas.drawLine(0, topY, getWidth(), topY, topLinePaint);  
  49.         // AscentLine  
  50.         Paint ascentLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG);  
  51.         ascentLinePaint.setColor( Color.GREEN);  
  52.         canvas.drawLine(0, ascentY, getWidth(), ascentY, ascentLinePaint);  
  53.         // DescentLine  
  54.         Paint descentLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG);  
  55.         descentLinePaint.setColor( Color.YELLOW);  
  56.         canvas.drawLine(0, descentY, getWidth(), descentY, descentLinePaint);  
  57.         // ButtomLine  
  58.         Paint bottomLinePaint = new Paint( 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代碼  

Android 圖形使用者界面 之 繪圖(一)
Android 圖形使用者界面 之 繪圖(一)
  1. class RoundImageView extends View {  
  2.         private Bitmap bitmap;  
  3.         int bitmapWidth;  
  4.         int bitmapHeight;  
  5.         public RoundImageView(Context context) {  
  6.             super(context);  
  7.             bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.rotate_surfaceview);  
  8.             bitmapWidth = bitmap.getWidth();  
  9.             bitmapHeight = bitmap.getHeight();  
  10.         }  
  11.         @Override  
  12.         protected void onDraw(Canvas canvas) {  
  13.             super.onDraw(canvas);  
  14.             // 第一種方法:  
  15.             // 第二種方法:  
  16.             Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);  
  17.             paint.setColor(0xffffffff);  
  18.             paint.setTextSize(15);  
  19.             canvas.drawText("生成帶圓角的圖檔", 10, 25, paint);  
  20.             canvas.drawBitmap(getRoundedCornerBitmap(bitmap), 10, 30, paint);  
  21.             canvas.drawText("生成帶倒影的圖檔", 170, 160, paint);  
  22.             canvas.drawBitmap(createReflectionImageWithOrigin(bitmap), 170, 165, paint);  
  23.         }  
  24.         public Bitmap getRoundedCornerBitmap(Bitmap bitmap) {   
  25.             // 建立一個指定寬度和高度的空位圖對象  
  26.             Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),bitmap.getHeight(), Config.ARGB_8888);   
  27.             // 用該位圖建立畫布  
  28.             Canvas canvas = new Canvas(output);  
  29.             // 畫筆對象  
  30.             final Paint paint = new Paint();   
  31.             // 畫筆的顔色  
  32.             final int color = 0xff424242;   
  33.             // 矩形區域對象  
  34.             final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());   
  35.             // 未知  
  36.             final RectF rectF = new RectF(rect);   
  37.             // 拐角的半徑  
  38.             final float roundPx = 12;  
  39.             // 消除鋸齒  
  40.             paint.setAntiAlias(true);   
  41.             // 畫布背景色  
  42.             canvas.drawARGB(0, 0, 0, 0);  
  43.             // 設定畫筆顔色  
  44.             paint.setColor(color);   
  45.             // 繪制圓角矩形  
  46.             canvas.drawRoundRect(rectF, roundPx, roundPx,paint);  
  47.             // 未知  
  48.             paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));  
  49.             // 把該圖檔繪制在該圓角矩形區域中  
  50.             canvas.drawBitmap(bitmap, rect, rect, paint);  
  51.             // 最終在畫布上呈現的就是該圓角矩形圖檔,然後我們傳回該Bitmap對象  
  52.             return output;   
  53.         }  
  54.         //獲得帶倒影的圖檔方法   
  55.         public Bitmap createReflectionImageWithOrigin(Bitmap bitmap){   
  56.             // 圖檔與倒影之間的距離間隔  
  57.             final int reflectionGap = 2;  
  58.             // 原圖的寬度  
  59.             int width = bitmap.getWidth();   
  60.             // 原圖的高度  
  61.             int height = bitmap.getHeight();   
  62.             // 圖檔旋轉,縮放等控制對象  
  63.             Matrix matrix = new Matrix();   
  64.             // 縮放(這裡pre,set,post三種效果是不一樣的,注意差別)  
  65.             matrix.preScale(1, -1);   
  66.             // 建立一個初始的倒影位圖  
  67.             Bitmap reflectionImage = Bitmap.createBitmap(bitmap, 0, height/2, width, height/2, matrix, false);   
  68.             // 建立一個寬度為原圖寬度,高度為原圖高度的3/2的位圖,用于繪制新的位圖,即整體的效果圖位圖對象  
  69.             Bitmap bitmapWithReflection = Bitmap.createBitmap(width, (height + height/2), Config.ARGB_8888);   
  70.             // 由該位圖對象建立初始畫布(規定了畫布的寬高)  
  71.             Canvas canvas = new Canvas(bitmapWithReflection);   
  72.             // 在該畫布上繪制原圖  
  73.             canvas.drawBitmap(bitmap, 0, 0, null);   
  74.             // 建立一個畫筆  
  75.             Paint deafalutPaint = new Paint();   
  76.             // 繪制一個矩形區域,該矩形區域便是原圖和倒影圖之間的間隔圖  
  77.             canvas.drawRect(0, height,width,height + reflectionGap,deafalutPaint);   
  78.             // 繪制該倒影圖于間隔圖的下方  
  79.             canvas.drawBitmap(reflectionImage, 0, height + reflectionGap, null);   
  80.             // 建立一個畫筆  
  81.             Paint paint = new Paint();  
  82.             // 建立一個線性漸變對象  
  83.             LinearGradient shader = new LinearGradient(  
  84.                                                             0, bitmap.getHeight(),   
  85.                                                             0, bitmapWithReflection.getHeight() + reflectionGap,   
  86.                                                             0x70ffffff, 0x00ffffff,   
  87.                                                             TileMode.CLAMP  
  88.                                                       );   
  89.             // 把漸變效果應用在畫筆上  
  90.             paint.setShader(shader);   
  91.             // Set the Transfer mode to be porter duff and destination in   
  92.             // 未知  
  93.             paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));   
  94.             // Draw a rectangle using the paint with our linear gradient   
  95.             // 繪制出該漸變效果,也就是最終的倒影效果圖  
  96.             canvas.drawRect(0, height, width, bitmapWithReflection.getHeight() + reflectionGap, paint);   
  97.             // 傳回  
  98.             return bitmapWithReflection;   
  99.         }   
  100.     }  
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代碼  

Android 圖形使用者界面 之 繪圖(一)
Android 圖形使用者界面 之 繪圖(一)
  1. package com.view;  
  2. import com.test.R;  
  3. import android.content.Context;  
  4. import android.graphics.Bitmap;  
  5. import android.graphics.BitmapFactory;  
  6. import android.graphics.Canvas;  
  7. import android.graphics.Matrix;  
  8. import android.graphics.Paint;  
  9. import android.graphics.Rect;  
  10. import android.util.Log;  
  11. import android.view.SurfaceHolder;  
  12. import android.view.SurfaceView;  
  13. public class SurfaceViewDraw extends SurfaceView implements Runnable,SurfaceHolder.Callback {  
  14.     private Bitmap backgroundBitmap;  
  15.     private Bitmap rotateBitmap;  
  16.     SurfaceHolder surfaceHolder;  
  17.     public SurfaceViewDraw(Context context) {  
  18.         super(context);  
  19.         backgroundBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.background_surfaceview);  
  20.         rotateBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.rotate_surfaceview);  
  21.         surfaceHolder = this.getHolder();  
  22.         surfaceHolder.addCallback(this);      
  23.     }  
  24.     public void surfaceCreated(SurfaceHolder holder) {  
  25.         new Thread(this).start();  
  26.         Log.d("surfaceview", "surfaceCreated");  
  27.     }  
  28.     public void surfaceChanged(SurfaceHolder holder, int format, int width,  
  29.             int height) {  
  30.         Log.d("surfaceview", "surfaceChanged");  
  31.     }  
  32.     public void surfaceDestroyed(SurfaceHolder holder) {  
  33.         Log.d("surfaceview", "surfaceDestroyed");  
  34.     }  
  35.     @Override  
  36.     public void run() {  
  37.         Log.d("surfaceview", "run");  
  38.         Canvas canvas = null;  
  39.         int rotateValue = 0;//旋轉角度  
  40.         int frameCount = 0;//幀計數器  
  41.         while (!Thread.currentThread().isInterrupted()) {  
  42.             try {      
  43. //              canvas = surfaceHolder.lockCanvas();//擷取畫布對象(擷取整個螢幕的畫布)  
  44.                 canvas = surfaceHolder.lockCanvas(new Rect(10, 10, 240, 250));//擷取某個區域的畫布  
  45.                 Paint paint = new Paint();  
  46.                 Log.d("surfaceview", "rotateValue " +rotateValue+"|frameCount "+frameCount);  
  47.                 if (frameCount++ < 2) {//僅在第一次繪制時繪制背景  
  48.                     canvas.drawBitmap(backgroundBitmap, 0, 0, paint);//繪制背景  
  49.                 }  
  50.                 //建立矩陣以控制圖檔的旋轉和平移  
  51.                 Matrix matrix = new Matrix();  
  52.                 rotateValue += 40;  
  53.                 matrix.setRotate(rotateValue, rotateBitmap.getWidth()/2, rotateBitmap.getHeight()/2);  
  54. //              matrix.postRotate(rotateValue, rotateBitmap.getWidth()/2, rotateBitmap.getHeight()/2);  
  55. //              matrix.setTranslate(100, rotateValue);  
  56.                 if (rotateValue == 360) {  
  57.                     rotateValue = 0;    
  58.                 }  
  59.                 matrix.setTranslate(80,50);//設定左邊距和上邊距  
  60.                 //繪制問号  
  61.                 Log.d("surfaceview", "canvas "+canvas);  
  62.                 Log.d("surfaceview", "rotateBitmap "+rotateBitmap);  
  63.                 Log.d("surfaceview", "matrix "+matrix);  
  64.                 Log.d("surfaceview", "paint "+paint);  
  65.                 if (canvas != null) {  
  66.                     canvas.drawBitmap(rotateBitmap, matrix, paint);  
  67.                     //解鎖畫布,送出畫好的圖像  
  68.                     surfaceHolder.unlockCanvasAndPost(canvas);  
  69.                 }  
  70.                 Thread.sleep(30);  
  71.             } catch (InterruptedException e) {  
  72.                 Thread.currentThread().interrupt();  
  73.                 Log.d("surfaceview", "InterruptedException");  
  74.             } finally {  
  75.                 Log.d("surfaceview", "finally");  
  76.             }  
  77.         }  
  78.     }