关闭

android动态绕可移动轴心旋转图片

627人阅读 评论(0) 收藏 举报

这篇文章主要用于本人查阅资料所写。如果对你也有所帮助,那么也请你可以把更多更好的作品分享给所有开发人员,大家共同学习进步。再次,很感谢http://chroya.javaeye.com/blog/712078该文章的作者,他对Matrix的了解很全面。再次感谢。

 

 

下面的解释来自http://chroya.javaeye.com/blog/712078,再次感谢。

 

Matrix ,中文里叫矩阵,高等数学里有介绍,在图像处理方面,主要是用于平面的缩放、平移、旋转等操作。

        首先介绍一下矩阵运算。加法和减法就不用说了,太简单了,对应位相加就好。图像处理,主要用到的是乘法 。下面是一个乘法的公式:


 


        在 Android 里面, Matrix 由 9 个 float 值构成,是一个 3*3 的矩阵。如下图。

        

没专业工具,画的挺难看。解释一下,上面的 sinX 和 cosX ,表示旋转角度的 cos 值和 sin 值,注意,旋转角度是按顺时针方向计算的。 translateX 和 translateY 表示 x 和 y 的平移量。 scale 是缩放的比例, 1 是不变, 2 是表示缩放 1/2 ,这样子。

 

 

本人愚昧,实现的代码如下:


 

  1. public class BeadplateMiddle extends View {  
  2.     private Bitmap mBitmap = null;//声明Bitmap对象  
  3.     private int x  = 300;  
  4.     private int y = 100;  
  5.     //private float angleA = 0.0f;//声明轴心A转动  
  6.     private float angleB = 0.0f;//声明轴心B转动角度  
  7.     private Matrix mMatrix = new Matrix();//构建矩阵Matrix对象  
  8.     public BeadplateMiddle(Context context) {  
  9.         super(context);  
  10.         //装载资源  
  11.         mBitmap =((BitmapDrawable) getResources().getDrawable(R.drawable.bedplate)).getBitmap();      
  12.         //开启线程  
  13.         new Thread(new DrawThread()).start();  
  14.     }  
  15.     //系统IOC开始绘制  
  16.     @Override  
  17.     protected void onDraw(Canvas canvas) {  
  18.         super.onDraw(canvas);  
  19.         Paint mPaint = new Paint();  
  20.         mPaint.setColor(Color.RED);  
  21.         mPaint.setAntiAlias(true);  
  22.         canvas.drawCircle(x, y, 12, mPaint);  
  23.         mMatrix = getMyMatrix(mMatrix,angleB, x, y);  
  24.         canvas.drawBitmap(mBitmap, mMatrix, null);  
  25.     }  
  26.     /** 
  27.      * 动态构建旋转矩阵Matrix对象 
  28.      * @param matrix  需要计算的矩阵 
  29.      * @param canvas  画布 
  30.      * @param degrees 图片旋转的角度,正值为顺时针,负值为逆时针 
  31.      * @param pivotX  轴心的X坐标 
  32.      * @param pivotY  轴心的Y坐标 
  33.      */  
  34.     private Matrix getMyMatrix(Matrix matrix ,float degrees,int pivotX , int pivotY ){  
  35.         //重置Matrix  
  36.         matrix.reset();  
  37.         float cosValue = (float) Math.cos(Math.PI/(180/degrees));    
  38.         float sinValue = (float) Math.sin(Math.PI/(180/degrees));    
  39.         //设置旋转矩阵值  
  40.         matrix.setValues(    
  41.                 new float[]{    
  42.                         cosValue, -sinValue, pivotX,    
  43.                         sinValue, cosValue, pivotY,    
  44.                         001});   
  45.         return matrix;  
  46.     }  
  47.     @Override  
  48.     public boolean onKeyDown(int keyCode, KeyEvent event) {  
  49.         if(keyCode == KeyEvent.KEYCODE_DPAD_LEFT){  
  50.             x --;  
  51.         }else if(keyCode == KeyEvent.KEYCODE_DPAD_RIGHT){  
  52.             x ++;  
  53.         }else if(keyCode == KeyEvent.KEYCODE_DPAD_UP){  
  54.             y --;  
  55.         }else if(keyCode == KeyEvent.KEYCODE_DPAD_DOWN){  
  56.             y ++;  
  57.         }else if(keyCode == KeyEvent.KEYCODE_DPAD_CENTER){  
  58.             angleB ++;  
  59.         }  
  60.         return true;  
  61.     }  
  62.     private class DrawThread implements Runnable{  
  63.         @Override  
  64.         public void run() {  
  65.             while(!Thread.currentThread().isInterrupted()){  
  66.                 try {  
  67.                     Thread.sleep(500);  
  68.                 } catch (Exception e) {  
  69.                     Thread.currentThread().interrupt();  
  70.                 }  
  71.                 //使用PostInvalidate可以直接在线程中更新视图  
  72.                 postInvalidate();  
  73.             }  
  74.         }  
  75.     }   
  76. }  
 
2
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:260839次
    • 积分:4078
    • 等级:
    • 排名:第7885名
    • 原创:121篇
    • 转载:166篇
    • 译文:0篇
    • 评论:19条
    文章分类
    最新评论