canvas教程

android Bitmap围绕一个点进行旋转

字号+ 作者:H5之家 来源:H5之家 2016-05-30 10:00 我要评论( )

在项目中需要使用定位功能,也就是一个点围绕一个圆心进行旋转,查看了canvas的函数也就只有一个 canvas.drawBitmap(,Canvas/Bitmap

  • 当前位置:主页 > 图形图像 > Canvas/Bitmap >
  • android Bitmap围绕一个点进行旋转
  • 发布时间:2016-05-22 21:13 | 作者:采集侠 | 来源:网络整理 | 浏览:
  • 在项目中需要使用定位功能,也就是一个点围绕一个圆心进行旋转,查看了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(){ @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; } } }

     

     

     

  • 1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    相关文章
    • Canvas与ValueAnimator

      Canvas与ValueAnimator

      2017-04-28 18:00

    • Android Bitmap和Canvas学习笔记(转)

      Android Bitmap和Canvas学习笔记(转)

      2017-04-28 17:00

    • 21天学习android开发教程之SurfaceView与多线程的混搭

      21天学习android开发教程之SurfaceView与多线程的混搭

      2017-04-27 12:00

    • Android画图学习免费下载

      Android画图学习免费下载

      2017-04-27 11:01

    网友点评