Android -- View setScale, setTranslation 对View矩阵的处理
参考:
3、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矩阵的处理的更多相关文章
- Android显示框架:自定义View实践之绘制篇
文章目录 一 View 二 Paint 2.1 颜色处理 2.2 文字处理 2.3 特殊处理 三 Canvas 3.1 界面绘制 3.2 范围裁切 3.3 集合变换 四 Path 4.1 添加图形 4 ...
- android开发:深入理解View(一):从setContentView谈起
我们都知道 MVC,在Android中,这个 V 即指View,那我们今天就来探探View的究竟. 在onCreate方法中,可以调用this.setContentView(layout_id),来设 ...
- Android 开发之旅:view的几种布局方式及实践
本文的主要内容就是分别介绍以上视图的七种布局显示方式效果及实现,大纲如下: 1.View布局概述 2.线性布局(Linear Layout) 2.1.Tips:android:layout_weigh ...
- Android开发艺术探索笔记——View(二)
Android开发艺术探索笔记--View(二) View的事件分发机制 学习资料: 1.Understanding Android Input Touch Events System Framewo ...
- Android开发艺术探索笔记—— View(一)
Android开发艺术探索笔记 --View(一) View的基础知识 什么是View View是Android中所有控件的基类.是一种界面层控件的抽象. View的位置参数 参数名 获取方式 含义 ...
- Android 和iOS 中关于View 的一点知识
View的概念和方法十分重要,这里将对Android 和iOS中出现的,关于视图的一些知识点进行总结,预计文章会比较长,要许多时间慢慢补充. 先转载一部分资料,感谢原作者! 原链接为:http://b ...
- Android实现边缘凹凸的View
转载 最近做项目的时候遇到一个卡劵的效果,由于自己觉得用图片来做的话可以会出现适配效果不好,再加上自己自定义view方面的知识比较薄弱,所以想试试用自定义View来实现.但是由于自己知识点薄弱,一开始 ...
- android应用程序中获取view 的位置
1. 相对位置: getLeft() , getRight(), getTop(), getBottom() 在Android中可以把left相当于X轴值, top相当于Y轴值, 通过这两个值Andr ...
- 在Android中动画移动一个View的位置,采用Scroller类实现Android动画之 View移动
在Android中动画移动一个View的位置,采用Scroller类实现 今天说最近自己遇到的一个问题,就是要用动画效果来移动一个VIew的位置. 这个具体的情况是,需要做一个SlidingMenu的 ...
随机推荐
- Effective Java 读书笔记之一 创建和销毁对象
一.考虑用静态工厂方法代替构造器 这里的静态工厂方法是指类中使用public static 修饰的方法,和设计模式的工厂方法模式没有任何关系.相对于使用共有的构造器来创建对象,静态工厂方法有几大优势: ...
- ACdream1063——平衡树
1.题目大意:让你设计一种数据结构,支持插入一个数,和在这个结构里查询结构中的哪个数和给定的数的异或值最小 2.分析:这个怎么做呢,就是trie树,我们建立一个trie树,把树按01进制存进去,然后在 ...
- C#高级编程笔记 Day 1, 2016年8月 30日 名词定义
1.C# 中的命名空间 namespace,我觉得和Java中的package 差不多,相当于一个"包" 一样. 2.修饰符 static 修饰方法表示方法不能在类的实例化上执行, ...
- hiho #1310 : 岛屿 (dfs,hash)
题目2 : 岛屿 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给你一张某一海域卫星照片,你需要统计: 1. 照片中海岛的数目 2. 照片中面积不同的海岛数目 3. 照 ...
- 汉诺塔(河内塔)算法 ----C语言递归实现
汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子, 在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺 ...
- TimeVal类——Live555源码阅读(一)基本组件类
这是Live555源码阅读的第一部分,包括了时间类,延时队列类,处理程序描述类,哈希表类这四个大类. 这里是时间相关类的第一个部分. TimeVal类 TimeVal类定义在live555source ...
- HTML之文本框关键字显示
文本框默认显示 "请输入关键字",当鼠标点击输入框的时候, "请输入关键字"这几个字消失,移出文本框又显示出来 <!DOCTYPE html> &l ...
- NFS和mount常用参数详解
NFS权限参数配置 ro 只读访问 rw 读写访问 sync 所有数据在请求时写入共享 async NFS在写入数据前可以相应请求 secure NFS通过1024以下的安全TCP/IP端口发送 in ...
- VB 编程
error播放出错提示音 errorPromptVoice() 返回一个字符串,其中包含从某个字符串右端开始的指定数量的字符 Microsoft.VisualBasic.Right(strBt45Te ...
- .pyc文件是什么?
一个.py文件就是一个模块,而模块名就是文件名,如module.py的模块名就是module.如果module.py文件里定义了一些函数和变量,而外部文件如test_module.py想使用这些函数或 ...