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的 ...
随机推荐
- python del 注意点
>>> del a[:] >>> a [] del也可以用于删除整个变量: >>> >>> del a 之后再引用名称 a 将会 ...
- Android坐标系统
1 背景 去年有很多人私信告诉我让说说自定义控件,其实通观网络上的很多博客都在讲各种自定义控件,但是大多数都是授之以鱼,却很少有较为系统性授之于渔的文章,同时由于自己也迟迟没有时间规划这一系列文章, ...
- 9.5---括号是否有效(CC150)
leetcode原题: char temp ; Stack<Character> stack = new Stack<Character>();//error:Stack< ...
- python之路一
Python前世今生 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC ...
- java的事务处理
本文转自http://zhenchengchagangzi.iteye.com/blog/1159493 java的事务处理,如果对数据库进行多次操作,每一次的执行或步骤都是一个事务.如果数据库操作在 ...
- WinForm开发框架--动态读取DLL模式
1\ WinForm开发框架--动态读取DLL模式 http://www.2cto.com/kf/201306/217199.html 2\ 广州爱奇迪 http://www.iqidi. ...
- 【leetcode】N-Queens
N-Queens The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no tw ...
- C#之new修饰符
转自MSDN:https://msdn.microsoft.com/zh-cn/library/435f1dw2.aspx new隐藏基类成员 在用作修饰符时,new关键字可以显式的隐藏从基类继承的 ...
- mount --bind 重启后失效的解决办法
vsftp不支持软链接,可以用mount来支持不同的目录结构 mount --bind /home/www/web/ROOT/img/upload /ftp/private/upload 重启后失效. ...
- js中修改标签的hidden属性
hidden属性在html5中,只要存在,就是隐藏效果,而不论值为多少 要显示元素,要删除hidden属性,而不是设置为false <script type="text/javascr ...