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的 ...
随机推荐
- iOS开发——UI进阶篇(十八)核心动画小例子,转盘(裁剪图片、自定义按钮、旋转)图片折叠、音量震动条、倒影、粒子效果
一.转盘(裁剪图片.自定义按钮.旋转) 1.裁剪图片 将一张大图片裁剪为多张 // CGImageCreateWithImageInRect:用来裁剪图片 // image:需要裁剪的图片 // re ...
- 解决Eclipse中文乱码
http://hsj69106.blog.51cto.com/1017401/595598 使用Eclipse编辑文件经常出现中文乱码或者文件中有中文不能保存的问题,Eclipse提供了灵活的设置文件 ...
- OpenGL中平移、旋转、缩放矩阵堆栈操作
在OpenGL中,图元的几何变换均为线性变换,通过矩阵变换实现.OpenGL中的坐标用齐次坐标表示,即(x,y,z)表示成(x',y',z',h),其中x=x'/h; y=y'/h; z=z'/h. ...
- IOS系统ipa软件包在线安装
如果iis不支持ipa和plist下载,可以添加memi类型. ipa application/x-plist plist application/xml 下载用普通链接即可: <a h ...
- 2.1---删除链表中重复元素(CC150)
分成两种,1种开了额外空间,临时缓冲区,一种没有开 import java.util.HashSet; import java.util.Set; class ListNode{ int data; ...
- python 模块之间的变量共享
才疏学浅,只知道两种方式: 1. 通过__builtin__实现: builtin1.py import __builtin__ __builtin__.some_global_var_among_m ...
- UOJ 做题记录
UOJ 做题记录 其实我这么弱> >根本不会做题呢> > #21. [UR #1]缩进优化 其实想想还是一道非常丝播的题目呢> > 直接对于每个缩进长度统计一遍就好 ...
- Ajax基础2
什么是服务器 网页浏览过程的分析 如何配置自己的服务器程序(AMP) 什么是Ajax 无刷新数据读取 异步,同步 Ajax基础(2) 使用Ajax 基础请求显示txt的文件 字符集编码 缓存,阻止缓存 ...
- python——常用功能之文本处理
前言 在生活.工作中,python一直都是一个好帮手.在python的众多功能中,我觉得文本处理是最常用的.下面是平常使用中的一些总结.环境是python 3.3 0. 基础 在python中,使用s ...
- Clone Graph
Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors. OJ's ...