杨勇汉

1、首先说一下两个类：

# Matrix

## Class Overview

The Matrix class holds a 3x3 matrix for transforming coordinates. Matrix does not have a constructor, so it must be explicitly initialized using either reset() - to construct an identity matrix, or one of the set..() functions (e.g. setTranslate, setRotate, etc.).

Matrix的操作，总共分为translate(平移)，rotate(旋转)，scale(缩放)和skew(倾斜)四种，每一种变换在Android的API里都提供了set,post和pre三种操作方式,除了translate，其他三种操作都可以指定中心点。set是直接设置Matrix的值，每次set一次，整个Matrix的数组都会变掉。post是后乘，当前的矩阵乘以参数给出的矩阵。可以连续多次使用post，来完成所需的整个变换。

 boolean postTranslate(float dx, float dy) Postconcats the matrix with the specified translation.

 boolean postRotate(float degrees, float px, float py) Postconcats the matrix with the specified rotation.

# PointF

## Class Overview

PointF holds two float coordinates

PointF有两个浮点坐标

 final void set(float x, float y) Set the point's x and y coordinates
2、接下来是案例：

旋转拖拽后

``````public class MovePictureActivity extends Activity implements OnClickListener {
private Button button1, button2;
private ImageView image;
PointF startPoint = new PointF();// 有两PointF浮坐标
Matrix matrix = new Matrix();

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
init();
}

private void init() {
button1 = (Button) findViewById(R.id.button1);
button2 = (Button) findViewById(R.id.button2);
button1.setOnClickListener(this);
button2.setOnClickListener(this);
image = (ImageView) findViewById(R.id.image);
image.setOnTouchListener(new ImageViewOnTouchListener());// 为image绑上触摸事件监听
}

@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button1:
matrix.postRotate(90, image.getWidth() / 2, image.getHeight() / 2);// 顺时针旋转90度,并且以image.getWidth()/2、image.getHeight()/2为中心旋转；
break;
case R.id.button2:
matrix.postRotate(-90, image.getWidth() / 2, image.getHeight() / 2);// 逆时针旋转90度
break;
}
image.setImageMatrix(matrix);
}

private class ImageViewOnTouchListener implements OnTouchListener {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction() & MotionEvent.ACTION_MASK) {// 这里取出来的是event.getAction()返回的值的低八位，MotionEvent.ACTION_MASK是255，
case MotionEvent.ACTION_DOWN:
startPoint.set(event.getX(), event.getY());
break;
case MotionEvent.ACTION_MOVE:// 移动过程，该事件会不断被触发
float dx = event.getX() - startPoint.x;
float dy = event.getY() - startPoint.y;
matrix.postTranslate(dx, dy);
startPoint.set(event.getX(), event.getY());
break;
}
image.setImageMatrix(matrix);
return true;
}

}
}``````

``image.setOnTouchListener(new ImageViewOnTouchListener());// 为image绑上触摸事件监听``

# View.OnTouchListener

Interface definition for a callback to be invoked when a touch event is dispatched to this view. The callback will be invoked before the touch event is given to the view.

### 杨勇汉

CSS3 动画简单入门

moonlightL
2017/10/13
0
0
Android ui utils-简单实用的Android界面工具

2011/12/14
8K
0
Android 4.0通过新的特性统一了平板电脑与手机

Android 4.0可以运行在平板电脑与手机上，并且提供了一些针对UI、通信、共享、媒体、连接、输入类型与企业的新特性。 Google于2011年2月发布了Android 3.0（Honeycomb），但该版本只面向平板...

2012/02/07
2.3K
4
android翻译应用、地图轨迹、视频广告、React Native知乎日报、网络请求框架等源码

Android精选源码 android实现高德地图轨迹效果源码(http://www.apkbus.com/thread-601383-1-1.html) 使用React Native（Android和iOS）实现的 知乎日报效果源码(http://www.apkbus.com/thre...

2018/07/03
28
0
Android Tween动画之RotateAnimation实现图片不停旋转

2013/09/26
13.5K
2

OSChina 周一乱弹 —— 年迈渔夫遭黑帮袭抢

Osc乱弹歌单（2019）请戳（这里） 【今日歌曲】 @tom_tdhzz ：#今日歌曲推荐# 分享Elvis Presley的单曲《White Christmas》: 《White Christmas》- Elvis Presley 手机党少年们想听歌，请使劲...

1K
20
CentOS7.6中安装使用fcitx框架

5
0
《Designing.Data-Intensive.Applications》笔记 四

8
0
docker 使用mysql

1， 进入容器 比如 myslq1 里面进行操作 docker exec -it mysql1 /bin/bash 2. 退出 容器 交互： exit 3. mysql 启动在容器里面，并且 可以本地连接mysql docker run --name mysql1 --env MY...

16
0
python数据结构

1、字符串及其方法（案例来自Python-100-Days） def main(): str1 = 'hello, world!' # 通过len函数计算字符串的长度 print(len(str1)) # 13 # 获得字符串首字母大写的...

huijue

6
0