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的 ...
随机推荐
- android socket编程用Bufferreader读取的一个失败教训
由于我的手机需要用笔记本开的wifi,躺在床上玩手机时需要关电脑或者是要让电脑放歌的时候总是不想下床,于是我想能不能用一个APP,然后通过局域网实现在手机上对电脑进行操控呢?说干就干. 我在电脑上用的 ...
- BZOJ4411——[Usaco2016 Feb]Load balancing
1.题意: 给出N个平面上的点.保证每一个点的坐标都是正奇数. 你要在平面上画两条线,一条是x=a,一条是y=b,且a和b都是偶数. 直线将平面划成4个部分,要求包含点数最多的那个部分点数最少. 2. ...
- HDNOIP普及+提高整合
好久没有更新博客了...这几天一直在切 HDNOIP... 正式时跪惨了...所以考完后回来奋力切出了所有题. [COJ3351]HDNOIP201601回文质数 试题描述 回文数是具有对称性的自然数 ...
- WC总结
去了人生中第一次全国WC,在四川绵阳南山中学举行,去了这么一次,感受颇多,不忍心白白地让时间流逝,于是写篇随笔记录一下. 全程,共计8天. [第1天] 签到,拿餐票,看了看讲义,觉得要狗带. 开营仪式 ...
- 如何学习caffe
知乎上的讨论:https://www.zhihu.com/question/27982282 从0开始山寨caffe系列:http://www.cnblogs.com/neopenx/archive/ ...
- linux下使用ffmpeg将amr转成mp3
说明:AMR格式是智能手机上的常用音频文件格式,比MP3格式的压缩比大.同样时长的AMR文件大概是MP3的十分之一,所以在移动互联项目中应用比较广泛.但目前AMR格式在个人电脑上应用较少,所以目前大部 ...
- LINUX优化得很好的sysctl.conf配置
最近找了个不错的sysctl.conf的优化参数,在网站响应上已经算不错了的,time超时连接据说几乎为0了. 系统:centos 5.x sysctl.conf配置参数: kernel.msgmn ...
- 基于 REST 的 Web 服务:基础
代表性状态传输(Representational State Transfer,REST)在 Web 领域已经得到了广泛的接受,是基于 SOAP 和 Web 服务描述语言(Web Services D ...
- python判断文件和文件夹是否存在
import osos.path.isfile('test.txt') #如果不存在就返回Falseos.path.exists(directory) #如果目录或文件不存在就返回False
- 使用Java中File类批量创建文件和批量修改文件名
批量创建文件 int cont = 1; String s = "E:\\学习资料\\Java笔记-"; while(cont<100){ File f = new File ...