android Bitmap围绕一个点进行旋转

转自:http://www.cdtarena.com/gpx/201307/9312.html
​在项目中需要使用定位功能,也就是一个点围绕一个圆心进行旋转,查看了canvas的函数也就只有一个 canvas.drawBitmap(bitmap, matrix, paint)通过使用Matrix来实现旋转,这里实现一个demo,功能就是小原点顺时针绘制一个原然后逆时针撤销这个圆,通过Timer来实现。代码如下:

Surface.java这个是实现绘制图形的类

[java] view plaincopyprint?
  1. package com.example.test;  
  2.   
  3. import java.util.Timer;  
  4. import java.util.TimerTask;  
  5.   
  6. import android.annotation.SuppressLint;  
  7. import android.content.Context;  
  8. import android.graphics.Bitmap;  
  9. import android.graphics.BitmapFactory;  
  10. import android.graphics.Canvas;  
  11. import android.graphics.Color;  
  12. import android.graphics.Matrix;  
  13. import android.graphics.Paint;  
  14. import android.graphics.PixelFormat;  
  15. import android.graphics.PorterDuff.Mode;  
  16. import android.os.Handler;  
  17. import android.os.Message;  
  18. import android.util.Log;  
  19. import android.view.SurfaceHolder;  
  20. import android.view.SurfaceView;  
  21. import android.view.SurfaceHolder.Callback;  
  22.   
  23. @SuppressLint("HandlerLeak")  
  24. class Surface extends SurfaceView implements Callback{  
  25.   
  26.     Bitmap bmp;  
  27.     private Paint mPaint;  
  28.     private SurfaceHolder mHolder;  
  29.     public Surface(Context context) {  
  30.         super(context);  
  31.         mHolder = getHolder();  
  32.         mHolder.addCallback(this);  
  33.         mPaint = new Paint();  
  34.         mPaint.setColor(Color.GREEN);  
  35.         mPaint.setAntiAlias(true);//抗锯齿   
  36.         setFocusable(true);  
  37.         setFocusableInTouchMode(true);  
  38. //        setZOrderOnTop(true);   
  39. //        mHolder.setFormat(PixelFormat.TRANSPARENT);//设置背景透明   
  40.         bmp = BitmapFactory.decodeResource(getResources(), R.drawable.camera_r_local);  
  41.         bmp = Bitmap.createScaledBitmap(bmp, 1515false);  
  42.     }  
  43.   
  44.     public Handler handler = new Handler(){  
  45.         @Override  
  46.         public void handleMessage(Message msg) {  
  47.             switch (msg.what) {  
  48.             case 0:  
  49.                 canvas_ok();  
  50.                 break;  
  51.             }  
  52.             super.handleMessage(msg);  
  53.         }  
  54.           
  55.     };  
  56.       
  57.     public void canvas_ok(){  
  58.          Canvas canvas = null;  
  59.         try {  
  60.             canvas = mHolder.lockCanvas();  
  61.             canvas.drawColor(Color.TRANSPARENT, Mode.CLEAR);//清除屏幕   
  62. //          canvas.save();   
  63.             Matrix matrix = new Matrix();  
  64.             matrix.postTranslate(1300);  
  65.             matrix.postRotate(degree, 130 ,130);  
  66.             canvas.drawBitmap(bmp, matrix, mPaint);  
  67. //          canvas.restore();   
  68.         } catch (Exception e) {  
  69.         }finally {  
  70.             if(canvas != null) {  
  71.                 mHolder.unlockCanvasAndPost(canvas);  
  72.             }  
  73.         }  
  74.     }  
  75.   
  76.     int degree = 0;  
  77.     Timer timer = new Timer();  
  78.     boolean flag = true;  
  79.     @Override  
  80.     public void surfaceCreated(SurfaceHolder holder) {  
  81.         canvas_ok();  
  82.         timer.schedule(new TimerTask() {  
  83.             @Override  
  84.             public void run() {  
  85.                 if (flag) {  
  86.                     degree++;  
  87.                     if (degree == 360) {  
  88.                         flag = false;  
  89.                     }  
  90.                 }else {  
  91.                     degree--;  
  92.                     if(degree == -360 || degree == 0){  
  93.                         flag = true;  
  94.                     }  
  95.                 }  
  96.                 Log.e("flag", degree+"  : "+flag);  
  97.                 handler.sendEmptyMessage(0);  
  98.             }  
  99.         }, 5050);  
  100.     }  
  101.   
  102.    http://www.cdtarena.com/ruanj.html
  103.     @Override  
  104.     public void surfaceChanged(SurfaceHolder holder, int format, int width,  
  105.             int height) {  
  106.           
  107.     }  
  108.   
  109.   
  110.     @Override  
  111.     public void surfaceDestroyed(SurfaceHolder holder) {  
  112.         if (timer != null) {  
  113.             timer.cancel();  
  114.             timer = null;  
  115.         }  
  116.     }  
  117. }  

Main7.java是主类

[java] view plaincopyprint?
  1. package com.example.test;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.widget.RelativeLayout;  
  6.   
  7. public class Main7 extends Activity{  
  8.     Surface surface;  
  9.     RelativeLayout.LayoutParams laParams;  
  10.     @Override  
  11.     protected void onCreate(Bundle savedInstanceState) {  
  12.         super.onCreate(savedInstanceState);  
  13.         surface = new Surface(this);  
  14.         laParams = new RelativeLayout.LayoutParams(260,  260);  
  15.         setContentView(surface, laParams);  
  16.     }  
  17.   
  18. }  

效果图如下:

原文地址:https://www.cnblogs.com/cdtarena/p/3205599.html