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

本文实例介绍了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图片双击放大及缩小的全部代码,希望对大家的学习有所帮助。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索android
imageview双击放大、imageview放大缩小、imageview 可放大缩小、缩小放大的imageview、ios 双击图片放大缩小,以便于您获取更多的相关知识。

时间: 2024-09-29 07:38:38

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

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

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

Android开发ImageView图片无法显示解决过程_Android

今天碰到一个非常奇怪的问题: 在Android中ImageView无法显示加载的本地SDCard图片. 具体过程是:先调用本地照相机程序摄像,然后将拍摄的图片加载在ImageView中显示. 复制代码 代码如下: public class ActiEnvi extends Activity { static final String TAG = "ActiEnvi"; private static final int REQ_CODE_CAMERA = 0x1; private Str

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 第三

Android实现图片反转、翻转、旋转、放大和缩小_Android

********************************************************************** android 实现图片的翻转 ********************************************************************** Resources res = this.getContext().getResources(); img = BitmapFactory.decodeResource(res, R.

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