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

转载 2012年03月28日 14:13:26

这篇文章主要用于本人查阅资料所写。如果对你也有所帮助,那么也请你可以把更多更好的作品分享给所有开发人员,大家共同学习进步。再次,很感谢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. }  
 

Android中轴旋转特效实现,制作别样的图片浏览器

Android API Demos中有很多非常Nice的例子,这些例子的代码都写的很出色,如果大家把API Demos中的每个例子研究透了,那么恭喜你已经成为一个真正的Android高手了。这也算是给...
  • dzc372787439
  • dzc372787439
  • 2015年03月17日 16:35
  • 613

Android中轴旋转特效实现,制作别样的图片浏览器

Android API Demos中有很多非常Nice的例子,这些例子的代码都写的很出色,如果大家把API Demos中的每个例子研究透了,那么恭喜你已经成为一个真正的Android高手了。这也算是给...
  • sinyu890807
  • sinyu890807
  • 2013年09月22日 08:30
  • 38834

Android中轴旋转特效实现,几张图片自动切换

几张图片以3D立体旋转的效果进行切换(此例由此处参考而来:public class MainActivity extends Activity { private LinearLayout l...
  • baidu_32731497
  • baidu_32731497
  • 2016年02月26日 22:24
  • 1501

android animation应用——图片绕固定点旋转

一、功能:实现将图片绕固定点旋转,圈数随机,onTouch后旋转。 二、程序框架: 组成 功能 主Activity:MyActivity 1.实现animation ...
  • chjr1000
  • chjr1000
  • 2014年12月09日 14:45
  • 6424

android 围绕中心旋转动画

1、定义一个ImageView 定义一个ImageView是为了装载图片,其中的图片将被rotate用来进行旋转,其他View亦可。 资源文件为 Java代码 ...
  • u010968028
  • u010968028
  • 2014年09月03日 16:08
  • 1687

android中手势操作图片的平移、缩放、旋转

转自:http://blog.csdn.net/happy_bug/article/details/7895244
  • gf771115
  • gf771115
  • 2014年11月06日 21:22
  • 3858

Android 根据角度旋转图片

在Android开发过程中,几乎每个应用都会或多或少的涉及到对图片的处理。经常遇到的一个情况就是,取得的图片是横着的,而实际需要的图片是正着的,也就是竖着的。这里就涉及到对图片横坚情况的判断,也就是图...
  • eastman520
  • eastman520
  • 2014年01月24日 14:40
  • 18132

android 图片旋转实现的两种方法的比较

图片旋转的方法有两种(旋转ImageView所在布局暂不考虑),这两种分别是动画和使用Matrix(齐次变换矩阵)。 我们想要达到的目标是旋转长图(非正方形),甚至长宽比例很夸张那种。想达到的效果是...
  • nmyangmo
  • nmyangmo
  • 2017年06月20日 19:11
  • 614

android中图片压缩以及图片旋转的方法

在开发中,如果需要上传图片到服务器中,而且还需要在本地预览,就会用到图片的压缩: /** * 计算图片的缩放值 * * @param options * @param reqWi...
  • xiaorenwu1206
  • xiaorenwu1206
  • 2014年12月08日 14:40
  • 3907

android图片处理:让图片一直匀速旋转

让图片匀速旋转
  • dl10210950
  • dl10210950
  • 2016年08月10日 20:19
  • 10848
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android动态绕可移动轴心旋转图片
举报原因:
原因补充:

(最多只允许输入30个字)