参考:

1、Android Matrix理论与应用详解

2、2D平面中关于矩阵(Matrix)跟图形变换的讲解

3、Android中关于矩阵(Matrix)前乘后乘的一些认识

4、Android Matrix

View.setPivotX:设置旋转或缩放的基点的X位置,默认是对象的中点(官方API说明:https://developer.android.com/reference/android/view/View.html#setPivotX(float))。

View.setScaleX:设置缩放比例。一般情况下,View的缩放会产生平移数据。

相对点P(a,b)的比例[sx,sy]变化矩阵[1]


这里的点P(a, b)就是前文说的基点。

注意:

setTranslationX(),是post模式,即setTranslationX()产生的变换矩阵乘以当前矩阵。

setScaleX(),使pre模式,即当前矩阵乘以setScaleX()产生的变换矩阵。

例子:

无论setScalex()在setTanslation()之前或之后调用,都是setTanslation()产生的变换矩阵乘以setScaleX()产生的变换矩阵。

举例:setScalex(0.9),setTanslation(100),矩阵变换为:

1   0   100     乘以    0.9    0   (1-0.9)*320  得到   0.9   0   132

0   1    0                  0      1       0                        0    1     0

0   0    1                  0      0       1                        0    0     1

第一个矩阵由setTanslation(100)得到,第二个矩阵由setScalex(0.9)得到,而(1-0.9)*320中的320是Image中点X值,实例图片宽度为640。

再次调用这两个方法后,都是重新进行计算,而不是在前一次的基础上计算。都是从矩阵 1  0  0 开始。

0  1  0

0  0  1

代码:

public class MatrixActivity extends Activity implements View.OnClickListener {

    private static final String TAG = MatrixActivity.class.getSimpleName();

    private ImageView mWImageView;
private Button mBtn_Translation, mBtnScale, mBtnTranslation;
private int mHeight, mWidth;
private static float mScale = 1.0f; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_matrix); mWImageView = (ImageView) findViewById(R.id.welcome_img_view);
mBtn_Translation = (Button) findViewById(R.id._translation);
mBtnScale = (Button) findViewById(R.id.scale);
mBtnTranslation = (Button) findViewById(R.id.translation);
//改变基点的X值,默认以中点
// mWImageView.setPivotX(0);
// mWImageView.setPivotX(640); setOnclickListener(); } @Override
protected void onResume() {
Log.d(TAG, "In onResume ---------------------");
super.onResume();
publicLog();
} private void setOnclickListener() {
mBtn_Translation.setOnClickListener(this);
mBtnScale.setOnClickListener(this);
mBtnTranslation.setOnClickListener(this);
} private void publicLog() {
Log.d(TAG, "mWImageView x, y, width, height:" + mWImageView.getLeft() + " --- "
+ mWImageView.getTop() + " --- " + mWImageView.getWidth() + " --- " + mWImageView.getHeight());
Log.d(TAG, "mWImageView Pivots:" + mWImageView.getPivotX() + " --- " + mWImageView.getPivotY());
Log.d(TAG, "mWImageView Matrix:" + mWImageView.getMatrix());
} @Override
public void onClick(View v) {
int id = v.getId(); mHeight = mWImageView.getHeight();
mWidth = mWImageView.getWidth();
int dx = mWidth / 2; switch (id) {
case R.id._translation:
Log.d(TAG, "mWImageView _translation ---------------------");
publicLog();
Log.d(TAG, "mWImageView TranslationX: " + -dx);
mWImageView.setTranslationX(-dx);
publicLog();
break; case R.id.scale:
Log.d(TAG, "mWImageView scale ---------------------");
publicLog();
if(mScale - 0.1 > 0){
mScale = mScale - 0.1f;
}else{
mScale = mScale + 0.1f;
}
mWImageView.setScaleX(mScale);
publicLog();
break; case R.id.translation:
Log.d(TAG, "mWImageView translation ---------------------");
publicLog();
Log.d(TAG, "mWImageView TranslationX: " + dx);
mWImageView.setTranslationX(dx);
publicLog();
break;
} int[] location = new int[2];
mWImageView.getLocationInWindow(location);
Log.d(TAG, "mWImageView LocationInWindow:" + location[0] + " --- " + location[1]); }
}

MatrixActivity.java

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"> <ImageView
android:id="@+id/welcome_img_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/welcome" /> <Button
android:id="@+id/_translation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text=" - Translation " /> <Button
android:id="@+id/scale"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Scale" /> <Button
android:id="@+id/translation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Translation " /> </LinearLayout>

activity_matrix.xml

Android -- View setScale, setTranslation 对View矩阵的处理的更多相关文章

  1. Android显示框架:自定义View实践之绘制篇

    文章目录 一 View 二 Paint 2.1 颜色处理 2.2 文字处理 2.3 特殊处理 三 Canvas 3.1 界面绘制 3.2 范围裁切 3.3 集合变换 四 Path 4.1 添加图形 4 ...

  2. android开发:深入理解View(一):从setContentView谈起

    我们都知道 MVC,在Android中,这个 V 即指View,那我们今天就来探探View的究竟. 在onCreate方法中,可以调用this.setContentView(layout_id),来设 ...

  3. Android 开发之旅:view的几种布局方式及实践

    本文的主要内容就是分别介绍以上视图的七种布局显示方式效果及实现,大纲如下: 1.View布局概述 2.线性布局(Linear Layout) 2.1.Tips:android:layout_weigh ...

  4. Android开发艺术探索笔记——View(二)

    Android开发艺术探索笔记--View(二) View的事件分发机制 学习资料: 1.Understanding Android Input Touch Events System Framewo ...

  5. Android开发艺术探索笔记—— View(一)

    Android开发艺术探索笔记 --View(一) View的基础知识 什么是View View是Android中所有控件的基类.是一种界面层控件的抽象. View的位置参数 参数名 获取方式 含义 ...

  6. Android 和iOS 中关于View 的一点知识

    View的概念和方法十分重要,这里将对Android 和iOS中出现的,关于视图的一些知识点进行总结,预计文章会比较长,要许多时间慢慢补充. 先转载一部分资料,感谢原作者! 原链接为:http://b ...

  7. Android实现边缘凹凸的View

    转载 最近做项目的时候遇到一个卡劵的效果,由于自己觉得用图片来做的话可以会出现适配效果不好,再加上自己自定义view方面的知识比较薄弱,所以想试试用自定义View来实现.但是由于自己知识点薄弱,一开始 ...

  8. android应用程序中获取view 的位置

    1. 相对位置: getLeft() , getRight(), getTop(), getBottom() 在Android中可以把left相当于X轴值, top相当于Y轴值, 通过这两个值Andr ...

  9. 在Android中动画移动一个View的位置,采用Scroller类实现Android动画之 View移动

    在Android中动画移动一个View的位置,采用Scroller类实现 今天说最近自己遇到的一个问题,就是要用动画效果来移动一个VIew的位置. 这个具体的情况是,需要做一个SlidingMenu的 ...

随机推荐

  1. Android圆角矩形创建工具RoundRect类

    用于把普通图片转换为圆角图像的工具类RoundRect类(复制即可使用): import android.content.Context; import android.graphics.Bitmap ...

  2. OpenGL官方教程——着色器语言概述

    OpenGL官方教程——着色器语言概述 OpenGL官方教程——着色器语言概述 可编程图形硬件管线(流水线) 可编程顶点处理器 可编程几何处理器 可编程片元处理器 语言 可编程图形硬件管线(流水线) ...

  3. Apache Thrift 服务开发框架学习记录

    Apache Thrift 是 Facebook 实现的一种高效的.支持多种编程语言的远程服务调用的框架. 前言: 目前流行的服务调用方式有很多种,例如基于 SOAP 消息格式的 Web Servic ...

  4. django 的模板语言

    1.模版的执行 模版的创建过程,对于模版,其实就是读取模版(其中嵌套着模版标签),然后将 Model 中获取的数据插入到模版中,最后将信息返回给用户. def current_datetime(req ...

  5. C# XML和实体类之间相互转换(序列化和反序列化)

    我们需要在XML与实体类,DataTable,List之间进行转换,下面是XmlUtil类,该类来自网络并稍加修改. using System; using System.Collections.Ge ...

  6. non

    I p(I q){r p(c((q>9?q-p(q/10):q)+'0')),q*10; }

  7. @ResponseBody返回不能正确接收

    Spring-MVC中@ResponseBody返回Bean到前台接收这么一串代码,还套着HTML标签: The resource identified by this request is only ...

  8. springboot 连接池wait_timeout超时设置

    使用springboot 线程池连接MySQL时,mysql数据库wait_timeout 为8个小时,所以程序第二天发现报错,在url配置了 autoReconnect=true 也不行,查询配置以 ...

  9. An exception occurred during a WebClient request

    System.Net.WebException was caught HResult=-2146233079 Message=An exception occurred during a WebCli ...

  10. JS插件之——bootstrap-suggest.js

    今天遇到了一个很牛逼的插件bootstrap-suggest.js 如此好用的搜索提示插件 简直酷毙了 源码下载地址 编写了一个例子,供以后参考 <!DOCTYPE HTML PUBLIC &q ...