以下所自行找到资料,如有抄作请尽量
Android 使用Matrix进行图像变换
对图像的变换操作有translate(平移),rotate(旋转),scale(缩放)和skew(倾斜)四种。Android里面的Matrix(android.graphics.Matrix,不 是opgl.Matrix)提供了对应的四种操作的操作方法。其中对应每种操作都有三种接口setXX, preXX,postXX。setXX将使整个 matrix的值为设置的值。preXX是将新的变换矩阵左乘原来的矩阵,而postXX是将新的变换矩阵右乘原来的变换矩阵。preXX的操作将在所有 当前操作最后执行,而postXX的操作将在所有当前操作的最后执行。(这是因为设对给定的图像依次进行了基本变化F1、F2、F3…..、Fn,它们的变化矩阵分别为T1、T2、T3…..、Tn,图像复合变化的矩阵T可以表示为:T = TnTn-1…T1。)
下面介绍几个基本函数的用法:
setRotate(float degrees) :直接使图片旋转一定的角度,负数为向左旋转,正数为向右旋转。
setTranslate(float dx, float dy) 使图片平移
setScale(float sx, float sy) 使图片缩放
setSkew(float kx, float ky) 使图片倾斜
setRotate(float degrees, float px, float py) 使图片以某一点为中心旋转
reset() 是矩阵变为单位矩阵,即图片保持不变
对应上述的所有函数,都有相应的preXX和postXX版本,它们所对应的功能如上所述。下面是一个简单的例子。
setRotate(30,a,b)的功能是将图片以(a,b)为中心向右旋转30°。
下面可以用preXX来完成相应的功能:
matrix.setTranslate(a,b);
matrix.preRotate(30);
matrix.preTranslate(-a,-b);
从意义上来说可以理解为将图片平移(-a,-b),然后向右旋转30°,最后再将旋转后的图片平移(a,b)即可完成将图片以(a,b)向右旋转30°的功能。
eg:
坐标变换矩阵是一个3*3的矩阵如图2.1,用来对图形进行坐标变化,将原来的坐标点转移到新的坐标点,
因为一个图片是有点阵和每一点上的颜色信息组成的,所以对坐标的变换,就是对每一点进行搬移形成新的图片。
具体的说图形的放大缩小,移动,旋转,透视,扭曲这些效果都可以用此矩阵来完成。
这个矩阵的作用是对坐标x,y进行变换计算结果如下:
x'=a*x+b*y+c
y'=d*x+e*y+f
通常情况下g=h=0,这样使1=0*x+0*y+1恒成立。和颜色矩阵一样,坐标变换矩阵真正使用的参数很少也很有规律。
上图就是一个坐标变换矩阵的简单例子,计算后发现x'=x+50,y'=y+50.
可见图片的每一点都在x和y方向上平移到了(50,50)点处,这种效果就是平移效果,将图片转移到了(50,50)处。
计算上面得矩阵x'=2*x,y‘=2*y.经过颜色矩阵和上面转移效果学习,相信读者可以明白这个矩阵的作用了,这个矩阵对图片进行了放大,具体的说是放大了二倍。
下面将介绍几种常用的变换矩阵:
1. 旋转
绕原点逆时针旋转θ度角的变换公式是 x' = xcosθ − ysinθ 与 y。' = xsinθ + ycosθ
2. 缩放
变换后长宽分别放大x'=scale*x;y'=scale*y.
3. 切变
4. 反射
( , )单位向量
5. 正投影
( , )单位向量
上面的各种效果也可以叠加在一起,既矩阵的组合变换,可以用矩阵乘法实现之,如:R=B(A*C)=(B*A)C,注意一点就是B*A和A*B一般是不等的。
下面将编一个小程序,通过控制坐标变换矩阵来达到控制图形的目的,JavaCode如下:
复制到剪贴板 Java代码
2
3publicclass CooMatrix extends Activity {
4
5private Button change;
6private EditText [] et=new EditText[9];
7privatefloat []carray=newfloat[9];
8private MyImage sv;
9/** Called when the activity is first created. */
10 @Override
11publicvoid onCreate(Bundle savedInstanceState) {
12super.onCreate(savedInstanceState);
13 setContentView(R.layout.main);
14
15 change=(Button)findViewById(R.id.set);
16 sv=(MyImage)findViewById(R.id.MyImage);
17
18for(int i=0;i<9;i++){
19
20 et[i]=(EditText)findViewById(R.id.indexa+i);
21 carray[i]=Float.valueOf(et[i].getText().toString());
22
23 }
24
25 change.setOnClickListener(l);
26
27
28 }
29
30private Button.OnClickListener l=new Button.OnClickListener(){
31
32 @Override
33publicvoid onClick(View arg0) {
34// TODO Auto-generated method stub
35 getValues();
36 sv.setValues(carray);
37 sv.invalidate();
38 }
39
40 };
41publicvoid getValues(){
42for(int i=0;i<9;i++){
43
44 carray[i]=Float.valueOf(et[i].getText().toString());
45 }
46
47 }
48
49
50}
51MyImage类继承自View类:
52publicclass MyImage extends View {
53private Paint mPaint =new Paint(Paint.ANTI_ALIAS_FLAG);
54private Bitmap mBitmap;
55privatefloat [] array=newfloat[9];
56
57
58
59public MyImage(Context context,AttributeSet attrs) {
60super(context,attrs);
61
62 mBitmap = BitmapFactory.decodeResource(context.getResources(),
63 R.drawable.ic_launcher_android);
64 invalidate();
65 }
66
67
68publicvoid setValues(float [] a){
69for(int i=0;i<9;i++){
70 array[i]=a[i];
71 }
72
73 }
74
75 @Override protectedvoid onDraw(Canvas canvas) {
76 Paint paint = mPaint;
77 canvas.drawBitmap(mBitmap, 0, 0, paint);
78//new 一个坐标变换矩阵
79 Matrix cm =new Matrix();
80//为坐标变换矩阵设置响应的值
81 cm.setValues(array);
82//按照坐标变换矩阵的描述绘图
83 canvas.drawBitmap(mBitmap, cm, paint);
84 Log.i("CMatrix", "--------->onDraw");
85
86
87 }
88
89
上面的代码中类CooMatrix用于接收用户输入的坐标变换矩阵参数,类MyImage接收参数,通过setValues()设置矩阵参数,然后Canvas调用drawBitmap绘图。效果如下:
上面给出了用坐标变换矩阵做出的各种效果,用坐标变换矩阵可以方面的调节图形的各种效果,
但是我们看看Matrix类就可以发现,实际上,matrix类本身已经提供了许多类似的方法,我们只要调用,就可以了。
setScale(float sx, float sy, float px, float py) 放大
setSkew(float kx, float ky, float px, float py) 斜切
setTranslate(float dx, float dy) 平移
setRotate(float degrees, float px, float py) 旋转
上面的函数提供了基本的变换平移,放大,旋转,斜切。为了做出更复杂的变换,同时不必亲手去改动坐标变换矩阵,
Matrix类提供了许多Map方法,将原图形映射到目标点构成新的图形,
下面简述setPolyToPoly(float[] src, int srcIndex, float[] dst, int dstIndex, int pointCount) 的用法,希望起到举一反三的作用。
参数src和dst是分别存储了原图像的点和和指定的目标点的一维数组,数组中存储的坐标格式如下:
[x0, y0, x1, y1, x2,y2,...]
这个个函数将src中的坐标映射到dst中的坐标,实现图像的变换。
具体的例子可以参考APIDemos里的PolyToPoly,我在这里就不再贴代码了,只讲一下函数是怎么变换图片的。下面是效果:
图中写1的是原图,写有2,3,4的是变换后的图形。现在分析2是怎么变换来的,变换的原坐标点和目的坐标点如下:
src=new float[] { 32, 32, 64, 32 }
dst=new float[] { 32, 32, 64, 48 }
从 上图标示出的坐标看出原图的(32,32)映射到原图的(32,32),(64,32)映射到原图(64,48)这样的效果是图像放大了而且发生了旋转。 这样的过程相当于(32,32)点不动,然后拉住图形(64,32)点并拉到(64,48)点处,这样图形必然会被拉伸放大并且发生旋转。最后用一个平移 将图形移动到右边现在的位置。希望能够好好理解这一过程,下面的3,4图是同样的道理。
相关推荐
在`Sliding3DLayout`的代码中,我们需要监听滑动事件,当用户触摸屏幕并滑动时,根据滑动的距离计算出旋转的角度,然后使用`Camera`和`Matrix`进行视图的3D旋转。这里涉及到的关键方法包括`Camera.save()`、`Camera....
为了实现3D效果,可能还需要结合`Matrix`类进行矩阵变换。 3. **3D效果**:在Android中,我们可以使用`Camera`类和`Canvas`的`save()`、`translate()`、`rotate()`、`scale()`和`restore()`方法来创建简单的3D效果...
这里使用`Transformation`对象来存储变换矩阵,设置其类型为`Transformation.TYPE_MATRIX`,表示我们将使用矩阵来实现视图的变换。 在计算旋转角度后,可以使用`Camera`的`rotateY()`方法来生成旋转矩阵,并将其...
在"MatrixDemo"中,开发者可能使用Matrix对ViewGroup中的子View进行3D变换,通过设置Matrix的不同参数,可以实现各种复杂的视觉效果。例如,通过调用`postTranslate()`进行平移,`postRotate()`进行旋转,`postScale...
使用`Camera`和`Matrix`类可以辅助完成3D变换,通过调整相机的位置和角度,使页面在滑动时产生立体的翻转效果。 为了支持Android 4.0(API级别14)及以上版本,我们需要确保使用的API兼容性。在Android SDK中,`...
为此,我们可以先隐藏真实的菜单,创建一个菜单视图的镜像并将其转化为Bitmap,然后在滑动过程中利用Matrix和Camera类对Bitmap进行3D变换,模拟出推拉门的开合效果。当滑动操作停止时,再显示真实的菜单,并隐藏3D...
在Android中,我们可以使用`Camera`类和`Matrix`类来处理3D变换。我们可以创建一个自定义的CardView扩展类,重写`onDraw()`方法,在其中应用3D变换。 以下是一个简单的示例代码片段,展示了如何在自定义CardView中...
5. **动画效果**:为了使图片放大缩小和移动更加平滑,可以使用Android的动画系统,比如`ValueAnimator`或`ObjectAnimator`。它们能够按照指定的时间曲线执行动画,为用户提供更好的交互体验。 6. **内存管理**:...
`GalleryFlow`是基于Android原生的`Gallery`控件进行扩展的,它主要增加了图片的旋转和缩放功能,使得图片在滑动时能够根据在屏幕中的位置呈现出动态的3D旋转和缩放效果。以下我们将深入探讨这个自定义控件的关键...
3. **3D空间变换**:利用`Matrix`和`Camera`对象可以实现3D空间中的视图变换。当用户触摸屏幕滑动时,`Camera`对象可以调整视角,让页面看起来像是在翻转。同时,通过`Matrix`变换,我们可以改变视图的大小、位置和...
实现3D翻转可以通过自定义ViewGroup,并利用Android的Matrix类进行几何变换。开发者需要熟悉旋转矩阵的概念,以及如何在绘制过程中应用这些变换。 自定义Window是在Android中创建不遵循常规Activity布局规则的特殊...
2. **矩阵变换**:Android中的`Matrix`类是实现2D和3D图形变换的关键。在旋转木马效果中,可以使用`postRotate()`方法来设置视图的旋转角度,使内容围绕中心点旋转。 3. **相机(Camera)**:在3D效果中,`Camera`...
3. **图像变换**:Android提供了Matrix类用于进行图像的旋转、平移、缩放和翻转等变换。这些变换可以应用于Bitmap或ImageView,实现动态的图像效果。 4. **Shader使用**:Shader允许开发者自定义图像的绘制方式,...
3. **矩阵变换(Matrix Transformation)**:Android中的Matrix类允许开发者进行二维图形的旋转、缩放和平移等操作。在放大镜效果中,通常需要修改视图的Matrix,实现局部区域的放大。 4. **动画(Animation)**:为了...
这通常涉及到设置相机(Camera)和视图矩阵(View Matrix),以实现空间中的视觉变换。 5. 层次布局:为了实现翻页时前后页面的叠加效果,通常需要使用如FrameLayout或RelativeLayout等可以管理多个子视图的布局。...
在放大镜效果中,我们可以使用Matrix对图像进行缩放,模拟放大镜的效果。 4. **GestureDetector**:Android的GestureDetector类可以帮助我们检测用户的触摸手势,比如单击、双击、滑动等,这些手势可以用来触发放大...
2. **Matrix变换**:在Android中,`Matrix`类用于执行2D和3D图形变换。为了实现立体翻转,开发者可能通过设置`Matrix`的旋转和平移参数,然后应用到`View`的绘制矩阵上,这样在屏幕上显示时,`View`就会呈现出翻转的...
7. **权限申请** (可选): 如果应用使用了Camera API,需要在AndroidManifest.xml中声明相应的权限,例如`<uses-permission android:name="android.permission.CAMERA"/>`。 8. **UI设计**: 除了核心功能外,UI设计...
本知识点主要探讨如何利用Android相机类(Camera)来创建这种视觉效果。 首先,我们需要了解Android中的Camera类。Camera类在Android中主要用于处理与相机相关的操作,虽然它的主要功能是拍摄照片和录制视频,但也...