package com.jhqc.vr.travel.weight.event;
/**
* Created by Solomon on 2017/10/18 0018.
*/
import android.graphics.Matrix;
import android.graphics.PointF;
import android.view.MotionEvent;
import android.view.View;
import com.jhqc.vr.travel.util.LogUtils;
import com.jhqc.vr.travel.weight.MapPointView;
import com.jhqc.vr.travel.weight.MapView;
import com.jhqc.vr.travel.weight.event.support.MapMatrix;
import java.util.Iterator;
/**
* Created by Solomon on 2017/10/17 0017.
* 地图
*/
public class MapTouchListener implements View.OnTouchListener {
MapView mMapView;
/**
* 记录是拖拉照片模式还是放大缩小照片模式
*/
private int mode = 0;// 初始状态
/**
* 拖拉照片模式
*/
private static final int MODE_DRAG = 1;
/**
* 放大缩小照片模式
*/
private static final int MODE_ZOOM = 2;
/**
* 用于记录开始时候的坐标位置
*/
private PointF startPoint = new PointF();
/**
* 用于记录拖拉图片移动的坐标位置
*/
private MapMatrix matrix;
/**
* 用于记录图片要进行拖拉时候的坐标位置
*/
private Matrix currentMatrix;
/**
* 两个手指的开始距离
*/
private float downDistance;
/**
* 两个手指的中间点
*/
private PointF middlePoint;
public MapTouchListener(MapView mapView) {
this.mMapView = mapView;
Matrix scrMatrix = this.mMapView.baseImageView.getImageMatrix();
currentMatrix = new Matrix(scrMatrix);
matrix = new MapMatrix();
matrix.set(currentMatrix);
this.mMapView.baseImageView.setImageMatrix(matrix);
}
@Override
public boolean onTouch(View v, MotionEvent event) {
/** 通过与运算保留最后八位 MotionEvent.ACTION_MASK = 255 */
switch (event.getAction() & MotionEvent.ACTION_MASK) {
// 手指压下屏幕
case MotionEvent.ACTION_DOWN:
mode = MODE_DRAG;
this.mMapView.Touch_longPressTag = true;
this.mMapView.downTime = System.currentTimeMillis();
if (mMapView.isScaleEnable()) {
// 记录ImageView当前的移动位置
currentMatrix.set(this.mMapView.baseImageView.getImageMatrix());
startPoint.set(event.getX(), event.getY());
this.mMapView.setTouchDownX(event.getX());
this.mMapView.setTouchDownY(event.getY());
}
break;
// 手指在屏幕上移动,改事件会被不断触发
case MotionEvent.ACTION_MOVE:
if (mMapView.isScaleEnable()) {
float[] values = new float[9];
currentMatrix.getValues(values);
PointF pointLT = mMapView.baseImageView.getLeftPointF(values);
PointF pointRB = mMapView.baseImageView.getRightBottomPointF(values);
// 拖拉图片
if (mode == MODE_DRAG) {
float dx = event.getX() - startPoint.x; // 得到x轴的移动距离
float dy = event.getY() - startPoint.y; // 得到x轴的移动距离
float realW = mMapView.baseImageView.getRealWidth(values);
float realH = mMapView.baseImageView.getRealHeight(values);
float width = mMapView.baseImageView.getImageWidth();
float height = mMapView.baseImageView.getImageHeight();
LogUtils.logView("-----------------");
////////////////////////////////////start////////////////////////////////////
{ /** 拦截边界*/
LogUtils.logView("手势移动x:" + dx);
LogUtils.logView("手势移动y:" + dy);
/** 左滑:图片向右移:检查左边界,如果超出边界,则重置 */
if (dx > 0) {
if (pointLT.x >= 0) { //如果图片已经超出,还原
dx = -pointLT.x;
} else if ((realW - Math.abs(pointLT.x) < dx)) {
dx = realW - Math.abs(pointLT.x);
} else if ((realW - Math.abs(pointRB.x) < dx)) {
dx = realW - Math.abs(pointRB.x);
}
LogUtils.logView("x轴出左边界了,重置移动位置:" + dx);
} else if (dx < 0) { /** 右滑:图片向左移:检查右边界,如果超出边界,则重置 */
if ((pointRB.x - Math.abs(dx)) <= width || pointRB.x <= width) {
dx = -(pointRB.x - width);
LogUtils.logView("x轴出右边界了,重置移动位置:" + dx);
}
}
if (dy > 0) { /** 上滑:图片下移:检查上边界,如果超出边界,则重置 */
if (pointLT.y >= 0) { //如果图片已经超出,还原
dy = -pointLT.y;
} else if ((realH - Math.abs(pointLT.y) < dy)) {
dy = realH - Math.abs(pointLT.y);
} else if ((realH - Math.abs(pointRB.y) < dy)) {
dy = realH - Math.abs(pointRB.y);
}
LogUtils.logView("y轴出上边界了,重置移动位置:" + dy);
} else if (dy < 0) { /** 下滑:图片上移:检查下边界,如果超出边界,则重置 */
if ((pointRB.y - Math.abs(dy)) <= height || pointRB.y <= height) {
dy = -(pointRB.y - height);
LogUtils.logView("y轴出下边界了,重置移动位置:" + dy);
}
}
LogUtils.logView("pointLT.x:" + pointLT.x);
LogUtils.logView("pointLT.y:" + pointLT.y);
LogUtils.logView("pointRB.x:" + pointRB.x);
LogUtils.logView("pointRB.y:" + pointRB.y);
LogUtils.logView("realW:" + realW);
LogUtils.logView("realH:" + realH);
LogUtils.logView("width:" + width);
LogUtils.logView("height:" + height);
LogUtils.logView("-----------------");
}
/////////////////////////////////////end////////////////////////////////////
// 在没有移动之前的位置上进行移动
matrix.set(currentMatrix);
matrix.postTranslate(dx, dy);
matrix.setRealPoint(realW, realH);
matrix.setViewPoint(width, height);
matrix.setRBPoint(pointRB.x, pointRB.y);
// 如果 手指移动 距离不超过 5 个像素点 的 视为 没有移动
float offset = (float) Math.sqrt(dx * dx + dy * dy);
this.mMapView.Touch_longPressTag = offset < 5 ? true : false;
}
// 放大缩小图片
else if (mode == MODE_ZOOM) {
MapTouchListener (2).rar_图片拖动放大_拖动
版权申诉
63 浏览量
2022-09-15
00:00:45
上传
评论
收藏 4KB RAR 举报
周楷雯
- 粉丝: 78
- 资源: 1万+
最新资源
- 基于 Java的班级管理系统课程设计
- 深入探索Suno AI:教程、元标签与案例分析.pdf
- 超市会员积分管理系统主要用于实现了企业管理数据统计等
- 基于 Java的班级管理系统
- MyBatis 动态 SQL:灵活而强大的查询构建器.pdf
- com.accordion.prettyo.apk
- 毕业设计:基于SSM的mysql-ssm软件bug管理系统(源码 + 数据库 + 说明文档)
- MTSQL8.0.35windows(64bit)-mysql-installer-community-8.0.35.0
- 人工智能引领音乐创作新时代之Suno AI
- Public-bicycle-usage-forecast-master.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈