android中的matrix的简单应用--translate(平移),rotate(旋转),scale(缩放)和skew(倾斜)
来源:互联网 发布:域名为什么认证 编辑:程序博客网 时间:2024/04/29 23:04
在android中, 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);
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)点来进行。
下面我通过我今天做的小例子来进一步理解一下matrix的一些简单操作:
先看一下运行界面:
1.当我们点击缩放按钮的时候,它会按照EditText中输入的比例对imageView进行缩放,主要是通过matrix的postScale方法实现的。效果图如下:
按0.25的比例缩小
按1.75的比例放大
2.当点击旋转按钮的时候,会按照上面标明的角度值进行旋转,通过matrix的postRotate实现的,数值为正的时候是顺时针旋转,为负值时是逆时针旋转。效果图如下:
顺时针旋转30度
逆时针旋转30度
3.当点击移动按钮的时候,图片进行移动,通过matrix的postTranslate方法实现的,效果如下:
上面的前一个10标明平移的横坐标,第二个10标明的是纵坐标
当点击还原的时候,图片恢复到最初的状态,主要是通过matrix的reset()方法实现的。
还原后的效果
上述的代码如下:
package
lm.matrix;
import
android.app.Activity;
import
android.content.Intent;
import
android.graphics.Bitmap;
import
android.graphics.BitmapFactory;
import
android.graphics.Matrix;
import
android.os.Bundle;
import
android.view.View;
import
android.widget.EditText;
import
android.widget.ImageView;
public
class
MyMatrix
extends
Activity{
private
EditText scaleEt;
private
EditText rotateEt;
private
EditText translateEt1;
private
EditText translateEt2;
private
ImageView imageView;
private
Matrix matrix;
private
Bitmap bitMap;
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.matrix);
scaleEt = (EditText)findViewById(R.id.et_scale);
rotateEt = (EditText)findViewById(R.id.et_rotate);
translateEt1 = (EditText)findViewById(R.id.et_translateX);
translateEt2 = (EditText)findViewById(R.id.et_translateY);
imageView = (ImageView)findViewById(R.id.iv_matrix);
bitMap = BitmapFactory.decodeResource(getResources(), R.drawable.icon);
imageView.setImageBitmap(bitMap);
matrix =
new
Matrix();
}
public
void
scaleBitmap(View view){
matrix.postScale(getValues(scaleEt), getValues(scaleEt));
imageView.setImageMatrix(matrix);
}
public
void
rotateBitmap(View view){
matrix.postRotate(getValues(rotateEt));
imageView.setImageMatrix(matrix);
}
public
void
translateBitmap(View view){
matrix.postTranslate(getValues(translateEt1), getValues(translateEt2));
imageView.setImageMatrix(matrix);
}
public
void
clearMatrix(View view){
matrix.reset();
imageView.setImageMatrix(matrix);
}
private
float
getValues(EditText et){
return
Float.parseFloat(et.getText().toString());
}
}
xml文件代码如下:
<?xml version=
"1.0"
encoding=
"utf-8"
?>
<LinearLayout xmlns:android=
"http://schemas.android.com/apk/res/android"
android:orientation=
"vertical"
android:layout_width=
"fill_parent"
android:layout_height=
"fill_parent"
>
<LinearLayout
android:layout_marginTop=
"10dip"
android:layout_width=
"fill_parent"
android:layout_height=
"50dip"
android:orientation=
"horizontal"
>
<EditText android:id=
"@+id/et_scale"
android:layout_weight=
"1.0"
android:layout_width=
"fill_parent"
android:layout_height=
"wrap_content"
android:hint=
"缩放比例"
android:text=
"0.25"
/>
<EditText android:id=
"@+id/et_rotate"
android:layout_weight=
"1.0"
android:layout_width=
"fill_parent"
android:layout_height=
"wrap_content"
android:text=
"30"
android:hint=
"旋转角度"
android:onClick=
"rotateBitmap"
/>
<EditText android:id=
"@+id/et_translateX"
android:layout_weight=
"1.0"
android:layout_width=
"fill_parent"
android:layout_height=
"wrap_content"
android:text=
"10"
android:hint=
"X偏移"
/>
<EditText android:id=
"@+id/et_translateY"
android:layout_weight=
"1.0"
android:layout_width=
"fill_parent"
android:layout_height=
"wrap_content"
android:text=
"10"
android:hint=
"y偏移"
/>
</LinearLayout>
<LinearLayout android:layout_marginTop=
"10dip"
android:layout_width=
"fill_parent"
android:layout_height=
"50dip"
android:orientation=
"horizontal"
>
<Button android:layout_weight=
"1.0"
android:layout_width=
"fill_parent"
android:layout_height=
"wrap_content"
android:text=
"缩放"
android:onClick=
"scaleBitmap"
/>
<Button android:layout_weight=
"1.0"
android:layout_width=
"fill_parent"
android:layout_height=
"wrap_content"
android:text=
"旋转"
android:onClick=
"rotateBitmap"
/>
<Button android:layout_weight=
"1.0"
android:layout_width=
"fill_parent"
android:layout_height=
"wrap_content"
android:text=
"移动"
android:onClick=
"translateBitmap"
/>
<Button android:layout_weight=
"1.0"
android:layout_width=
"fill_parent"
android:layout_height=
"wrap_content"
android:text=
"还原"
android:onClick=
"clearMatrix"
/>
</LinearLayout>
<ImageView android:layout_weight=
"1.0"
android:id=
"@+id/iv_matrix"
android:layout_width=
"fill_parent"
android:layout_height=
"fill_parent"
android:scaleType=
"matrix"
/>
<LinearLayout android:layout_marginTop=
"10dip"
android:layout_width=
"fill_parent"
android:layout_height=
"50dip"
android:orientation=
"horizontal"
>
<Button android:layout_weight=
"1.0"
android:layout_width=
"fill_parent"
android:layout_height=
"wrap_content"
android:text=
"深入测试1"
android:onClick=
"test1"
/>
<Button android:layout_weight=
"1.0"
android:layout_width=
"fill_parent"
android:layout_height=
"wrap_content"
android:text=
"深入测试2"
android:onClick=
"test2"
/>
</LinearLayout>
</LinearLayout>
当然还可以对图片进行拉伸,是通过matrix的postSkew方法实现的,看看我们先对图片进行平移再对其实现拉伸效果图:
它的实现代码如下:
package
lm.matrix;
import
android.app.Activity;
import
android.content.Context;
import
android.graphics.Bitmap;
import
android.graphics.Canvas;
import
android.graphics.Matrix;
import
android.graphics.drawable.BitmapDrawable;
import
android.os.Bundle;
import
android.view.View;
public
class
MyMatrixThree
extends
Activity{
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(
new
MyView(
this
));
}
class
MyView
extends
View{
private
Bitmap bitMap;
private
Matrix matrix;
public
MyView(Context context) {
super
(context);
matrix =
new
Matrix();
bitMap = ((BitmapDrawable) getResources().getDrawable(R.drawable.icon)).getBitmap();
matrix.setScale(100f/bitMap.getWidth(), 100f/bitMap.getHeight());
matrix.postTranslate(
150
,
150
);
matrix.postSkew(
0
.2f,
0
.2f,
150
,
150
);
//拉伸
}
@Override
protected
void
onDraw(Canvas canvas) {
super
.onDraw(canvas);
canvas.drawBitmap(bitMap, matrix,
null
);
}
}
}
- android中的matrix的简单应用--translate(平移),rotate(旋转),scale(缩放)和skew(倾斜)
- CSS3属性transform详解之(旋转:rotate,缩放:scale,倾斜:skew,移动:translate)
- CSS3属性transform详解之(旋转:rotate,缩放:scale,倾斜:skew,移动:translate)
- CSS3属性transform详解之(旋转:rotate,缩放:scale,倾斜:skew,移动:translate)
- CSS3属性transform详解之(旋转:rotate,缩放:scale,倾斜:skew,移动:translate)
- CSS3属性transform详解之(旋转:rotate,缩放:scale,倾斜:skew,移动:translate)
- CSS3属性transform详解之(旋转:rotate,缩放:scale,倾斜:skew,移动:translate)
- CSS3属性transform(旋转:rotate,缩放:scale,倾斜:skew,移动:translate)
- CSS3属性transform详解之(旋转:rotate,缩放:scale,倾斜:skew,移动:translate)
- CSS3属性transform详解之(旋转:rotate,缩放:scale,倾斜:skew,移动:translate)
- CSS3属性transform详解之(旋转:rotate,缩放:scale,倾斜:skew,移动:translate)
- CSS3属性transform详解之(旋转:rotate,缩放:scale,倾斜:skew,移动:translate)
- CSS3属性transform(旋转:rotate,缩放:scale,倾斜:skew,移动:translate)
- 浅谈CSS3新特性——transform: rotate(旋转) | scale(缩放) | translate(移动) | skew(倾斜)
- 简单的学习Matrix的缩放,平移,旋转,倾斜
- Android matrix偏移(平移),旋转,缩放,倾斜的原理
- Android图片平移缩放(一):Matrix矩阵变幻:Scale, Translation,Skew
- Android 动画(anim)详解就我所知,简单阐述一下: Android的animation由四种类型组成:alpha(透明度)、scale(缩放)、translate(位移)、rotate(旋转
- Qt 编程点滴9
- MyEclipse配置hibernate,连接oracle,报ORA-00604错误的解决
- 仓库管理中的盘点_条码应用
- Java Web 系统单点登录的实现
- Qt 编程点滴 10
- android中的matrix的简单应用--translate(平移),rotate(旋转),scale(缩放)和skew(倾斜)
- 数据结构之并查集
- android中wifi原理及流程分析
- Datamax指令DPL打印加回车的二维条码
- Oracle 10gr2 RAC管理系列2:Clusterware Commands
- Orcal 用户权限
- 搜狗笔试题目:4*5的棋盘,在左下角的格子移动到右上角的格子,求有多少种移动方法
- PHP底层之PHP底层工作原理
- Servlet生命周期