Viewpager中使得ImageView放大缩小
来源:互联网 发布:淘宝如何用鹊桥 购物 编辑:程序博客网 时间:2024/05/18 00:10
import android.content.Context;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.ScaleGestureDetector;
import android.view.View;
import android.widget.ImageView;
public class TouchImageView extends ImageView {
Matrix matrix;static final int NONE = 0;static final int DRAG = 1;static final int ZOOM = 2;int mode = NONE;PointF last = new PointF();PointF start = new PointF();float minScale = 1f;float maxScale = 3f;float[] m;int viewWidth, viewHeight;static final int CLICK = 3;float saveScale = 1f;protected float origWidth, origHeight;int oldMeasuredWidth, oldMeasuredHeight;ScaleGestureDetector mScaleDetector;Context context;public TouchImageView(Context context) { super(context); sharedConstructing(context);}public TouchImageView(Context context, AttributeSet attrs) { super(context, attrs); sharedConstructing(context);}private void sharedConstructing(Context context) { super.setClickable(true); this.context = context; mScaleDetector = new ScaleGestureDetector(context, new ScaleListener()); matrix = new Matrix(); m = new float[9]; setImageMatrix(matrix); setScaleType(ScaleType.MATRIX); setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { mScaleDetector.onTouchEvent(event); PointF curr = new PointF(event.getX(), event.getY()); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: last.set(curr); start.set(last); mode = DRAG; break; case MotionEvent.ACTION_MOVE: if (mode == DRAG) { float deltaX = curr.x - last.x; float deltaY = curr.y - last.y; float fixTransX = getFixDragTrans(deltaX, viewWidth, origWidth * saveScale); float fixTransY = getFixDragTrans(deltaY, viewHeight, origHeight * saveScale); matrix.postTranslate(fixTransX, fixTransY); fixTrans(); last.set(curr.x, curr.y); } break; case MotionEvent.ACTION_UP: mode = NONE; int xDiff = (int) Math.abs(curr.x - start.x); int yDiff = (int) Math.abs(curr.y - start.y); if (xDiff < CLICK && yDiff < CLICK) performClick(); break; case MotionEvent.ACTION_POINTER_UP: mode = NONE; break; } setImageMatrix(matrix); invalidate(); return true; } });}public void setMaxZoom(float x) { maxScale = x;}private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener { @Override public boolean onScaleBegin(ScaleGestureDetector detector) { mode = ZOOM; return true; } @Override public boolean onScale(ScaleGestureDetector detector) { float mScaleFactor = detector.getScaleFactor(); float origScale = saveScale; saveScale *= mScaleFactor; if (saveScale > maxScale) { saveScale = maxScale; mScaleFactor = maxScale / origScale; } else if (saveScale < minScale) { saveScale = minScale; mScaleFactor = minScale / origScale; } if (origWidth * saveScale <= viewWidth || origHeight * saveScale <= viewHeight) matrix.postScale(mScaleFactor, mScaleFactor, viewWidth / 2, viewHeight / 2); else matrix.postScale(mScaleFactor, mScaleFactor, detector.getFocusX(), detector.getFocusY()); fixTrans(); return true; }}void fixTrans() { matrix.getValues(m); float transX = m[Matrix.MTRANS_X]; float transY = m[Matrix.MTRANS_Y]; float fixTransX = getFixTrans(transX, viewWidth, origWidth * saveScale); float fixTransY = getFixTrans(transY, viewHeight, origHeight * saveScale); if (fixTransX != 0 || fixTransY != 0) matrix.postTranslate(fixTransX, fixTransY);}float getFixTrans(float trans, float viewSize, float contentSize) { float minTrans, maxTrans; if (contentSize <= viewSize) { minTrans = 0; maxTrans = viewSize - contentSize; } else { minTrans = viewSize - contentSize; maxTrans = 0; } if (trans < minTrans) return -trans + minTrans; if (trans > maxTrans) return -trans + maxTrans; return 0;}float getFixDragTrans(float delta, float viewSize, float contentSize) { if (contentSize <= viewSize) { return 0; } return delta;}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); viewWidth = MeasureSpec.getSize(widthMeasureSpec); viewHeight = MeasureSpec.getSize(heightMeasureSpec); if (oldMeasuredHeight == viewWidth && oldMeasuredHeight == viewHeight || viewWidth == 0 || viewHeight == 0) return; oldMeasuredHeight = viewHeight; oldMeasuredWidth = viewWidth; if (saveScale == 1) { //Fit to screen. float scale; Drawable drawable = getDrawable(); if (drawable == null || drawable.getIntrinsicWidth() == 0 || drawable.getIntrinsicHeight() == 0) return; int bmWidth = drawable.getIntrinsicWidth(); int bmHeight = drawable.getIntrinsicHeight(); Log.d("bmSize", "bmWidth: " + bmWidth + " bmHeight : " + bmHeight); float scaleX = (float) viewWidth / (float) bmWidth; float scaleY = (float) viewHeight / (float) bmHeight; scale = Math.min(scaleX, scaleY); matrix.setScale(scale, scale); // Center the image float redundantYSpace = (float) viewHeight - (scale * (float) bmHeight); float redundantXSpace = (float) viewWidth - (scale * (float) bmWidth); redundantYSpace /= (float) 2; redundantXSpace /= (float) 2; matrix.postTranslate(redundantXSpace, redundantYSpace); origWidth = viewWidth - 2 * redundantXSpace; origHeight = viewHeight - 2 * redundantYSpace; setImageMatrix(matrix); } fixTrans();}
}
阅读全文
0 0
- Viewpager中使得ImageView放大缩小
- ImageView 放大缩小
- 用Martix 放大缩小ImageView
- 可放大缩小的ImageView
- Viewpager中图片缩小放大功能(个人相册)
- 基于ImageView的多点触控,双击放大缩小以及结合ViewPager的事件冲突
- ImageView+ViewPager+PhotoView实现朋友圈图片点击全屏查看支持放大缩小
- viewpager实现图片放大缩小
- 手指移动和放大缩小imageview
- android ImageView-----图片放大或者缩小
- android 动态放大缩小拖曳图片imageView
- android之imageView放大缩小与旋转
- android 自定义imageview实现 图片放大缩小
- imageview放大缩小以及滑动翻页
- 安卓 ImageView伸缩放大缩小
- 放大缩小图片ImageView的实现
- 自定义ImageView实现自动放大缩小动画
- 手势放大缩小的ImageView,双击放大、还原
- C语言之常见问题总结
- Android数据存储之Android 6.0运行时权限下文件存储的思考
- 解析微服务架构(一):什么是微服务
- ##### sublineText3 标题中文为方框的决绝方案
- Java面试题全集(下)
- Viewpager中使得ImageView放大缩小
- Hadoop核心机制详细解析
- flux | fecebookflux | reflux | redux 都是些啥
- Linux中修改环境变量及生效方法
- Unity中使用GL在Camera上画线
- snap-社交网络分析
- u-boot第一阶段分析(一)
- Ubuntu下安装hive,并配置mysql作为元数据库
- 在线倍增算法求LCA