`
chroya
  • 浏览: 656321 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Android画图之Matrix(二)

阅读更多

      上一篇Android画图之Matrix(一) 讲了一下Matrix的原理和运算方法,涉及到高等数学,有点难以理解。还好Android里面提供了对Matrix操作的一系

列方便的接口。


    Matrix的操作,总共分为translate(平移),rotate(旋转),scale(缩放)和skew(倾斜)四种,每一种变换在

Android的API里都提供了set, post和pre三种操作方式,除了translate,其他三种操作都可以指定中心点。


    set是直接设置Matrix的值,每次set一次,整个Matrix的数组都会变掉。


    post是后乘,当前的矩阵乘以参数给出的矩阵。可以连续多次使用post,来完成所需的整个变换。例如,要将一个图片旋
转30度,然后平移到(100,100)的地方,那么可以这样做:

Matrix m = new Matrix();

m.postRotate(30);

m.postTranslate(100, 100);  
 

 

这样就达到了想要的效果。


    pre是前乘,参数给出的矩阵乘以当前的矩阵。所以操作是在当前矩阵的最前面发生的。例如上面的例子,如果用pre的话

,就要这样:

Matrix m = new Matrix();

m.setTranslate(100, 100);

m.preRotate(30);

    旋转、缩放和倾斜都可以围绕一个中心点来进行,如果不指定,默认情况下,是围绕(0,0)点来进行。


    下面给出一个例子。

package chroya.demo.graphics;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.View;

public class MyView extends View {
	
	private Bitmap mBitmap;
	private Matrix mMatrix = new Matrix();
	
	public MyView(Context context) {
		super(context);
		initialize();
	}

	private void initialize() {
		
		Bitmap bmp = ((BitmapDrawable)getResources().getDrawable(R.drawable.show)).getBitmap();
		mBitmap = bmp;
		/*首先,将缩放为100*100。这里scale的参数是比例。有一点要注意,如果直接用100/
bmp.getWidth()的话,会得到0,因为是整型相除,所以必须其中有一个是float型的,直接用100f就好。*/
		mMatrix.setScale(100f/bmp.getWidth(), 100f/bmp.getHeight());
                //平移到(100,100)处
		mMatrix.postTranslate(100, 100);
                //倾斜x和y轴,以(100,100)为中心。
		mMatrix.postSkew(0.2f, 0.2f, 100, 100);
	}
	
	@Override protected void onDraw(Canvas canvas) {
//		super.onDraw(canvas);  //如果界面上还有其他元素需要绘制,只需要将这句话写上就行了。
		
		canvas.drawBitmap(mBitmap, mMatrix, null);
	}
}

 运行效果如下:

    红色的x和y表示倾斜的角度,下面是x,上面是y。看到了没,Matrix就这么简单

分享到:
评论
19 楼 mmaa1383061 2011-10-28  
谢谢博主,终于明白点了。感激!
18 楼 542891879 2010-11-29  
讲述的比第一个易懂多了,基本的已经会了,等待发现稍难的问题
17 楼 ET焖猪仔 2010-10-27  
<div class="quote_title">chroya 写道</div>
<div class="quote_div">
<p>      <span style="font-size: small;">上一篇<a title="Android画图之Matrix(一)" href="/blog/712078" target="_blank">Android画图之Matrix(一)</a>
讲了一下Matrix的原理和运算方法,涉及到高等数学,有点难以理解。还好Android里面提供了对Matrix操作的一系<br><br>
列方便的接口。</span>
</p>
<p><span style="font-size: small;"><br>
    Matrix的操作,总共分为translate(平移),rotate(旋转),scale(缩放)和skew(倾斜)四种,每一种变换在<br><br>
Android的API里都提供了set, post和pre三种操作方式,除了translate,其他三种操作都可以指定中心点。</span>
</p>
<p><span style="font-size: small;"><br>
    set是直接设置Matrix的值,每次set一次,整个Matrix的数组都会变掉。</span>
</p>
<p><span style="font-size: small;"><br>
    post是后乘,当前的矩阵乘以参数给出的矩阵。可以连续多次使用post,来完成所需的整个变换。例如,要将一个图片旋<br>
转30度,然后平移到(100,100)的地方,那么可以这样做:</span>
</p>
<pre name="code" class="java">Matrix m = new Matrix();

m.postRotate(30);

m.postTranslate(100, 100);  </pre>
 
<p> </p>
<p><span style="font-size: small;">这样就达到了想要的效果。</span>
</p>
<p><span style="font-size: small;"><br>
    pre是前乘,参数给出的矩阵乘以当前的矩阵。所以操作是在当前矩阵的最前面发生的。例如上面的例子,如果用pre的话<br><br>
,就要这样:</span>
</p>
<pre name="code" class="java">Matrix m = new Matrix();

m.setTranslate(100, 100);

m.preRotate(30);</pre>
<p><span style="font-size: small;">    旋转、缩放和倾斜都可以围绕一个中心点来进行,如果不指定,默认情况下,是围绕(0,0)点来进行。</span>
</p>
<p><span style="font-size: small;"><br></span>
</p>
<p><span style="font-size: small;">    下面给出一个例子。</span>
</p>
<pre name="code" class="java">package chroya.demo.graphics;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.View;

public class MyView extends View {

private Bitmap mBitmap;
private Matrix mMatrix = new Matrix();

public MyView(Context context) {
super(context);
initialize();
}

private void initialize() {

Bitmap bmp = ((BitmapDrawable)getResources().getDrawable(R.drawable.show)).getBitmap();
mBitmap = bmp;
/*首先,将缩放为100*100。这里scale的参数是比例。有一点要注意,如果直接用100/
bmp.getWidth()的话,会得到0,因为是整型相除,所以必须其中有一个是float型的,直接用100f就好。*/
mMatrix.setScale(100f/bmp.getWidth(), 100f/bmp.getHeight());
                //平移到(100,100)处
mMatrix.postTranslate(100, 100);
                //倾斜x和y轴,以(100,100)为中心。
mMatrix.postSkew(0.2f, 0.2f, 100, 100);
}

@Override protected void onDraw(Canvas canvas) {
// super.onDraw(canvas);  //如果界面上还有其他元素需要绘制,只需要将这句话写上就行了。

canvas.drawBitmap(mBitmap, mMatrix, null);
}
}
</pre>
<p><span style="font-size: small;"> 运行效果如下:</span>
</p>
<p><img src="http://dl.iteye.com/upload/picture/pic/67113/97592104-ff32-3944-8390-2ae13aaf46ac.png" alt=""></p>
<p> <span style="font-size: small;">   红色的x和y表示倾斜的角度,下面是x,上面是y。看到了没,Matrix就这么简单</span>
。</p>
</div>
<p> </p>
16 楼 lidhsr 2010-09-26  
水平镜像??
15 楼 chroya 2010-09-26  
wenyufamily 写道
这样使用速度是不是很慢啊?我按着你的方法画图,但是速度很慢!有没有什么解决的方法?谢谢

不知道你什么情况,一般来说这样画图对于大部分情况都足够了。如果是游戏这样的需要一直更新画面的情况,就需要用surfaceview了,速度会快些。
14 楼 wenyufamily 2010-09-26  
这样使用速度是不是很慢啊?我按着你的方法画图,但是速度很慢!有没有什么解决的方法?谢谢
13 楼 xtcpcgx 2010-08-29  
谢谢了楼主,正需要了解Android里的多点触摸方面的知识。
12 楼 chroya 2010-08-13  
hesiming 写道
请教楼主~~
final Matrix matrix = t.getMatrix();
matrix.preTranslate(-centerX, -centerY);
matrix.postTranslate(centerX, centerY);

centerX/centerY是自定义的数值

上面的matrix后面的两个方法到是什么意思~~实在是搞不懂麻烦


//从t中获取一个Matrix对象
final Matrix matrix = t.getMatrix();
//在这个matrix操作序列之前,加一个平移操作
matrix.preTranslate(-centerX, -centerY);
//在这个matrix操作序列之后,加一个平移操作
matrix.postTranslate(centerX, centerY);
11 楼 hesiming 2010-08-13  
请教楼主~~
final Matrix matrix = t.getMatrix();
matrix.preTranslate(-centerX, -centerY);
matrix.postTranslate(centerX, centerY);

centerX/centerY是自定义的数值

上面的matrix后面的两个方法到是什么意思~~实在是搞不懂麻烦
10 楼 chroya 2010-08-12  
Ashfrog 写道
这里的乘是什么概念呢···?
貌似不像是数学里面的乘···
而是表示一种操作,请问是不是这个意思···?

这里的乘,在数学里是矩阵相乘,在图像处理里面是缩放、平移、旋转等操作。
9 楼 Ashfrog 2010-08-11  
这里的乘是什么概念呢···?
貌似不像是数学里面的乘···
而是表示一种操作,请问是不是这个意思···?
8 楼 heji 2010-07-23  
chroya 写道
heji 写道
楼主,能详细说一下前乘和后乘的区别么??不是很理解,我觉得怎么做都可以啊

其实文中已经说过的,比如,如果要实现这个功能:先做rotate,然后做translate,那么,用前乘的方式,如下
Matrix m = new Matrix();
m.setTranslate(100, 100);
m.preRotate(30); //前乘

用普通的方式,如下
Matrix m = new Matrix();
m.postRotate(30);
m.postTranslate(100, 100);  //后乘

达到的效果是一样的。

我是说没区别嘛!汗!还有就是你说的这个前乘和后乘,两个矩阵相乘顺序不一样结果不一样的,不知道你说的是不是这个意思~~
7 楼 chroya 2010-07-23  
heji 写道
楼主,能详细说一下前乘和后乘的区别么??不是很理解,我觉得怎么做都可以啊

其实文中已经说过的,比如,如果要实现这个功能:先做rotate,然后做translate,那么,用前乘的方式,如下
Matrix m = new Matrix();
m.setTranslate(100, 100);
m.preRotate(30); //前乘

用普通的方式,如下
Matrix m = new Matrix();
m.postRotate(30);
m.postTranslate(100, 100);  //后乘

达到的效果是一样的。
6 楼 heji 2010-07-23  
楼主,能详细说一下前乘和后乘的区别么??不是很理解,我觉得怎么做都可以啊
5 楼 healthjava 2010-07-21  

多谢多谢。

chroya 写道
jiangduxi 写道
Android镜像翻转效果如何??

matrix.setScale(1, -1)就可以实现镜像,效果如下:

4 楼 chroya 2010-07-20  
jiangduxi 写道
Android镜像翻转效果如何??

matrix.setScale(1, -1)就可以实现镜像,效果如下:
3 楼 jiangduxi 2010-07-19  
Android镜像翻转效果如何??
2 楼 healthjava 2010-07-19  
请问一下,镜像翻转一个图片,该怎么实现,如果可以的话,能不能贴代码。谢谢。
1 楼 luobo25 2010-07-17  
谢谢介绍,学习了

相关推荐

    Android画图之Matrix剖析

    Android画图之Matrix剖析Android画图之Matrix剖析Android画图之Matrix剖析Android画图之Matrix剖析Android画图之Matrix剖析Android画图之Matrix剖析Android画图之Matrix剖析

    Android画图之Matrix

    android绘图中Matrix的使用

    android界面效果全汇总

    (一)Activity页面切换的效果 (二)android菜单动画 android 布局属性 android 翻页 Android画图之Matrix(一) Android中的样式和主题 Android中的样式和主题

    android 画板,白板,画图

    import module 即可使用,可涂鸦、绘图、添加文字、图像(可旋转缩放)、背景的Fragment,其中主要由SketchView利用matrix完成所有图形绘制操作。

    Android编程画图之抗锯齿解决方法

    本文实例分析了Android编程画图之抗锯齿解决方法。分享给大家供大家参考,具体如下: 在画图的时候,图片如果旋转或缩放之后,总是会出现那些华丽的锯齿。其实Android自带了解决方式。 方法一:给Paint加上抗锯齿...

    Android绘图机制与处理技巧(三)——Android图像处理之图形特效处理

    Android绘图机制与处理技巧(三)——Android图像处理之图形特效处理

    Android画图之抗锯齿paint和Canvas两种方式实例

    在画图的时候,图片如果旋转或缩放之后,总是会出现那些华丽的锯齿。其实Android自带了解决方式。 方法一:给Paint加上抗锯齿标志。然后将Paint对象作为参数传给canvas的绘制方法。 paint.setAntiAlias(true); ...

    Google Android SDK开发范例大全(PDF高清完整版1)(4-1)

    10.2 GPS轨迹记录器——利用LocationListener在地图上画图并换算距离 10.3 女性贴身看护——AlarmManager.DatePicker.TimePicker 10.4 手机QRCode二维条形码生成器——Canvas与SurfaceHolder绘图 10.5 AndroidQRCode...

    Google Android SDK开发范例大全(PDF完整版4)(4-4)

    10.2 GPS轨迹记录器——利用LocationListener在地图上画图并换算距离 10.3 女性贴身看护——AlarmManager.DatePicker.TimePicker 10.4 手机QRCode二维条形码生成器——Canvas与SurfaceHolder绘图 10.5 AndroidQRCode...

    Google Android SDK开发范例大全(PDF高清完整版3)(4-3)

    10.2 GPS轨迹记录器——利用LocationListener在地图上画图并换算距离 10.3 女性贴身看护——AlarmManager.DatePicker.TimePicker 10.4 手机QRCode二维条形码生成器——Canvas与SurfaceHolder绘图 10.5 AndroidQRCode...

    Google Android SDK开发范例大全的目录

    10.2 GPS轨迹记录器——利用LocationListener在地图上画图并换算距离 10.3 女性贴身看护——AlarmManager.DatePicker.TimePicker 10.4 手机QRCode二维条形码生成器——Canvas与SurfaceHolder绘图 10.5 AndroidQRCode...

    Google Android SDK开发范例大全(完整版附部分源码).pdf

    10.2 GPS轨迹记录器——利用LocationListener在地图上画图并换算距离 10.3 女性贴身看护——AlarmManager.DatePicker.TimePicker 10.4 手机QRCode二维条形码生成器——Canvas与SurfaceHolder绘图 10.5 ...

    Google Android SDK 开发范例大全01

    10.2 GPS轨迹记录器——利用LocationListener在地图上画图并换算距离 10.3 女性贴身看护——AlarmManager.DatePicker.TimePicker 10.4 手机QRCode二维条形码生成器——Canvas与SurfaceHolder绘图 10.5 AndroidQRCode...

    Google Android SDK 开发范例大全02

    10.2 GPS轨迹记录器——利用LocationListener在地图上画图并换算距离 10.3 女性贴身看护——AlarmManager.DatePicker.TimePicker 10.4 手机QRCode二维条形码生成器——Canvas与SurfaceHolder绘图 10.5 AndroidQRCode...

    Google+Android+SDK开发范例大全

    创意Android程序设计 10.1 手机手电筒——PowerManager控制WakeLock并改变手机亮度 10.2 GPS轨迹记录器——利用LocationListener在地图上画图并换算距离 10.3 女性贴身看护——AlarmManager.DatePicker.TimePicker ...

    Google Android sdk 开发范例大全 部分章节代码

    10.2 GPS轨迹记录器——利用LocationListener在地图上画图并换算距离 10.3 女性贴身看护——AlarmManager.DatePicker.TimePicker 10.4 手机QRCode二维条形码生成器——Canvas与SurfaceHolder绘图 10.5 AndroidQRCode...

    Google Android SDK开发范例大全(完整版)

    10.2 GPS轨迹记录器——利用LocationListener在地图上画图并换算距离 10.3 女性贴身看护——AlarmManager.DatePicker.TimePicker 10.4 手机QRCode二维条形码生成器——Canvas与SurfaceHolder绘图 10.5 AndroidQRCode...

Global site tag (gtag.js) - Google Analytics