Android实现ImageView图片双击放大及缩小

本文实例介绍了Android实现ImageView图片双击放大及缩小的相关技巧,分享给大家供大家参考,具体内容如下

public class DoubleScaleImageView extends ImageView implements OnTouchListener, OnGlobalLayoutListener { private boolean isFirst = false; private float doubleScale;// 双击放大的值 private Matrix mScaleMatrix; private float defaultScale;// 默认的缩放值 private int mLastPinterCount;// 记录上一次多点触控的数量 private float mLastX; private float mLastY; private int mTouchSlop; private boolean isCanDrag; private boolean isCheckLeft; private boolean isCheckTop; private GestureDetector mGestureDetector; public DoubleScaleImageView(Context context) { this(context, null); } public DoubleScaleImageView(Context context, AttributeSet attrs) { this(context, attrs, 0); } @SuppressLint("ClickableViewAccessibility") public DoubleScaleImageView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); mScaleMatrix = new Matrix(); setScaleType(ScaleType.MATRIX); setOnTouchListener(this); // getScaledTouchSlop是一个距离,表示滑动的时候,手的移动要大于这个距离才开始移动控件。如果小于这个距离就不触发移动控件 mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop(); mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() { @Override public boolean onDoubleTap(MotionEvent e) { float x = e.getX(); float y = e.getY(); if (getScale() < doubleScale) { mScaleMatrix.postScale(doubleScale / getScale(), doubleScale / getScale(), x, y);// 放大 } else { mScaleMatrix.postScale(defaultScale / getScale(), defaultScale / getScale(), x, y);// 缩小 } setImageMatrix(mScaleMatrix); return super.onDoubleTap(e); } }); } @Override protected void onAttachedToWindow() {// view附加到窗体上时调用该方法 super.onAttachedToWindow(); getViewTreeObserver().addOnGlobalLayoutListener(this); } @SuppressWarnings("deprecation") @Override protected void onDetachedFromWindow() {// 将视图从窗体上分离的时候调用该方法。 super.onDetachedFromWindow(); getViewTreeObserver().removeGlobalOnLayoutListener(this); } @Override public void onGlobalLayout() {// 在这个方法中获取ImageView加载完成后的图片 if (!isFirst) { // 获取控件的宽度和高度 int width = getWidth(); int height = getHeight(); // 得到我们的图片以及图片的宽度及高度 Drawable drawable = getDrawable(); if (drawable == null) { return; } int imageWidth = drawable.getIntrinsicWidth();// 图片的宽度 int imageHeight = drawable.getIntrinsicHeight();// 图片的高度 float scale = 1.0f; // 如果图片宽度大于控件宽度,但是图片高度小于控件 高度,我们要缩小图片 if (imageWidth > width && imageHeight < height) { scale = width * 1.0f / imageWidth; } // 如果图片宽度小于控件宽度,但是图片高度大于控件 高度,我们要缩小图片 if (imageWidth < width && imageHeight > height) { scale = height * 1.0f / imageHeight; } // 如果图片的宽度都 大于或小于控件宽度,我们则要对图片进行对应缩放,保证图片占满控件 if ((imageWidth > width && imageHeight > height) || (imageWidth < width && imageHeight < height)) { scale = Math.min(width * 1.0f / imageWidth, height * 1.0f / imageHeight); } // 初始化对应的缩放值 defaultScale = scale; doubleScale = defaultScale * 2; // 图片缩放后,将图片要移动到控件中心 int dx = width / 2 - imageWidth / 2; int dy = height / 2 - imageHeight / 2; mScaleMatrix.postTranslate(dx, dy); mScaleMatrix.postScale(defaultScale, defaultScale, width / 2, height / 2); setImageMatrix(mScaleMatrix); isFirst = true; } } @SuppressLint("ClickableViewAccessibility") @Override public boolean onTouch(View v, MotionEvent event) { if (mGestureDetector.onTouchEvent(event)) { return true; } float x = 0; float y = 0; int pointerCount = event.getPointerCount();// 获取放在屏幕上的手指数量 for (int i = 0; i < pointerCount; i++) { x += event.getX(i); y += event.getY(i); } x /= pointerCount; y /= pointerCount; if (mLastPinterCount != pointerCount) { isCanDrag = false; mLastX = x; mLastY = y; } mLastPinterCount = pointerCount; switch (event.getAction()) { case MotionEvent.ACTION_MOVE: float dx = x - mLastX; float dy = y - mLastY; isCanDrag = isMove(dx, dy); if (isCanDrag) { RectF rectf = getMatrixRectf(); if (null != getDrawable()) { isCheckLeft = isCheckTop = true; if (rectf.width() < getWidth()) {// 如果图片宽度小于控件宽度(屏幕宽度)不允许横向移动 dx = 0; isCheckLeft = false; } if (rectf.height() < getHeight()) {// 如果图片高度小于控件高度(屏幕高度)不允许纵向移动 dy = 0; isCheckTop = false; } mScaleMatrix.postTranslate(dx, dy); checkTranslateWithBorder(); setImageMatrix(mScaleMatrix); } } mLastX = x; mLastY = y; break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: mLastPinterCount = 0; break; } return true; } /** * 移动图片时进行边界检查 * @description: * @date 2016-1-8 下午4:02:24 */ private void checkTranslateWithBorder() { RectF rectf = getMatrixRectf(); float delX = 0; float delY = 0; int width = getWidth(); int height = getHeight(); if (rectf.top > 0 && isCheckTop) { delY = -rectf.top; } if (rectf.bottom < height && isCheckTop) { delY = height - rectf.bottom; } if (rectf.left > 0 && isCheckLeft) { delX = -rectf.left; } if (rectf.right < width && isCheckLeft) { delX = width - rectf.right; } mScaleMatrix.postTranslate(delX, delY); } // 判断是否有移动 private boolean isMove(float x, float y) { return Math.sqrt(x * x + y * y) > mTouchSlop; } /** * 获取图片的位置 * @description: * @date 2016-1-8 上午9:02:10 */ private RectF getMatrixRectf() { Matrix matrix = mScaleMatrix; RectF recft = new RectF(); if (getDrawable() != null) { recft.set(0, 0, getDrawable().getIntrinsicWidth(), getDrawable().getIntrinsicHeight()); matrix.mapRect(recft); } return recft; } // 获取当前图片的缩放值 private float getScale() { float values[] = new float[9]; mScaleMatrix.getValues(values); return values[Matrix.MSCALE_X]; } }

以上就是安卓实现ImageView图片双击放大及缩小的全部代码,希望对大家的学习有所帮助。

时间: 2024-10-16 18:45:36

Android实现ImageView图片双击放大及缩小的相关文章

Android实现ImageView图片双击放大及缩小_Android

本文实例介绍了Android实现ImageView图片双击放大及缩小的相关技巧,分享给大家供大家参考,具体内容如下 public class DoubleScaleImageView extends ImageView implements OnTouchListener, OnGlobalLayoutListener { private boolean isFirst = false; private float doubleScale;// 双击放大的值 private Matrix mSc

Android App中实现可以双击放大和缩小图片功能的实例

先来看一个很简单的核心图片缩放方法: public static Bitmap scale(Bitmap bitmap, float scaleWidth, float scaleHeight) { int width = bitmap.getWidth(); int height = bitmap.getHeight(); Matrix matrix = new Matrix(); matrix.postScale(scaleWidth, scaleHeight); Log.i(TAG, "s

Android中imageView图片放大缩小及旋转功能示例代码

一.简介 二.方法 1)设置图片放大缩小效果 第一步:将<ImageView>标签中的android:scaleType设置为"fitCenter" android:scaleType="fitCenter" 第二步:获取屏幕的宽度 DisplayMetrics dm=new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); dm.widthPixels 第三

ListView图片的放大与缩小

问题描述 ListView图片的放大与缩小 如何在Android 对ListView 中的图片实现放大,缩小的功能 解决方案 能描述的在清楚一点吗,我不知道能不能帮你解决问题,但是没看出来你要说什么.

代码-在MFC中怎样通过滚动鼠标来实现图片的放大和缩小

问题描述 在MFC中怎样通过滚动鼠标来实现图片的放大和缩小 求一个形成的代码啊?不知道怎么弄,搞了半天,希望寻求帮助,谢谢大家了. 解决方案 首先,响应 滚轮移动 WM_MOUSEWHEEL OnMouseWheel 事件,然后,在事件的响应中完成图片的操作. 解决方案二: WM_MOUSEWHELL BitBlt/StrectchBlt()贴图.

怎么样在C#中控制图片的放大、缩小和移动

问题描述 怎么样在C#中控制图片的放大.缩小和移动但是不改变PictureBox的大小不知道怎么写这么一个代码,有没有示例代码? 解决方案 解决方案二:sf解决方案三:GDI+绘图

android获得ImageView图片的等级

android获得ImageView图片的等级问题 要实现的功能如下图,点击分享能显示选中与不选中状态,然后发送是根据状态来实现具体分享功能. 在gridview中有5个子项,每个子元素都有两张图片A,B的level设置分别为0,1:点击图片使图片AB切换,前题是要能知道当前图片的等级.但这里只有设置等级的方法,设置图片的等级setImageLevel(1); Debug时能看到当前子元素的图片等级,如下: 不能获得当前等级,只能更换思路:定义一个数组,对应每个子元素的状态  final int

android Matrix实现图片随意放大缩小或拖动

本文实例为大家分享了android Matrix图片随意放大缩小和拖动的具体代码,供大家参考,具体内容如下 step1:新建一个项目DragAndZoom,并准备一张照片放在res/drawable-hdpi目录下,如下图所示: step2: 设置应用的UI界面,在main.xml中设置: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://

Android实现ImageView图片缩放和拖动_Android

今天我们来编写一个缩放效果的ImageView ,网上有很多人都讲了这些.但有许多人都直接使用了库文件, 那么我们今天做的是直接上代码编写一个拖动和缩放的ImageView,具体看效果图 那么简单了分析一下.在手机上缩放图片和拖动要用到什么?手指对不对 那么控件上什么事件和手机有关.View.OnTouchListener 对不对. ok,那么先新建一个Class ··· public class BaseDragZoomImageView extends ImageView implement