- 浏览: 656321 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
ZHOU452840622:
少了一个构造函数 晕
Android画图之Matrix(一) -
ZHOU452840622:
06-30 17:39:19.193: E/AndroidRu ...
Android画图之Matrix(一) -
ZHOU452840622:
为什么报错哦
Android画图之Matrix(一) -
悬空90:
只是获取activity的名字而已, 没有实例。 反射 ...
获取屏幕上正在显示的activity -
night_iv:
重写下面两个函数EditText完全作废,点击没有反应没有光标 ...
Android自由选择TextView的文字
上一篇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>
<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后面的两个方法到是什么意思~~实在是搞不懂麻烦
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后面的两个方法到是什么意思~~实在是搞不懂麻烦
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 NFC内部机制分析
2012-08-06 19:48 3一、初始 一般需要使用nfc ... -
Android NFC简介
2012-08-03 11:31 4281目录: Android NFC ... -
Android放大镜的实现
2011-02-24 20:29 14232快三个月了没写博客了,因为工作调动,很多经验、心得都没 ... -
Android简单的圆盘形菜单
2010-12-01 17:10 15389今天偶然看到一个圆盘形的菜单,还可以转动,感觉挺 ... -
Android的3D旋转
2010-11-29 12:27 23097见过没有用opengl的3D动画,看了一下,是 ... -
让自己的Android应用支持appwidget
2010-11-26 13:25 7757经常看到一些教程教你如何写appwidget, ... -
ConditionVariable的用法
2010-11-07 21:35 8658线程操作经常用到wait和notify,用起来稍显 ... -
Android自定义长按事件
2010-11-06 20:34 44595Android系统自带了长按事件,setOnLongC ... -
Android获取应用程序的大小
2010-10-22 23:53 11193今天碰到个问 ... -
Android获取其他包的Context实例然后干坏事
2010-09-12 14:55 25062Android中有Context ... -
android监听文件和目录的创建删除移动等事件
2010-09-11 21:18 13617android.os下的FileObserver类 ... -
解决android自定义标题栏充满的问题
2010-09-10 15:27 10752一个接着一个的activity,写啊写,调啊调 ... -
Android中用AsyncTask简单实现多线程
2010-09-07 14:11 5170一般情况下在an ... -
Android自由选择TextView的文字
2010-09-02 15:47 19234用过EditText的都 ... -
NDK入门、提高和实战
2010-08-04 18:25 3252网上也有一些对NDK ... -
linux下用adb连接手机的问题解决
2010-08-02 16:17 5979在linux里面,模拟器可以直接识别,使用adb也 ... -
Android系统事件的recycle原理
2010-07-22 19:07 6213最近封装一些功能 ... -
Android画图之Matrix(一)
2010-07-13 22:54 32805Matrix ,中文里叫矩阵, ... -
Android画图之Bitmap(二)
2010-07-11 22:21 10764前面一篇博文Android画图之Bitma ... -
Android画图之Bitmap(一)
2010-07-11 19:51 15621最近写电子书 ...
相关推荐
Android画图之Matrix剖析Android画图之Matrix剖析Android画图之Matrix剖析Android画图之Matrix剖析Android画图之Matrix剖析Android画图之Matrix剖析Android画图之Matrix剖析
android绘图中Matrix的使用
(一)Activity页面切换的效果 (二)android菜单动画 android 布局属性 android 翻页 Android画图之Matrix(一) Android中的样式和主题 Android中的样式和主题
import module 即可使用,可涂鸦、绘图、添加文字、图像(可旋转缩放)、背景的Fragment,其中主要由SketchView利用matrix完成所有图形绘制操作。
本文实例分析了Android编程画图之抗锯齿解决方法。分享给大家供大家参考,具体如下: 在画图的时候,图片如果旋转或缩放之后,总是会出现那些华丽的锯齿。其实Android自带了解决方式。 方法一:给Paint加上抗锯齿...
Android绘图机制与处理技巧(三)——Android图像处理之图形特效处理
在画图的时候,图片如果旋转或缩放之后,总是会出现那些华丽的锯齿。其实Android自带了解决方式。 方法一:给Paint加上抗锯齿标志。然后将Paint对象作为参数传给canvas的绘制方法。 paint.setAntiAlias(true); ...
10.2 GPS轨迹记录器——利用LocationListener在地图上画图并换算距离 10.3 女性贴身看护——AlarmManager.DatePicker.TimePicker 10.4 手机QRCode二维条形码生成器——Canvas与SurfaceHolder绘图 10.5 AndroidQRCode...
10.2 GPS轨迹记录器——利用LocationListener在地图上画图并换算距离 10.3 女性贴身看护——AlarmManager.DatePicker.TimePicker 10.4 手机QRCode二维条形码生成器——Canvas与SurfaceHolder绘图 10.5 AndroidQRCode...
10.2 GPS轨迹记录器——利用LocationListener在地图上画图并换算距离 10.3 女性贴身看护——AlarmManager.DatePicker.TimePicker 10.4 手机QRCode二维条形码生成器——Canvas与SurfaceHolder绘图 10.5 AndroidQRCode...
10.2 GPS轨迹记录器——利用LocationListener在地图上画图并换算距离 10.3 女性贴身看护——AlarmManager.DatePicker.TimePicker 10.4 手机QRCode二维条形码生成器——Canvas与SurfaceHolder绘图 10.5 AndroidQRCode...
10.2 GPS轨迹记录器——利用LocationListener在地图上画图并换算距离 10.3 女性贴身看护——AlarmManager.DatePicker.TimePicker 10.4 手机QRCode二维条形码生成器——Canvas与SurfaceHolder绘图 10.5 ...
10.2 GPS轨迹记录器——利用LocationListener在地图上画图并换算距离 10.3 女性贴身看护——AlarmManager.DatePicker.TimePicker 10.4 手机QRCode二维条形码生成器——Canvas与SurfaceHolder绘图 10.5 AndroidQRCode...
10.2 GPS轨迹记录器——利用LocationListener在地图上画图并换算距离 10.3 女性贴身看护——AlarmManager.DatePicker.TimePicker 10.4 手机QRCode二维条形码生成器——Canvas与SurfaceHolder绘图 10.5 AndroidQRCode...
创意Android程序设计 10.1 手机手电筒——PowerManager控制WakeLock并改变手机亮度 10.2 GPS轨迹记录器——利用LocationListener在地图上画图并换算距离 10.3 女性贴身看护——AlarmManager.DatePicker.TimePicker ...
10.2 GPS轨迹记录器——利用LocationListener在地图上画图并换算距离 10.3 女性贴身看护——AlarmManager.DatePicker.TimePicker 10.4 手机QRCode二维条形码生成器——Canvas与SurfaceHolder绘图 10.5 AndroidQRCode...
10.2 GPS轨迹记录器——利用LocationListener在地图上画图并换算距离 10.3 女性贴身看护——AlarmManager.DatePicker.TimePicker 10.4 手机QRCode二维条形码生成器——Canvas与SurfaceHolder绘图 10.5 AndroidQRCode...