android Bitmap围绕一个点进行旋转

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

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

 

[java][/java] view plaincopy

  1. package com.example.test;
  2. import java.util.Timer;
  3. @SuppressLint(“HandlerLeak”)
  4. class Surface extends SurfaceView implements Callback{
  5. <span style=”white-space:pre”>  </span>Bitmap bmp;
  6. <span style=”white-space:pre”>  </span>private Paint mPaint;
  7. <span style=”white-space:pre”>  </span>private SurfaceHolder mHolder;
  8. <span style=”white-space:pre”>  </span>public Surface(Context context) {
  9. <span style=”white-space:pre”>      </span>super(context);
  10. <span style=”white-space:pre”>      </span>mHolder = getHolder();
  11. <span style=”white-space:pre”>      </span>mHolder.addCallback(this);
  12.         mPaint = new Paint();
  13.         mPaint.setColor(Color.GREEN);
  14.         mPaint.setAntiAlias(true);//抗锯齿
  15.         setFocusable(true);
  16.         setFocusableInTouchMode(true);
  17. //        setZOrderOnTop(true);
  18. //        mHolder.setFormat(PixelFormat.TRANSPARENT);//设置背景透明
  19. <span style=”white-space:pre”>      </span>bmp = BitmapFactory.decodeResource(getResources(), R.drawable.camera_r_local);
  20.  <span style=”white-space:pre”>        </span>bmp = Bitmap.createScaledBitmap(bmp, 15, 15, false);
  21. <span style=”white-space:pre”>  </span>}
  22. <span style=”white-space:pre”>  </span>public Handler handler = new Handler(){
  23. <span style=”white-space:pre”>      </span>@Override
  24. <span style=”white-space:pre”>      </span>public void handleMessage(Message msg) {
  25. <span style=”white-space:pre”>          </span>switch (msg.what) {
  26. <span style=”white-space:pre”>          </span>case 0:
  27. <span style=”white-space:pre”>              </span>canvas_ok();
  28. <span style=”white-space:pre”>              </span>break;
  29. <span style=”white-space:pre”>          </span>}
  30. <span style=”white-space:pre”>          </span>super.handleMessage(msg);
  31. <span style=”white-space:pre”>      </span>}
  32. <span style=”white-space:pre”>      </span>
  33. <span style=”white-space:pre”>  </span>};
  34. <span style=”white-space:pre”>  </span>
  35. <span style=”white-space:pre”>  </span>public void canvas_ok(){
  36. <span style=”white-space:pre”>      </span> Canvas canvas = null;
  37. <span style=”white-space:pre”>      </span>try {
  38. <span style=”white-space:pre”>          </span>canvas = mHolder.lockCanvas();
  39. <span style=”white-space:pre”>          </span>canvas.drawColor(Color.TRANSPARENT, Mode.CLEAR);//清除屏幕
  40. //<span style=”white-space:pre”>    </span>        canvas.save();
  41. <span style=”white-space:pre”>  </span>        Matrix matrix = new Matrix();
  42. <span style=”white-space:pre”>  </span>        matrix.postTranslate(130, 0);
  43. <span style=”white-space:pre”>  </span>        matrix.postRotate(degree, 130 ,130);
  44. <span style=”white-space:pre”>  </span>        canvas.drawBitmap(bmp, matrix, mPaint);
  45. //<span style=”white-space:pre”>    </span>        canvas.restore();
  46. <span style=”white-space:pre”>      </span>} catch (Exception e) {
  47. <span style=”white-space:pre”>      </span>}finally {
  48.             if(canvas != null) {
  49.                 mHolder.unlockCanvasAndPost(canvas);
  50.             }
  51.         }
  52. <span style=”white-space:pre”>  </span>}
  53. <span style=”white-space:pre”>  </span>int degree = 0;
  54. <span style=”white-space:pre”>  </span>Timer timer = new Timer();
  55. <span style=”white-space:pre”>  </span>boolean flag = true;
  56. <span style=”white-space:pre”>  </span>@Override
  57. <span style=”white-space:pre”>  </span>public void surfaceCreated(SurfaceHolder holder) {
  58. <span style=”white-space:pre”>      </span>canvas_ok();
  59. <span style=”white-space:pre”>      </span>timer.schedule(new TimerTask() {
  60. <span style=”white-space:pre”>          </span>@Override
  61. <span style=”white-space:pre”>          </span>public void run() {
  62. <span style=”white-space:pre”>              </span>if (flag) {
  63. <span style=”white-space:pre”>                  </span>degree++;
  64. <span style=”white-space:pre”>                  </span>if (degree == 360) {
  65. <span style=”white-space:pre”>                      </span>flag = false;
  66. <span style=”white-space:pre”>                  </span>}
  67. <span style=”white-space:pre”>              </span>}else {
  68. <span style=”white-space:pre”>                  </span>degree–;
  69. <span style=”white-space:pre”>                  </span>if(degree == -360 || degree == 0){
  70. <span style=”white-space:pre”>                      </span>flag = true;
  71. <span style=”white-space:pre”>                  </span>}
  72. <span style=”white-space:pre”>              </span>}
  73. <span style=”white-space:pre”>              </span>Log.e(“flag”, degree+”  : “+flag);
  74. <span style=”white-space:pre”>              </span>handler.sendEmptyMessage(0);
  75. <span style=”white-space:pre”>          </span>}
  76. <span style=”white-space:pre”>      </span>}, 50, 50);
  77. <span style=”white-space:pre”>  </span>}
  78. <span style=”white-space:pre”>  </span>@Override
  79. <span style=”white-space:pre”>  </span>public void surfaceChanged(SurfaceHolder holder, int format, int width,
  80. <span style=”white-space:pre”>          </span>int height) {
  81. <span style=”white-space:pre”>      </span>
  82. <span style=”white-space:pre”>  </span>}
  83. <span style=”white-space:pre”>  </span>@Override
  84. <span style=”white-space:pre”>  </span>public void surfaceDestroyed(SurfaceHolder holder) {
  85. <span style=”white-space:pre”>      </span>if (timer != null) {
  86. <span style=”white-space:pre”>          </span>timer.cancel();
  87. <span style=”white-space:pre”>          </span>timer = null;
  88. <span style=”white-space:pre”>      </span>}
  89. <span style=”white-space:pre”>  </span>}
  90. }

Main7.java是主类

 

 

[java][/java] view plaincopy

  1. package com.example.test;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. import android.widget.RelativeLayout;
  5. public class Main7 extends Activity{
  6.     Surface surface;
  7.     RelativeLayout.LayoutParams laParams;
  8.     @Override
  9.     protected void 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. }

效果图如下:

 

 

标签