在項目中需要使用定位功能,也就是一個點圍繞一個圓心進行旋轉,查看了canvas的函數也就只有一個 canvas.drawBitmap(bitmap, matrix, paint)通過使用Matrix來實現旋轉,這裡實現一個demo,功能就是小原點順時針繪製一個原然後逆時針撤銷這個圓,通過Timer來實現。代碼如下: Surface.java這個是實現繪製圖形的類
package com.example.test; import java.util.Timer; import java.util.TimerTask; import android.annotation.SuppressLint; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.PixelFormat; import android.graphics.PorterDuff.Mode; import android.os.Handler; import android.os.Message; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.SurfaceHolder.Callback; @SuppressLint("HandlerLeak") class Surface extends SurfaceView implements Callback{ Bitmap bmp; private Paint mPaint; private SurfaceHolder mHolder; public Surface(Context context) { super(context); mHolder = getHolder(); mHolder.addCallback(this); mPaint = new Paint(); mPaint.setColor(Color.GREEN); mPaint.setAntiAlias(true);//消除鋸齒 setFocusable(true); setFocusableInTouchMode(true); // setZOrderOnTop(true); // mHolder.setFormat(PixelFormat.TRANSPARENT);//設定背景透明 bmp = BitmapFactory.decodeResource(getResources(), R.drawable.camera_r_local); bmp = Bitmap.createScaledBitmap(bmp, 15, 15, false); } public Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { switch (msg.what) { case 0: canvas_ok(); break; } super.handleMessage(msg); } }; public void canvas_ok(){ Canvas canvas = null; try { canvas = mHolder.lockCanvas(); canvas.drawColor(Color.TRANSPARENT, Mode.CLEAR);//清除螢幕 // canvas.save(); Matrix matrix = new Matrix(); matrix.postTranslate(130, 0); matrix.postRotate(degree, 130 ,130); canvas.drawBitmap(bmp, matrix, mPaint); // canvas.restore(); } catch (Exception e) { }finally { if(canvas != null) { mHolder.unlockCanvasAndPost(canvas); } } } int degree = 0; Timer timer = new Timer(); boolean flag = true; @Override public void surfaceCreated(SurfaceHolder holder) { canvas_ok(); timer.schedule(new TimerTask() { @Override public void run() { if (flag) { degree++; if (degree == 360) { flag = false; } }else { degree--; if(degree == -360 || degree == 0){ flag = true; } } Log.e("flag", degree+" : "+flag); handler.sendEmptyMessage(0); } }, 50, 50); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceDestroyed(SurfaceHolder holder) { if (timer != null) { timer.cancel(); timer = null; } } } package com.example.test;import java.util.Timer;import java.util.TimerTask;import android.annotation.SuppressLint;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Matrix;import android.graphics.Paint;import android.graphics.PixelFormat;import android.graphics.PorterDuff.Mode;import android.os.Handler;import android.os.Message;import android.util.Log;import android.view.SurfaceHolder;import android.view.SurfaceView;import android.view.SurfaceHolder.Callback;@SuppressLint("HandlerLeak")class Surface extends SurfaceView implements Callback{Bitmap bmp;private Paint mPaint;private SurfaceHolder mHolder;public Surface(Context context) {super(context);mHolder = getHolder();mHolder.addCallback(this); mPaint = new Paint(); mPaint.setColor(Color.GREEN); mPaint.setAntiAlias(true);//消除鋸齒 setFocusable(true); setFocusableInTouchMode(true);// setZOrderOnTop(true);// mHolder.setFormat(PixelFormat.TRANSPARENT);//設定背景透明bmp = BitmapFactory.decodeResource(getResources(), R.drawable.camera_r_local); bmp = Bitmap.createScaledBitmap(bmp, 15, 15, false);}public Handler handler = new Handler(){@Overridepublic void handleMessage(Message msg) {switch (msg.what) {case 0:canvas_ok();break;}super.handleMessage(msg);}};public void canvas_ok(){Canvas canvas = null;try {canvas = mHolder.lockCanvas();canvas.drawColor(Color.TRANSPARENT, Mode.CLEAR);//清除螢幕// canvas.save(); Matrix matrix = new Matrix(); matrix.postTranslate(130, 0); matrix.postRotate(degree, 130 ,130); canvas.drawBitmap(bmp, matrix, mPaint);// canvas.restore();} catch (Exception e) {}finally { if(canvas != null) { mHolder.unlockCanvasAndPost(canvas); } }}int degree = 0;Timer timer = new Timer();boolean flag = true;@Overridepublic void surfaceCreated(SurfaceHolder holder) {canvas_ok();timer.schedule(new TimerTask() {@Overridepublic void run() {if (flag) {degree++;if (degree == 360) {flag = false;}}else {degree--;if(degree == -360 || degree == 0){flag = true;}}Log.e("flag", degree+" : "+flag);handler.sendEmptyMessage(0);}}, 50, 50);}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {if (timer != null) {timer.cancel();timer = null;}}}
Main7.java是主類
package com.example.test; import android.app.Activity; import android.os.Bundle; import android.widget.RelativeLayout; public class Main7 extends Activity{ Surface surface; RelativeLayout.LayoutParams laParams; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); surface = new Surface(this); laParams = new RelativeLayout.LayoutParams(260, 260); setContentView(surface, laParams); } } package com.example.test;import android.app.Activity;import android.os.Bundle;import android.widget.RelativeLayout;public class Main7 extends Activity{Surface surface;RelativeLayout.LayoutParams laParams;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);surface = new Surface(this);laParams = new RelativeLayout.LayoutParams(260, 260);setContentView(surface, laParams);}}
如下: