文档章节

Android实现图片顺时逆时旋转及拖拽显示效果

 杨勇汉
发布于 2015/02/01 14:03
字数 769
阅读 23
收藏 0

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.).

矩阵类拥有3 x3的坐标变换矩阵。没有一个构造函数矩阵,所以它必须显式初始化的使用或重置()-如何构建一个矩阵,或者一个场景……()的功能(例如,setRotate setTranslate等。)

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

接下来我们用到了两个方法:

平移方法:两个参数分别是要移到的x、y坐标

boolean postTranslate(float dx, float dy)
Postconcats the matrix with the specified translation.
和旋转方法:第一个参数是旋转多少度,正数是顺时针,负数是逆时针;第二三参数是按某个点旋转的x、y坐标;

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

PointF

Class Overview

PointF holds two float coordinates

PointF有两个浮点坐标

我们要用到该类的一个方法:设置点的x和y坐标

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

首先看一下效果图:

  旋转拖拽后

布局很简单在此不再给出!直接看java代码:

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绑定监听事件,
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.

接口定义作为一个回调函数被调用时被派遣去触摸事件这一观点。回调函数被调用之前会触摸事件是给你尽情的观看。

原代码下载地址:http://download.csdn.net/download/rhljiayou/4286882


本文转载自:http://blog.csdn.net/rhljiayou/article/details/7197048

粉丝 2
博文 69
码字总数 0
作品 0
东城
私信 提问
CSS3 动画简单入门

原文地址:CSS3 动画简单入门 博客地址:www.extlight.com 一、基本介绍 1.1 动画属性 1.2 案例模板如下: 初始效果: 两张图片重合 二、transform 2.1 移动(translate) 功能:让元素进行位...

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

也许有的开发者觉得在Android开发中用户界面设计和实现简陋而麻烦,缺乏有效的帮助和支持。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实现图片不停旋转

本文主要介绍Android中如何使用rotate实现图片不停旋转的效果。Android 平台提供了两类动画,一类是 Tween 动画,即通过对场景里的对象不断做图像变换(平移、缩放、旋转)产生动画效果;第二类...

崔同亮
2013/09/26
13.5K
2

没有更多内容

加载失败,请刷新页面

加载更多

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

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

小小编辑
今天
1K
20
CentOS7.6中安装使用fcitx框架

内容目录 一、为什么要使用fcitx?二、安装fcitx框架三、安装搜狗输入法 一、为什么要使用fcitx? Gnome3桌面自带的输入法框架为ibus,而在使用ibus时会时不时出现卡顿无法输入的现象。 搜狗和...

技术训练营
昨天
5
0
《Designing.Data-Intensive.Applications》笔记 四

第九章 一致性与共识 分布式系统最重要的的抽象之一是共识(consensus):让所有的节点对某件事达成一致。 最终一致性(eventual consistency)只提供较弱的保证,需要探索更高的一致性保证(stro...

丰田破产标志
昨天
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

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部