Android图片旋转,缩放,位移,倾斜,对称完整示例(一)——imageView.setImageMatrix(matrix)和Matrix
MainActivity如下:
- import android.os.Bundle;
- import android.view.MotionEvent;
- import android.view.View;
- import android.view.View.OnTouchListener;
- import android.widget.ImageView;
- import android.app.Activity;
- import android.graphics.Matrix;
- /**
- * Demo描述:
- * 利用mImageView.setImageMatrix(matrix)实现
- * 图片的平移,缩放,旋转,倾斜以及对称
- *
- * 参考资料:
- * 0 http://blog.csdn.net/pathuang68/article/details/6991988
- * 1 http://blog.csdn.net/mingli198611/article/details/7830633
- *
- * Thank you very much
- */
- public class MainActivity extends Activity {
- private TestMatrixImageView mTestMatrixImageView;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- mTestMatrixImageView=new TestMatrixImageView(MainActivity.this);
- mTestMatrixImageView.setScaleType(ImageView.ScaleType.MATRIX);//??
- mTestMatrixImageView.setOnTouchListener(new TouchListenerImpl());
- setContentView(mTestMatrixImageView);
- }
- private class TouchListenerImpl implements OnTouchListener{
- @Override
- public boolean onTouch(View v, MotionEvent event) {
- if (event.getAction()==MotionEvent.ACTION_UP) {
- //1 测试平移
- testTranslate();
- //2 测试围绕图片中心点旋转
- //testRotate();
- //3 测试围绕原点旋转后平移
- //testRotateAndTranslate();
- //4 缩放
- //testScale();
- //5 水平倾斜
- //testSkewX();
- //6 垂直倾斜
- //testSkewY();
- //7 水平且垂直倾斜
- //testSkewXY();
- //8 水平对称
- //testSymmetryX();
- //9 垂直对称
- //testSymmetryY();
- //10 关于X=Y对称
- //testSymmetryXY();
- }
- return true;
- }
- }
- //平移
- private void testTranslate(){
- Matrix matrix=new Matrix();
- int width=mTestMatrixImageView.getBitmap().getWidth();
- int height=mTestMatrixImageView.getBitmap().getHeight();
- matrix.postTranslate(width, height);
- mTestMatrixImageView.setImageMatrix(matrix);
- showMatrixEveryValue(matrix);
- }
- //围绕图片中心点旋转
- private void testRotate(){
- Matrix matrix=new Matrix();
- int width=mTestMatrixImageView.getBitmap().getWidth();
- int height=mTestMatrixImageView.getBitmap().getHeight();
- matrix.postRotate(45f, width/2, height/2);
- matrix.postTranslate(width, height);
- mTestMatrixImageView.setImageMatrix(matrix);
- showMatrixEveryValue(matrix);
- }
- //围绕原点旋转后平移
- //注意以下三行代码的执行顺序:
- //matrix.setRotate(45f);
- //matrix.preTranslate(-width, -height);
- //matrix.postTranslate(width, height);
- //先执行matrix.preTranslate(-width, -height);
- //后执行matrix.setRotate(45f);
- //再执行matrix.postTranslate(width, height);
- private void testRotateAndTranslate() {
- Matrix matrix = new Matrix();
- int width = mTestMatrixImageView.getBitmap().getWidth();
- int height = mTestMatrixImageView.getBitmap().getHeight();
- matrix.setRotate(45f);
- matrix.preTranslate(-width, -height);
- matrix.postTranslate(width, height);
- mTestMatrixImageView.setImageMatrix(matrix);
- showMatrixEveryValue(matrix);
- }
- //缩放
- private void testScale() {
- Matrix matrix = new Matrix();
- matrix.setScale(0.5f, 0.5f);
- mTestMatrixImageView.setImageMatrix(matrix);
- showMatrixEveryValue(matrix);
- }
- //水平倾斜
- private void testSkewX() {
- Matrix matrix = new Matrix();
- matrix.setSkew(0.5f, 0);
- mTestMatrixImageView.setImageMatrix(matrix);
- showMatrixEveryValue(matrix);
- }
- // 垂直倾斜
- private void testSkewY() {
- Matrix matrix = new Matrix();
- matrix.setSkew(0, 0.5f);
- mTestMatrixImageView.setImageMatrix(matrix);
- showMatrixEveryValue(matrix);
- }
- // 水平且垂直倾斜
- private void testSkewXY() {
- Matrix matrix = new Matrix();
- matrix.setSkew(0.5f, 0.5f);
- mTestMatrixImageView.setImageMatrix(matrix);
- showMatrixEveryValue(matrix);
- }
- // 水平对称--图片关于X轴对称
- private void testSymmetryX() {
- Matrix matrix = new Matrix();
- int height = mTestMatrixImageView.getBitmap().getHeight();
- float matrixValues[] = { 1f, 0f, 0f, 0f, -1f, 0f, 0f, 0f, 1f };
- matrix.setValues(matrixValues);
- //若是matrix.postTranslate(0, height);
- //表示将图片上下倒置
- matrix.postTranslate(0, height*2);
- mTestMatrixImageView.setImageMatrix(matrix);
- showMatrixEveryValue(matrix);
- }
- // 垂直对称--图片关于Y轴对称
- private void testSymmetryY() {
- Matrix matrix = new Matrix();
- int width=mTestMatrixImageView.getBitmap().getWidth();
- float matrixValues[] = {-1f, 0f, 0f, 0f, 1f, 0f, 0f, 0f, 1f};
- matrix.setValues(matrixValues);
- //若是matrix.postTranslate(width,0);
- //表示将图片左右倒置
- matrix.postTranslate(width*2, 0);
- mTestMatrixImageView.setImageMatrix(matrix);
- showMatrixEveryValue(matrix);
- }
- // 关于X=Y对称--图片关于X=Y轴对称
- private void testSymmetryXY() {
- Matrix matrix = new Matrix();
- int width = mTestMatrixImageView.getBitmap().getWidth();
- int height = mTestMatrixImageView.getBitmap().getHeight();
- float matrixValues[] = { 0f, -1f, 0f, -1f, 0f, 0f, 0f, 0f, 1f };
- matrix.setValues(matrixValues);
- matrix.postTranslate(width+height, width+height);
- mTestMatrixImageView.setImageMatrix(matrix);
- showMatrixEveryValue(matrix);
- }
- //获取变换矩阵Matrix中的每个值
- private void showMatrixEveryValue(Matrix matrix){
- float matrixValues []=new float[9];
- matrix.getValues(matrixValues);
- for (int i = 0; i <3; i++) {
- String valueString="";
- for (int j = 0; j < 3; j++) {
- valueString=matrixValues[3*i+j]+"";
- System.out.println("第"+(i+1)+"行的第"+(j+1)+"列的值为"+valueString);
- }
- }
- }
- }
TestMatrixImageView如下:
- package cn.testmatrix;
- import android.content.Context;
- import android.graphics.Bitmap;
- import android.graphics.BitmapFactory;
- import android.graphics.Canvas;
- import android.graphics.Matrix;
- import android.widget.ImageView;
- /**
- * 总结:
- * 在MainActivity中执行:
- * mTestMatrixImageView.setImageMatrix(matrix);
- * 时此自定义View会先调用setImageMatrix(Matrix matrix)
- * 然后调用onDraw(Canvas canvas)
- */
- public class TestMatrixImageView extends ImageView{
- private Matrix mMatrix;
- private Bitmap mBitmap;
- public TestMatrixImageView(Context context) {
- super(context);
- mMatrix=new Matrix();
- mBitmap=BitmapFactory.decodeResource(getResources(), R.drawable.icon);
- }
- @Override
- protected void onDraw(Canvas canvas) {
- System.out.println("---> onDraw");
- //画原图
- canvas.drawBitmap(mBitmap, 0, 0, null);
- //画经过Matrix变化后的图
- canvas.drawBitmap(mBitmap, mMatrix, null);
- super.onDraw(canvas);
- }
- @Override
- public void setImageMatrix(Matrix matrix) {
- System.out.println("---> setImageMatrix");
- this.mMatrix.set(matrix);
- super.setImageMatrix(matrix);
- }
- public Bitmap getBitmap(){
- System.out.println("---> getBitmap");
- return mBitmap;
- }
- }
main.xml如下:
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- >
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/hello_world" />
- </RelativeLayout>
Android图片旋转,缩放,位移,倾斜,对称完整示例(一)——imageView.setImageMatrix(matrix)和Matrix的更多相关文章
- Android图片旋转,缩放,位移,倾斜,对称完整演示样例(一)——imageView.setImageMatrix(matrix)和Matrix
MainActivity例如以下: import android.os.Bundle; import android.view.MotionEvent; import android.view.Vie ...
- Android 图片的缩放与旋转
本文实现Android中的图片的缩放效果 首先设计布局: <LinearLayout xmlns:android="http://schemas.android.com/apk/res ...
- android图片拖动缩放
这篇图片拖拽缩放也是我在项目中用到的,今天整理一下,将源码奉献给大家,希望对大家以后碰到相似的问题有帮助.android 大图片拖拽缩放 这篇就不做过多介绍了,直接上源码: public class ...
- iOS transform解决连续多次旋转缩放,实现图片旋转缩放效果
一.需求 实现imageView的缩放旋转效果,一般有两种方式: 1.底层加scrollview,利用scrollview的属性实现.(推荐这种,这是我比较后发现的,手势做缩放旋转会有点弊端) 2.利 ...
- Android图片的缩放效果
一.概述 Android 图片要实现:手势滑动,双击变大,多点触控的效果. 其实是有一定难度的,我们需要用Matrix ,GestureDetector 等等需要完成一个复杂的逻辑才能实现,然而今天我 ...
- android图片的缩放、圆角处理
android中图片缩放方法有三种:1,bitmapFactory:2,bitmap+metrix:3,thumbUtil 方法一:bitmapFactory: public static Bitma ...
- Android 图片旋转(使用Matrix.setRotate方法)
imageView2 = (ImageView) findViewById(R.id.img2); Bitmap bitmap = BitmapFactory.decodeResource(getRe ...
- Android 图片旋转
拍照后的照片有时被系统旋转,纠正步骤如下: 1.先读取图片文件被旋转的角度: /** * 通过ExifInterface类读取图片文件的被旋转角度 * @param path : 图片文件的路径 * ...
- CSS3旋转缩放移动倾斜等效果——transform
1.transform浏览器支持情况 也就是说目前不考虑老浏览器的话是不用加前缀的,感谢菜鸟教程:https://www.runoob.com/cssref/css3-pr-transform.htm ...
随机推荐
- TCP与UDP网络编程总结(一)
(1):TCP网络编程 我们注意到服务端与客户端通信时是通过客户端的套接字相互通信的,那么服务端的套接字主要是干什么用的呢? TCP服务端设置监听套接字时 int listen(int sock,in ...
- CSS3 中FLEX快速实现BorderLayout布局
学习完flex的布局模式之后,我们趁热打铁,来实现一个BoxLayout布局.什么是BoxLayout布局?那我们先上一个图看看 BoxLayout布局写过后端UI代码的编程者应该不陌生了,写前端的代 ...
- C语言变量声明加冒号的用法
有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可.为了节省存储空间,并使处理简便,C语言又提供了一种数据结构 ...
- Unity3D C#脚本开发学习
1. Inherit from MonoBehaviour,All behaviour scripts must inherit from MonoBehaviour (directly or ind ...
- 转】VB中Set的用法
Set 语句 将对象引用赋给变量或属性. 语法 Set objectvar = {[New] objectexpression | Nothing} Set 语句的语法包含下面部分: 部分 描述 ob ...
- Log4Net配置注意点
log4Net的配置文章一搜一大把,配置使用还是有一些点花费了很多时间,这里整理一下,添上坑,让Developer走的更稳. 编程式配置路径 新建一个配置文件,通过写代码来动态加载log4Net的配置 ...
- matlab操作之--读取指定文件夹下的“指定格式”文件
%% 正负样本所在folder fext='*.png';%要读取的文件格式 positiveFolder='F:\课题\Crater detection\machingLearning\Positi ...
- 转:使用Tengine替代Nginx作为负载均衡服务器
原文来自于:http://heylinux.com/archives/2938.html Tengine是由淘宝网发起的Web服务器项目.它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级 ...
- 【Java】整理关于java的String类,equals函数和比较操作符的区别
初学 Java 有段时间了,感觉似乎开始入了门,有了点儿感觉但是发现很多困惑和疑问而且均来自于最基础的知识折腾了一阵子又查了查书,终于对 String 这个特殊的对象有了点感悟大家先来看看一段奇怪的程 ...
- 纯CSS打造可折叠树状菜单
1:Html代码 <li> <label for="subsubfolder1">下级</label> <input id="s ...