android 拖拉和放大
public class MainActivity extends Activity {
private ImageView imageView; @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main); imageView = (ImageView) this.findViewById(R.id.imageView);
//为组件设置触摸监听器
imageView.setOnTouchListener(new TouchListener());
} private final class TouchListener implements OnTouchListener{
private PointF startPoint = new PointF();
private Matrix matrix = new Matrix();
private Matrix currentMatrix = new Matrix();
private int mode = 0;
private static final int DRAG = 1;
private static final int ZOOM = 2;
private float startDis;//开始距离
private PointF midPoint;//中间点 public boolean onTouch(View v, MotionEvent event) {
//event.getAction()返回的是一个int类型的数据,底8位代表事件, & MotionEvent.ACTION_MASK(255)返回底八位的数字
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN://手指压下屏幕
//设置模式为拖拉
mode = DRAG;
currentMatrix.set(imageView.getImageMatrix());//记录ImageView当前的移动位置
startPoint.set(event.getX(), event.getY());
break; case MotionEvent.ACTION_MOVE://手指在屏幕移动,该 事件会不断地触发
if(mode == DRAG){
float dx = event.getX() - startPoint.x;//得到在x轴的移动距离
float dy = event.getY() - startPoint.y;//得到在y轴的移动距离
matrix.set(currentMatrix);//在没有进行移动之前的位置基础上进行移动
matrix.postTranslate(dx, dy);
}else if(mode == ZOOM){//缩放
float endDis = distance(event);//结束距离
if(endDis > 10f){
float scale = endDis / startDis;//得到缩放倍数
matrix.set(currentMatrix);
matrix.postScale(scale, scale, midPoint.x, midPoint.y);
}
}
break; case MotionEvent.ACTION_UP://手指离开屏
case MotionEvent.ACTION_POINTER_UP://有手指离开屏幕,但屏幕还有触点(手指)
mode = 0;
break; case MotionEvent.ACTION_POINTER_DOWN://当屏幕上还有触点(手指),再有一个手指压下屏幕
mode = ZOOM;
startDis = distance(event);
if(startDis > 10f){
midPoint = mid(event);
currentMatrix.set(imageView.getImageMatrix());//记录ImageView当前的缩放倍数
}
break;
}
imageView.setImageMatrix(matrix);
return true;
} }
/**
* 计算两点之间的距离
* @param event
* @return
*/
public static float distance(MotionEvent event) {
float dx = event.getX(1) - event.getX(0);
float dy = event.getY(1) - event.getY(0);
return FloatMath.sqrt(dx*dx + dy*dy);
}
/**
* 计算两点之间的中间点
* @param event
* @return
*/
public static PointF mid(MotionEvent event){
float midX = (event.getX(1) + event.getX(0)) / 2;
float midY = (event.getY(1) + event.getY(0)) / 2;
return new PointF(midX, midY);
}
}
android 拖拉和放大的更多相关文章
- Android 图片的放大缩小拖拉
package com.example.ImageView; import android.annotation.SuppressLint; import android.content.Contex ...
- Android多点触摸放大缩小图片
1.Activity package com.fit.touchimage; import android.app.Activity; import android.graphics.Bitmap; ...
- 41.Android之图片放大缩小学习
生活中经常会用到图片放大和缩小,今天简单学习下. 思路:1.添加一个操作图片放大和缩小类; 2. 布局文件中引用这个自定义控件; 3. 主Activity一些修改. 代码如下: 增加图片操作类: ...
- Android实现图片放大缩小
package com.min.Test_Gallery; import android.app.Activity; import android.graphics.Bitmap; import an ...
- Android PullToZoomListView实现放大回弹效果
另外一个相同项目的地址https://github.com/Frank-Zhu/PullZoomView 转自http://blog.csdn.net/wangjinyu501/article/det ...
- android bitmap的放大缩小
private static Bitmap big(Bitmap bitmap) { Matrix matrix = new Matrix(); matrix.postScale(1.5f,1.5f) ...
- Android 视频缩放/放大
1. 原理 不直接改变Codec输出的视频宽高比,而是改变视频播放器窗体的大小. 2. 设置Window 须要将Window设置未能够超出屏幕尺寸 mWindow.setFlags(WindowMan ...
- Android学习笔记总结
第一步: Android(1) - 在 Windows 下搭建 Android 开发环境,以及 Hello World 程序 搭建 Android 的开发环境,以及写一个简单的示例程序 · 在 Win ...
- Android优秀github项目整理
1.照相选相册,裁剪的 library TakePhotohttps://github.com/crazycodeboy/TakePhoto 2几行代码快速集成二维码扫描功能https://githu ...
随机推荐
- MVC http://stackoverflow.com/tags/model-view-controller/info
About model-view-controller Model–View–Controller (MVC) is an architectural pattern used in software ...
- HTTP请求方式: GET和POST的比较
GET和POST是HTTP的两个常用方法. 什么是HTTP? 超文本传输协议(HyperText Transfer Protocol -- HTTP)是一个设计来使客户端和服务器顺利进行通讯的协议 ...
- kubernetes容器集群部署Etcd集群
安装etcd 二进制包下载地址:https://github.com/etcd-io/etcd/releases/tag/v3.2.12 [root@master ~]# GOOGLE_URL=htt ...
- 如何打开mongo运行环境
新建一个文件夹,例如我的在E:\2016web\myapp\src\database 打开数据库 mongod --dbpath=E:/2016web/myapp/src/database 在新开一个 ...
- Docker基础(上)
Docker基础(上) 链接:https://pan.baidu.com/s/1KQjKml2OZAReYwOvpWD9XQ 提取码:6vo8 复制这段内容后打开百度网盘手机App,操作更方便哦 1. ...
- Spring 讲解(二 )
1.Spring 容器加载的3种方式 public class ServiceTest { public static void main(String[] args) { //Spring容器加载有 ...
- Vue学习笔记【27】——Vue路由(设置路由)
设置路由高亮 css: .router-link-active, /* vue-router*/ .myactive { color: red; font-weigh ...
- Windows服务 --- SqlDependency的使用
1 启用当前数据库的 SQL Server Service Broker a 检查Service Broker 是否开启 SELECT is_broker_enabled FROM sys.d ...
- AcWing 207. 球形空间产生器 (高斯消元)打卡
有一个球形空间产生器能够在n维空间中产生一个坚硬的球体. 现在,你被困在了这个n维球体中,你只知道球面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便于摧毁这个球形空间产生器. ...
- 常用跨域方法总结(2)——CORS
常用跨域方法总结(2)--CORS 上篇文章介绍了几种常用的跨域方法:常用跨域方法总结,本片为上一篇的补充,对比较重要的Cross Origin Resource Sharing详细介绍. CORS ...