iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Android实现手势控制ImageView图片大小
  • 141
分享到

Android实现手势控制ImageView图片大小

手势Android 2022-06-06 09:06:57 141人浏览 泡泡鱼
摘要

本文实例实现的主要功能是在ImageView中识别手势用以控制图片放大或缩小,具有一定的参考价值,分享给大家。 public class MatrixImageView ex

本文实例实现的主要功能是在ImageView中识别手势用以控制图片放大或缩小,具有一定的参考价值,分享给大家。


public class MatrixImageView extends ImageView {
  private GestureDetector mGestureDetector;
  private Matrix mMatrix = new Matrix();
  private float mImageWidth;
  private float mImageHeight;
  private float mScale;
  private OnMovingListener mMoveListener;
  private OnSingleTapListener mSingleTapListener;
  public MatrixImageView(Context context, AttributeSet attrs) {
    super(context, attrs);
    init();
  }
  public MatrixImageView(Context context) {
    super(context, null);
    init();
  }
  private void init() {
    MatrixTouchListener listener = new MatrixTouchListener();
    setOnTouchListener(listener);
    mGestureDetector = new GestureDetector(getContext(),
        new GestureListener(listener));
    setBackgroundColor(Color.BLACK);
    setScaleType(ScaleType.FIT_CENTER);
  }
  public void setOnMovingListener(OnMovingListener listener) {
    mMoveListener = listener;
  }
  public void setOnSingleTapListener(OnSingleTapListener onSingleTapListener) {
    this.mSingleTapListener = onSingleTapListener;
  }
  @Override
  public void setImageBitmap(Bitmap bm) {
    super.setImageBitmap(bm);
    if (getWidth() == 0) {
      ViewTreeObserver vto = getViewTreeObserver();
      vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
        public boolean onPreDraw() {
          initData();
          MatrixImageView.this.getViewTreeObserver()
              .removeOnPreDrawListener(this);
          return true;
        }
      });
    } else {
      initData();
    }
  }
  private void initData() {
    mMatrix.set(getImageMatrix());
    float[] values = new float[9];
    mMatrix.getValues(values);
    mImageWidth = getWidth() / values[Matrix.MSCALE_X];
    mImageHeight = (getHeight() - values[Matrix.MTRANS_Y] * 2)
        / values[Matrix.MSCALE_Y];
    mScale = values[Matrix.MSCALE_X];
  }
  public class MatrixTouchListener implements OnTouchListener {
    private static final int MODE_DRAG = 1;
    private static final int MODE_ZOOM = 2;
    private static final int MODE_UNABLE = 3;
    private static final float MAX_SCALE = 6;
    private static final float DOUBLE_CLICK_SACLE = 2;
    private int mMode = 0;
    private float mStartDis;
    private Matrix mCurrentMatrix = new Matrix();
    private boolean mLeftDragable;
    private boolean mRightDragable;
    private boolean mFirstMove = false;
    private PointF mStartPoint = new PointF();
    @Override
    public boolean onTouch(View v, MotionEvent event) {
      switch (event.getActionMasked()) {
      case MotionEvent.ACTION_DOWN:
        mMode = MODE_DRAG;
        mStartPoint.set(event.getX(), event.getY());
        isMatrixEnable();
        startDrag();
        checkDragable();
        break;
      case MotionEvent.ACTION_UP:
      case MotionEvent.ACTION_CANCEL:
        reSetMatrix();
        stopDrag();
        break;
      case MotionEvent.ACTION_MOVE:
        if (mMode == MODE_ZOOM) {
          setZoomMatrix(event);
        } else if (mMode == MODE_DRAG) {
          setDragMatrix(event);
        } else {
          stopDrag();
        }
        break;
      case MotionEvent.ACTION_POINTER_DOWN:
        if (mMode == MODE_UNABLE)
          return true;
        mMode = MODE_ZOOM;
        mStartDis = distance(event);
        break;
      case MotionEvent.ACTION_POINTER_UP:
        break;
      default:
        break;
      }
      return mGestureDetector.onTouchEvent(event);
    }
    private void startDrag() {
      if (mMoveListener != null)
        mMoveListener.startDrag();
    }
    private void stopDrag() {
      if (mMoveListener != null)
        mMoveListener.stopDrag();
    }
    private void checkDragable() {
      mLeftDragable = true;
      mRightDragable = true;
      mFirstMove = true;
      float[] values = new float[9];
      getImageMatrix().getValues(values);
      if (values[Matrix.MTRANS_X] >= 0)
        mRightDragable = false;
      if ((mImageWidth) * values[Matrix.MSCALE_X]
          + values[Matrix.MTRANS_X] <= getWidth()) {
        mLeftDragable = false;
      }
    }
    public void setDragMatrix(MotionEvent event) {
      if (isZoomChanged()) {
        float dx = event.getX() - mStartPoint.x;
        float dy = event.getY() - mStartPoint.y;
        if (Math.sqrt(dx * dx + dy * dy) > 10f) {
          mStartPoint.set(event.getX(), event.getY());
          mCurrentMatrix.set(getImageMatrix());
          float[] values = new float[9];
          mCurrentMatrix.getValues(values);
          dy = checkDyBound(values, dy);
          dx = checkDxBound(values, dx, dy);
          mCurrentMatrix.postTranslate(dx, dy);
          setImageMatrix(mCurrentMatrix);
        }
      } else {
        stopDrag();
      }
    }
    private boolean isZoomChanged() {
      float[] values = new float[9];
      getImageMatrix().getValues(values);
      float scale = values[Matrix.MSCALE_X];
      return scale != mScale;
    }
    private float checkDyBound(float[] values, float dy) {
      float height = getHeight();
      if (mImageHeight * values[Matrix.MSCALE_Y] < height)
        return 0;
      if (values[Matrix.MTRANS_Y] + dy > 0)
        dy = -values[Matrix.MTRANS_Y];
      else if (values[Matrix.MTRANS_Y] + dy < -(mImageHeight
          * values[Matrix.MSCALE_Y] - height))
        dy = -(mImageHeight * values[Matrix.MSCALE_Y] - height)
            - values[Matrix.MTRANS_Y];
      return dy;
    }
    private float checkDxBound(float[] values, float dx, float dy) {
      float width = getWidth();
      if (!mLeftDragable && dx < 0) {
        if (Math.abs(dx) * 0.4f > Math.abs(dy) && mFirstMove) {
          stopDrag();
        }
        return 0;
      }
      if (!mRightDragable && dx > 0) {
        if (Math.abs(dx) * 0.4f > Math.abs(dy) && mFirstMove) {
          stopDrag();
        }
        return 0;
      }
      mLeftDragable = true;
      mRightDragable = true;
      if (mFirstMove)
        mFirstMove = false;
      if (mImageWidth * values[Matrix.MSCALE_X] < width) {
        return 0;
      }
      if (values[Matrix.MTRANS_X] + dx > 0) {
        dx = -values[Matrix.MTRANS_X];
      } else if (values[Matrix.MTRANS_X] + dx < -(mImageWidth
          * values[Matrix.MSCALE_X] - width)) {
        dx = -(mImageWidth * values[Matrix.MSCALE_X] - width)
            - values[Matrix.MTRANS_X];
      }
      return dx;
    }
    private void setZoomMatrix(MotionEvent event) {
      if (event.getPointerCount() < 2)
        return;
      float endDis = distance(event);
      if (endDis > 10f) {
        float scale = endDis / mStartDis;
        mStartDis = endDis;
        mCurrentMatrix.set(getImageMatrix());
        float[] values = new float[9];
        mCurrentMatrix.getValues(values);
        scale = checkMaxScale(scale, values);
        PointF centerF = getCenter(scale, values);
        mCurrentMatrix.postScale(scale, scale, centerF.x, centerF.y);
        setImageMatrix(mCurrentMatrix);
      }
    }
    private PointF getCenter(float scale, float[] values) {
      if (scale * values[Matrix.MSCALE_X] < mScale || scale >= 1) {
        return new PointF(getWidth() / 2, getHeight() / 2);
      }
      float cx = getWidth() / 2;
      float cy = getHeight() / 2;
      if ((getWidth() / 2 - values[Matrix.MTRANS_X]) * scale < getWidth() / 2)
        cx = 0;
      if ((mImageWidth * values[Matrix.MSCALE_X] + values[Matrix.MTRANS_X])
          * scale < getWidth())
        cx = getWidth();
      return new PointF(cx, cy);
    }
    private float checkMaxScale(float scale, float[] values) {
      if (scale * values[Matrix.MSCALE_X] > MAX_SCALE)
        scale = MAX_SCALE / values[Matrix.MSCALE_X];
      return scale;
    }
    private void reSetMatrix() {
      if (checkRest()) {
        mCurrentMatrix.set(mMatrix);
        setImageMatrix(mCurrentMatrix);
      } else {
        float[] values = new float[9];
        getImageMatrix().getValues(values);
        float height = mImageHeight * values[Matrix.MSCALE_Y];
        if (height < getHeight()) {
          float topMargin = (getHeight() - height) / 2;
          if (topMargin != values[Matrix.MTRANS_Y]) {
            mCurrentMatrix.set(getImageMatrix());
            mCurrentMatrix.postTranslate(0, topMargin
                - values[Matrix.MTRANS_Y]);
            setImageMatrix(mCurrentMatrix);
          }
        }
      }
    }
    private boolean checkRest() {
      float[] values = new float[9];
      getImageMatrix().getValues(values);
      float scale = values[Matrix.MSCALE_X];
      return scale < mScale;
    }
    private void isMatrixEnable() {
      if (getScaleType() != ScaleType.CENTER) {
        setScaleType(ScaleType.MATRIX);
      } else {
        mMode = MODE_UNABLE;
      }
    }
    private float distance(MotionEvent event) {
      float dx = event.getX(1) - event.getX(0);
      float dy = event.getY(1) - event.getY(0);
      return (float) Math.sqrt(dx * dx + dy * dy);
    }
    public void onDoubleClick() {
      float scale = isZoomChanged() ? 1 : DOUBLE_CLICK_SACLE;
      mCurrentMatrix.set(mMatrix);
      mCurrentMatrix.postScale(scale, scale, getWidth() / 2,
          getHeight() / 2);
      setImageMatrix(mCurrentMatrix);
    }
  }
  private class GestureListener extends SimpleOnGestureListener {
    private final MatrixTouchListener mTouchListener;
    public GestureListener(MatrixTouchListener listener) {
      this.mTouchListener = listener;
    }
    @Override
    public boolean onDown(MotionEvent e) {
      return true;
    }
    @Override
    public boolean onDoubleTap(MotionEvent e) {
      mTouchListener.onDoubleClick();
      return true;
    }
    @Override
    public boolean onSingleTapUp(MotionEvent e) {
      return super.onSingleTapUp(e);
    }
    @Override
    public void onLongPress(MotionEvent e) {
      super.onLongPress(e);
    }
    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2,
        float distanceX, float distanceY) {
      return super.onScroll(e1, e2, distanceX, distanceY);
    }
    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
        float velocityY) {
      return super.onFling(e1, e2, velocityX, velocityY);
    }
    @Override
    public void onShowPress(MotionEvent e) {
      super.onShowPress(e);
    }
    @Override
    public boolean onDoubleTapEvent(MotionEvent e) {
      return super.onDoubleTapEvent(e);
    }
    @Override
    public boolean onSingleTapConfirmed(MotionEvent e) {
      if (mSingleTapListener != null)
        mSingleTapListener.onSingleTap(e);
      return super.onSingleTapConfirmed(e);
    }
  }
  public interface OnMovingListener {
    public void startDrag();
    public void stopDrag();
  }
  public interface OnSingleTapListener {
    public void onSingleTap(MotionEvent e);
  }
}

我对其中定义OnSingleTapListener接口的方法稍作了一些修改,为onSingleTap回调方法增加了MotionEvent类型的参数,来方便我们根据用户具体的事件内容作出对应的控制。

您可能感兴趣的文章:Android手势ImageView三部曲 第二部Android手势ImageView三部曲 第一部Android自定义GestureDetector实现手势ImageViewAndroid使用ImageView实现支持手势缩放效果Android ImageView随手势变化动态缩放图片Android手势滑动实现ImageView缩放图片大小Android通过手势实现的缩放处理实例代码android开发之为activity增加左右手势识别示例android使用gesturedetector手势识别示例分享Android手势ImageView三部曲 第三部


--结束END--

本文标题: Android实现手势控制ImageView图片大小

本文链接: https://www.lsjlt.com/news/25712.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JS怎么实现控制图片显示大小功能
    这篇文章主要介绍JS怎么实现控制图片显示大小功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体如下:<!DOCTYPE html PUBLIC ...
    99+
    2024-04-02
  • Android中imageView图片放大缩小及旋转功能示例代码
    一、简介二、方法1)设置图片放大缩小效果将<ImageView>标签中的android:scaleType设置为"fitCenter"android:scaleType="fitCenter"...
    99+
    2023-05-30
    imageview 放大 缩小
  • Android实现手势划定区域裁剪图片
    本文实例为大家分享了Android实现手势划定区域裁剪图片的具体代码,供大家参考,具体内容如下 需求: 拍照,然后对图片进行处理,划定矩形区域,将矩形区域裁剪下来 思路: 1、使用系...
    99+
    2024-04-02
  • Android编程实现图片放大缩小功能ZoomControls控件用法实例
    本文实例讲述了Android编程实现图片放大缩小功能ZoomControls控件用法。分享给大家供大家参考,具体如下:MainActivity代码:package example.com.myapplication;import andro...
    99+
    2023-05-30
    android 图片 控件
  • Android怎么实现手势划定区域裁剪图片
    这篇文章主要介绍“Android怎么实现手势划定区域裁剪图片”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Android怎么实现手势划定区域裁剪图片”文章能帮助大家解决问题。需求:拍照,然后对图片进...
    99+
    2023-06-30
  • 如何在Android中利用imageview实现一个图片缩放功能
    如何在Android中利用imageview实现一个图片缩放功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Android 自定义imageview实现图片缩放实例详解&nb...
    99+
    2023-05-31
    android imageview age
  • Java实现压缩图片大小
    本文实例为大家分享了Java实现压缩图片大小的具体代码,供大家参考,具体内容如下 使用场景: 1.当使用图片上传功能时,上传图片太大,造成对服务器资源过多的占用2.客户端上传图片尺寸...
    99+
    2024-04-02
  • css实现html图片自适应手机屏幕大小
    本篇内容主要讲解“css实现html图片自适应手机屏幕大小”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“css实现html图片自适应手机屏幕大小”吧! ...
    99+
    2024-04-02
  • Android实现圆形图片小工具
    本文实例为大家分享了Android实现圆形图片小工具的具体代码,供大家参考,具体内容如下 1.CircleImageView类代码 public class CircleImageV...
    99+
    2024-04-02
  • 怎么在Android中利用ImageView实现一个放大缩小动画
    这期内容当中小编将会给大家带来有关怎么在Android中利用ImageView实现一个放大缩小动画,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1.配置文件直接添加当直接在布局文件中添加图片的话,可以在自...
    99+
    2023-05-31
    android imageview age
  • Android开发实现ImageView加载摄像头拍摄的大图功能
    本文实例讲述了Android开发实现ImageView加载摄像头拍摄的大图功能。分享给大家供大家参考,具体如下:这个方法是从官方demo中摘录的,在此记录学习。权限<uses-permission android:name="andr...
    99+
    2023-05-30
    android imageview age
  • Android开发实现图片大小与质量压缩及保存
    目录Android中图片有四种属性Android目前常用图片格式使用大小压缩质量压缩混合方式压缩采样率压缩图片保存到本地Android中图片有四种属性 ALPHA_8:每个像素占用1...
    99+
    2024-04-02
  • 微信小程序实现裁剪图片大小
    本文实例为大家分享了微信小程序实现裁剪图片大小的具体代码,供大家参考,具体内容如下 效果图 .wxml <button bindtap="uploadtap">上传图片...
    99+
    2024-04-02
  • java实现图片分割指定大小
    本文实例为大家分享了java实现图片分割指定大小的具体代码,供大家参考,具体内容如下 1.使用工具:Thumbnails Thumbnails 是由谷歌提供的图片处理包,目前版本0....
    99+
    2024-04-02
  • C语言实现图片放大缩小
    本文实例为大家分享了C语言实现图片放大缩小的具体代码,供大家参考,具体内容如下 最终项目描述和效果 鼠标按小图,左键图片缩小,右键图片放大。 代码如下 代码大致的思路就是,当鼠标点...
    99+
    2024-04-02
  • springboot实现图片大小压缩功能
    本文实例为大家分享了springboot实现图片大小压缩的具体代码,供大家参考,具体内容如下 application.properties配置文件 #后端接收图片大小 spring....
    99+
    2024-04-02
  • Java如何实现压缩图片大小
    本篇内容主要讲解“Java如何实现压缩图片大小”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java如何实现压缩图片大小”吧!使用场景:当使用图片上传功能时,上传图片太大,造成对服务器资源过多的...
    99+
    2023-06-30
  • java实现上传图片并压缩图片大小功能
    Thumbnailator 是一个优秀的图片处理的Google开源Java类库。处理效果远比Java API的好。从API提供现有的图像文件和图像对象的类中简化了处理过程,两三行代码就能够从现有图片生成处理后的图片,且允许微调图片的生成方式...
    99+
    2023-05-31
    java 上传图片 压缩图片
  • 网页里控制图片大小的相关代码284475示例
    1、用鼠标拖动来改变大小 <SCRIPT LANGUAGE="JavaScript">function resizeImage(evt,obj){newX=evt.xn...
    99+
    2023-05-20
    网页里控制图片大小的相关代码
  • 网页里控制图片大小的相关代码284815详解
    1、用鼠标拖动来改变大小 <SCRIPT LANGUAGE="JavaScript">function resizeImage(evt,obj){newX=evt.xn...
    99+
    2023-05-21
    网页里控制图片大小的相关代码
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作