没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
TouchImageView继承自ImageView具有ImageView的所有功能;除此之外,还有缩放、拖拽、双击放大等功能,支持viewpager和scaletype,并伴有动画效果。 sharedConstructing private void sharedConstructing(Context context) { super.setClickable(true); this.context = context; mScaleDetector = new ScaleGestureDetector(context, new ScaleListener()); mGestureDet
资源推荐
资源详情
资源评论
Android使用使用ImageView实现支持手势缩放效果实现支持手势缩放效果
TouchImageView继承自ImageView具有ImageView的所有功能;除此之外,还有缩放、拖拽、双击放大等功能,支持
viewpager和scaletype,并伴有动画效果。
sharedConstructing
private void sharedConstructing(Context context) {
super.setClickable(true);
this.context = context;
mScaleDetector = new ScaleGestureDetector(context, new ScaleListener());
mGestureDetector = new GestureDetector(context, new GestureListener());
matrix = new Matrix();
prevMatrix = new Matrix();
m = new float[9];
normalizedScale = 1;
if (mScaleType == null) {
mScaleType = ScaleType.FIT_CENTER;
}
minScale = 1;
maxScale = 3;
superMinScale = SUPER_MIN_MULTIPLIER * minScale;
superMaxScale = SUPER_MAX_MULTIPLIER * maxScale;
setImageMatrix(matrix);
setScaleType(ScaleType.MATRIX);
setState(State.NONE);
onDrawReady = false;
super.setOnTouchListener(new PrivateOnTouchListener());
}
初始化,设置ScaleGestureDetector的监听器为ScaleListener,这是用来处理缩放手势的,设置GestureDetector的监听器为
GestureListener,这是用来处理双击和fling手势的,前两个手势都会引起图片的缩放,而fling会引起图片的移动。
mScaleDetector = new ScaleGestureDetector(context, new ScaleListener());
mGestureDetector = new GestureDetector(context, new GestureListener());
最后设置自定义View的touch事件监听器为PrivateOnTouchListener,这是touch事件的入口。
super.setOnTouchListener(new PrivateOnTouchListener());
PrivateOnTouchListener
private class PrivateOnTouchListener implements OnTouchListener {
//
// Remember last point position for dragging
//
private PointF last = new PointF();
@Override
public boolean onTouch(View v, MotionEvent event) {
mScaleDetector.onTouchEvent(event);
mGestureDetector.onTouchEvent(event);
PointF curr = new PointF(event.getX(), event.getY());
if (state == State.NONE || state == State.DRAG || state == State.FLING) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
last.set(curr);
if (fling != null)
fling.cancelFling();
setState(State.DRAG);
break;
case MotionEvent.ACTION_MOVE:
if (state == State.DRAG) {
float deltaX = curr.x - last.x;
float deltaY = curr.y - last.y;
float fixTransX = getFixDragTrans(deltaX, viewWidth, getImageWidth());
float fixTransY = getFixDragTrans(deltaY, viewHeight, getImageHeight());
matrix.postTranslate(fixTransX, fixTransY);
fixTrans();
last.set(curr.x, curr.y);
}
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP:
setState(State.NONE);
break;
}
}
setImageMatrix(matrix);
//
// User-defined OnTouchListener
//
if(userTouchListener != null) {
userTouchListener.onTouch(v, event);
}
//
// OnTouchImageViewListener is set: TouchImageView dragged by user.
//
if (touchImageViewListener != null) {
touchImageViewListener.onMove();
}
//
// indicate event was handled
//
return true;
}
}
触摸时会走到PrivateOnTouchListener的onTouch,它又会将捕捉到的MotionEvent交给mScaleDetector和mGestureDetector
来分析是否有合适的callback函数来处理用户的手势。
mScaleDetector.onTouchEvent(event);
mGestureDetector.onTouchEvent(event);
同时在当前状态是DRAG时将X、Y移动的距离赋值给变换矩阵
matrix.postTranslate(fixTransX, fixTransY);
给ImageView设置矩阵,完成X、Y的移动,即实现单指拖拽动作
setImageMatrix(matrix);
ScaleListener
private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
@Override
public boolean onScaleBegin(ScaleGestureDetector detector) {
setState(State.ZOOM);
return true;
}
@Override
public boolean onScale(ScaleGestureDetector detector) {
scaleImage(detector.getScaleFactor(), detector.getFocusX(), detector.getFocusY(), true);
//
// OnTouchImageViewListener is set: TouchImageView pinch zoomed by user.
//
if (touchImageViewListener != null) {
touchImageViewListener.onMove();
}
return true;
}
@Override
public void onScaleEnd(ScaleGestureDetector detector) {
super.onScaleEnd(detector);
setState(State.NONE);
boolean animateToZoomBoundary = false;
float targetZoom = normalizedScale;
if (normalizedScale > maxScale) {
targetZoom = maxScale;
animateToZoomBoundary = true;
} else if (normalizedScale < minScale) {
targetZoom = minScale;
animateToZoomBoundary = true;
}
if (animateToZoomBoundary) {
DoubleTapZoom doubleTap = new DoubleTapZoom(targetZoom, viewWidth / 2, viewHeight / 2, true);
compatPostOnAnimation(doubleTap);
}
}
}
两指缩放动作会走到ScaleListener的回调,在它的onScale回调中会处理图片的缩放
scaleImage(detector.getScaleFactor(), detector.getFocusX(), detector.getFocusY(), true);
剩余7页未读,继续阅读
资源评论
weixin_38629873
- 粉丝: 2
- 资源: 967
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 利用PyCharm和Conda实现GPU加速的深度学习模型实验
- 夜间照片去噪:基于小波分析的模极大值、相关性及阈值去噪法的原理与实例应用.zip
- 中国污水处理厂数据集-更新至2024年.xlsx
- 电机设计仿真 maxwell ansys 五相电机设计
- Android studio 记账管理期末大作业App源码
- 新能源汽车动力经济性能EDQ目标分解SSTS,100多行
- comsol本案例建立成二维轴对称模型,物理场采用两个PDE模块,分别表示水分场和温度场,一个固体力学模块,表示应力场 求解器在求解水热耦合问题中采用瞬态求解器,步长为1h,总时长48h;在求解应力
- comsol案例,水驱油,两相流,石油开发基础案例,一注四采 注水井采油井,开发井网.
- 2_认识实习总结报告撰写模板及要求.docx
- C++毕业设计基于opencv的考勤与信息管理系统源码+文档说明.zip
- COMSOL裂隙动水注浆扩散数值模拟 针对动水注浆中常用的2种速凝浆液,水泥–水玻璃浆液与高聚物改性水泥浆液,考虑浆液黏度时变特性,应用有限元计算软件COMSOL Multiphysics建立动水条
- linux常用命令大全.txt
- linux常用命令大全.txt
- linux常用命令大全.txt
- COMSOL断层突水非线性渗流-应力耦合案例 提供COMSOL流固耦合(岩土+Brinkman流体+蠕动流)案例文件,案例实现了Brinkman流体与蠕动流,岩土力的耦合 供大家交流学习,含参考文献
- 精简版X264视频压缩教程解析-从CLI参数到编码细节
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功