我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android中Matrix用法实例分析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android中Matrix用法实例分析

本文实例讲述了Android中Matrix用法。分享给大家供大家参考,具体如下:

Matrix ,中文里叫矩阵,高等数学里有介绍,在图像处理方面,主要是用于平面的缩放、平移、旋转等操作。

首先介绍一下矩阵运算。加法和减法就不用说了,对应位相加就好。图像处理,主要用到的是乘法 。下面是一个乘法的公式:

在 Android 里面, Matrix 由 9 个 float 值构成,是一个 3*3 的矩阵。如下图:

解释一下,上面的sinX 和cosX ,表示旋转角度的cos 值和sin值,注意,旋转角度是按顺时针方向计算的。 translateX 和 translateY 表示 x 和 y 的平移量。 scale 是缩放的比例, 1 是不变, 2 是表示缩放 1/2 。

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)点来进行。

特别注意:

Matrix的操作,总共分为translate(平移),rotate(旋转),scale(缩放)和skew(倾斜)四种,每一种变换在Android的API里都提供了set, post和pre三种操作方式,除了translate,其他三种操作都可以指定中心点。

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

post是后乘,当前的矩阵乘以参数给出的矩阵。可以连续多次使用post,来完成所需的整个变换。

镜面效果:

倒影效果:

图片的合成(水印):

不多说了,直接上代码了。

MainActivity.java里的主要代码如下:


package net.loonggg.testmatrix; 
import android.app.Activity; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Matrix; 
import android.graphics.Paint; 
import android.graphics.PorterDuff.Mode; 
import android.graphics.PorterDuffXfermode; 
import android.os.Bundle; 
import android.view.Window; 
import android.widget.ImageView; 
public class MainActivity extends Activity { 
  private ImageView iv1, iv2; 
  private Canvas canvas; 
  private Paint paint; 
  @Override 
  protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    setContentView(R.layout.activity_main); 
    iv1 = (ImageView) findViewById(R.id.iv1); 
    iv2 = (ImageView) findViewById(R.id.iv2); 
    Bitmap bitmap1 = BitmapFactory.decodeResource(getResources(), 
        R.drawable.weibo); 
    Bitmap updateBitmap = Bitmap.createBitmap(bitmap1.getWidth() * 2, 
        bitmap1.getHeight() * 2, bitmap1.getConfig()); 
    canvas = new Canvas(updateBitmap); 
    paint = new Paint(); 
    paint.setColor(Color.BLACK); 
    Matrix matrix = new Matrix(); 
    // setMirrorOne(bitmap1, matrix); 
    // setInvertedImage(bitmap1, matrix); 
    // setBaseChange(matrix); 
    canvas.drawBitmap(bitmap1, matrix, paint); 
    setImageSynthesis(matrix); 
    iv1.setImageBitmap(bitmap1); 
    iv2.setImageBitmap(updateBitmap); 
  } 
   
  private void setBaseChange(Matrix matrix) { 
    // matrix.setRotate(60);// 这是旋转多少度 
    // matrix.setRotate(degrees, px, py);//这个方法是以哪个点为中心进行旋转多少度 
    // matrix.setSkew(kx, ky);//设置倾斜,以x轴倾斜,还是y轴 
    // 倾斜x和y轴,以(100,100)为中心。 
    // matrix.postSkew(0 .2f, 0 .2f, 100 , 100 ); 
    // matrix.setScale(0.5f, 1);//缩放宽度变为原来的一半,高度不变 
  } 
   
  private void setInvertedImage(Bitmap bitmap1, Matrix matrix) { 
    matrix.setScale(1, -1); 
    matrix.postTranslate(0, bitmap1.getHeight()); 
  } 
   
  private void setMirrorOne(Bitmap bitmap1, Matrix matrix) { 
    matrix.setTranslate(bitmap1.getWidth(), 0);// 这个是移动 
    matrix.preScale(-1, 1); 
  } 
  // --------------------------------------------------------- 
   
  // --------------------------------------------------------- 
   
  private void setMirrorTwo(Bitmap bitmap1, Matrix matrix) { 
    matrix.setScale(-1, 1); 
    matrix.postTranslate(bitmap1.getWidth(), 0); 
  } 
   
  private void setImageSynthesis(Matrix matrix) { 
    Bitmap bitmap2 = BitmapFactory.decodeResource(getResources(), 
        R.drawable.ic_launcher); 
    // 设置图片合成时的各种模式 
    paint.setXfermode(new PorterDuffXfermode(Mode.DARKEN)); 
    // 图片的合成很简单,就是再以bitmap2为基图往目标图片上画一次 
    canvas.drawBitmap(bitmap2, matrix, paint); 
  } 
}

布局文件的代码如下:


<LinearLayout 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" 
  android:orientation="vertical" 
  tools:context=".MainActivity" > 
  <ImageView 
    android:id="@+id/iv1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" /> 
  <ImageView 
    android:id="@+id/iv2" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" /> 
</LinearLayout>

希望本文所述对大家Android程序设计有所帮助。

您可能感兴趣的文章:Android中利用matrix 控制图片的旋转、缩放、移动深入理解Android Matrix理论与使用的详解Android变形(Transform)之Matrix用法android高仿小米时钟(使用Camera和Matrix实现3D效果)Android中使用Matrix控制图形变换和制作倒影效果的方法android Matrix实现图片随意放大缩小或拖动Android 矩阵ColorMatrixAndroid Matrix源码详解Android使用Matrix旋转图片模拟碟片加载过程详谈Android中Matrix的set、pre、post的区别android.graphics.Matrix类用法分析


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android中Matrix用法实例分析

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android中Matrix用法实例分析

本文实例讲述了Android中Matrix用法。分享给大家供大家参考,具体如下: Matrix ,中文里叫矩阵,高等数学里有介绍,在图像处理方面,主要是用于平面的缩放、平移、旋转等操作。 首先介绍一下矩阵运算。加法和减法就不用说了,对应位相
2022-06-06

Android中ListView用法实例分析

本文实例分析了Android中ListView用法。分享给大家供大家参考,具体如下: 通过在Layout中添加ListView Widget可以达到在页面布局具有列表效果的交互页面。在这里通过举例来说明怎样在Layout中添加ListVie
2022-06-06

Android中Bitmap用法实例分析

本文实例讲述了Android中Bitmap用法。分享给大家供大家参考,具体如下: 一般在android程序中把图片文件放在res/drawable目录下就可以通过R.drawable.id来使用,但在存储卡中的图片怎样引用呢?下面通过实现这
2022-06-06

Android中ImageView用法实例分析

本文实例分析了Android中ImageView用法。分享给大家供大家参考,具体如下: 猜牌游戏大家可能以前都玩过,这里我们用这个小游戏来说明ImageView的用法。 首先,在res/drawable中引入三张牌:分别是梅花7,梅花8,梅
2022-06-06

Android中WebView用法实例分析

本文实例讲述了Android中WebView用法。分享给大家供大家参考,具体如下: WebView相当于一个迷你浏览器,采用WebKit内核,因此完美支持html,javascript,css等。 在开发过程中应该注意几点: 1.Andro
2022-06-06

Android中ListActivity用法实例分析

本文实例分析了Android中ListActivity用法。分享给大家供大家参考,具体如下: 程序如下:import android.app.ListActivity; import android.os.Bundle; import an
2022-06-06

Android中AlertDialog用法实例分析

本文实例分析了Android中AlertDialog用法,分享给大家供大家参考,具体如下: Android中AlertDialog为一些程序提供了对话框,有些功能能够进一步满足程序的需要。下面举例介绍。 程序如下:import androi
2022-06-06

Android ViewFlipper用法实例分析

本文实例讲述了Android ViewFlipper用法。分享给大家供大家参考,具体如下: 这里实现的效果是当手动滑动手机屏幕时会一个一个地显示图片,一次显示一张图片package com.my.viewflippertest; impor
2022-06-06

Android中AsyncTask与handler用法实例分析

本文实例讲述了Android中AsyncTask与handler用法。分享给大家供大家参考,具体如下: 首先,我们得明确下一个概念,什么是UI线程。顾名思义,ui线程就是管理着用户界面的那个线程! android的ui线程操作并不是安全的,
2022-06-06

Android中SeekBar和RatingBar用法实例分析

本文实例讲述了Android中SeekBar和RatingBar用法。分享给大家供大家参考,具体如下: 什么是SeekBar? 可以拖动的进度条(在播放器中使用最常见) 1、在布局文件中声明
2022-06-06

Android开发中PopupWindow用法实例分析

本文实例分析了Android开发中PopupWindow用法。分享给大家供大家参考,具体如下:private TextView tv_appmanager_title; private ListView lv_app_manager; pr
2022-06-06

android中Handle类的用法实例分析

本文实例讲述了android中Handle类的用法。分享给大家供大家参考。具体如下: 当我们在处理下载或是其他需要长时间执行的任务时,如果直接把处理函数放Activity的OnCreate或是OnStart中,会导致执行过程中整个Activ
2022-06-06

Android中GridView和ArrayAdapter用法实例分析

本文实例分析了Android中GridView和ArrayAdapter用法。分享给大家供大家参考,具体如下: GridView是一个表格化的二维排版的View,当GridView的文字放不下时会出现scrolling的效果,GridVie
2022-06-06

Android编程中Perferences的用法实例分析

本文实例讲述了Android编程中Perferences的用法。分享给大家供大家参考,具体如下: 浏览手机的/data/data/目录中的各个package的目录,经常会看到有一个shared_prefs文件夹,里面有一个包名_prefer
2022-06-06

Android Service控件用法实例分析

本文实例讲述了Android Service控件用法。分享给大家供大家参考,具体如下: 1、Service是一个应用程序的组件 2、Service没有图形化界面 3、用来处理耗时比较长的功能(下载、播放MP3) 4、更新ContentPro
2022-06-06

Android编程之listView中checkbox用法实例分析

本文实例讲述了Android编程之listView中checkbox用法。分享给大家供大家参考,具体如下: 我们经常会用到在listView中使用checkbox的情况。直接不回应用后会发现,ListView中的OnItemClickLis
2022-06-06

Android中TelephonyManager类的方法实例分析

本文实例讲述了Android中TelephonyManager类的方法。分享给大家供大家参考。具体如下: TelephonyManager类主要提供了一系列用于访问与手机通讯相关的状态和信息的get方法。其中包括手机SIM的状态和信息、电信
2022-06-06

Android控件之GridView用法实例分析

本文实例讲述了Android控件之GridView用法。分享给大家供大家参考。具体如下: GridView是一项显示二维的viewgroup,可滚动的网格。一般用来显示多张图片。 以下模拟九宫图的实现,当鼠标点击图片时会进行相应的跳转链接。
2022-06-06

Android控件之ScrollView用法实例分析

本文实例讲述了Android控件之ScrollView用法。分享给大家供大家参考。具体如下: ScrollView滚动视图是指当拥有很多内容,屏幕显示不完时,需要通过滚动跳来显示的视图。 ScrollView只支持垂直滚动。 以下为案例 m
2022-06-06

Android选项菜单用法实例分析

本文实例讲述了Android选项菜单用法。分享给大家供大家参考。具体如下: Android平台下所提供的菜单大体上可分为三类:选项菜单、上下文菜单和子菜单。 当Activity在前台运行时,如果用户按下手机上的Menu键,此时就会在屏幕低端
2022-06-06

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录