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. import java.util.Timer;  

  3. import java.util.TimerTask;  


  4. import android.annotation.SuppressLint;  

  5. import android.content.Context;  

  6. import android.graphics.Bitmap;  

  7. import android.graphics.BitmapFactory;  

  8. import android.graphics.Canvas;  

  9. import android.graphics.Color;  

  10. import android.graphics.Matrix;  

  11. import android.graphics.Paint;  

  12. import android.graphics.PixelFormat;  

  13. import android.graphics.PorterDuff.Mode;  

  14. import android.os.Handler;  

  15. import android.os.Message;  

  16. import android.util.Log;  

  17. import android.view.SurfaceHolder;  

  18. import android.view.SurfaceView;  

  19. import android.view.SurfaceHolder.Callback;  


  20. @SuppressLint("HandlerLeak")  

  21. class Surface extends SurfaceView implements Callback{  


  22.    Bitmap bmp;  

  23. private Paint mPaint;  

  24. private SurfaceHolder mHolder;  

  25. public Surface(Context context) {  

  26. super(context);  

  27.        mHolder = getHolder();  

  28.        mHolder.addCallback(this);  

  29.        mPaint = new Paint();  

  30.        mPaint.setColor(Color.GREEN);  

  31.        mPaint.setAntiAlias(true);//抗鋸齒

  32.        setFocusable(true);  

  33.        setFocusableInTouchMode(true);  

  34. //        setZOrderOnTop(true);

  35. //        mHolder.setFormat(PixelFormat.TRANSPARENT);//設置背景透明

  36.        bmp = BitmapFactory.decodeResource(getResources(), R.drawable.camera_r_local);  

  37.        bmp = Bitmap.createScaledBitmap(bmp, 15, 15, false);  

  38.    }  


  39. public Handler handler = new Handler(){  

  40. @Override

  41. publicvoid handleMessage(Message msg) {  

  42. switch (msg.what) {  

  43. case0:  

  44.                canvas_ok();  

  45. break;  

  46.            }  

  47. super.handleMessage(msg);  

  48.        }  


  49.    };  


  50. publicvoid canvas_ok(){  

  51.         Canvas canvas = null;  

  52. try {  

  53.            canvas = mHolder.lockCanvas();  

  54.            canvas.drawColor(Color.TRANSPARENT, Mode.CLEAR);//清除屏幕

  55. //          canvas.save();

  56.            Matrix matrix = new Matrix();  

  57.            matrix.postTranslate(130, 0);  

  58.            matrix.postRotate(degree, 130 ,130);  

  59.            canvas.drawBitmap(bmp, matrix, mPaint);  

  60. //          canvas.restore();

  61.        } catch (Exception e) {  

  62.        }finally {  

  63. if(canvas != null) {  

  64.                mHolder.unlockCanvasAndPost(canvas);  

  65.            }  

  66.        }  

  67.    }  


  68. int degree = 0;  

  69.    Timer timer = new Timer();  

  70. boolean flag = true;  

  71. @Override

  72. publicvoid surfaceCreated(SurfaceHolder holder) {  

  73.        canvas_ok();  

  74.        timer.schedule(new TimerTask() {  

  75. @Override

  76. publicvoid run() {  

  77. if (flag) {  

  78.                    degree++;  

  79. if (degree == 360) {  

  80.                        flag = false;  

  81.                    }  

  82.                }else {  

  83.                    degree--;  

  84. if(degree == -360 || degree == 0){  

  85.                        flag = true;  

  86.                    }  

  87.                }  

  88.                Log.e("flag", degree+"  : "+flag);  

  89.                handler.sendEmptyMessage(0);  

  90.            }  

  91.        }, 50, 50);  

  92.    }  


  93. http://www.cdtarena.com/ruanj.html

  94. @Override

  95. publicvoid surfaceChanged(SurfaceHolder holder, int format, int width,  

  96. int height) {  


  97.    }  



  98. @Override

  99. publicvoid surfaceDestroyed(SurfaceHolder holder) {  

  100. if (timer != null) {  

  101.            timer.cancel();  

  102.            timer = null;  

  103.        }  

  104.    }  

  105. }  

Main7.java是主類
[java] view plaincopyprint?
  1. package com.example.test;  


  2. import android.app.Activity;  

  3. import android.os.Bundle;  

  4. import android.widget.RelativeLayout;  


  5. publicclass Main7 extends Activity{  

  6.    Surface surface;  

  7.    RelativeLayout.LayoutParams laParams;  

  8. @Override

  9. protectedvoid onCreate(Bundle savedInstanceState) {  

  10. super.onCreate(savedInstanceState);  

  11.        surface = new Surface(this);  

  12.        laParams = new RelativeLayout.LayoutParams(260,  260);  

  13.        setContentView(surface, laParams);  

  14.    }  


  15. }  

效果圖如下:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章