android 图片 上下左右滑动,能放大放小

package com.crpcg.domain_hchain.view;

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Matrix;
import android.graphics.RectF;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.util.AttributeSet;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.ScaleGestureDetector;
import android.view.ScaleGestureDetector.OnScaleGestureListener;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewConfiguration;
import android.view.ViewTreeObserver;
import android.widget.ImageView;

/**
 *
 */
public class ZoomImageView extends ImageView implements ViewTreeObserver.OnGlobalLayoutListener,
      ScaleGestureDetector.OnScaleGestureListener,View.OnTouchListener

{
   @SuppressWarnings("unused")
   private static final String TAG = "ZoomImageView";

   /**
    * 最大放大倍数
    */
   public static final float mMaxScale = 4.0f;

   /**
    * 默认缩放
    */
   private float mInitScale = 1.0f;
   /**
    * 双击放大比例
    */
   private float mMidScale=2.0f;

   /**
    * 检测缩放手势 多点触控手势识别 独立的类不是GestureDetector的子类
    */
   ScaleGestureDetector mScaleGestureDetector = null;//检测缩放的手势
   /**
    *检测类似长按啊 轻按啊 拖动 快速滑动 双击啊等等 OnTouch方法虽然也可以
    * 但是对于一些复杂的手势需求自己去通过轨迹时间等等判断很复杂,因此我们采用系统
    * 提供的手势类进行处理
    */
   private GestureDetector mGestureDetector;
   /**
    * 如果正在缩放中就不向下执行,防止多次双击
    */
   private boolean mIsAutoScaling;
   /**
    * Matrix的对图像的处理
    * Translate 平移变换
    * Rotate 旋转变换
    * Scale 缩放变换
    * Skew 错切变换
    */
   Matrix mScaleMatrix = new Matrix();

   /**
    * 处理矩阵的9个值
    */
   float[] mMartixValue = new float[9];

   public ZoomImageView(Context context) {
      this(context, null);
   }

   public ZoomImageView(Context context, AttributeSet attrs) {
      this(context, attrs, 0);
   }

   public ZoomImageView(Context context, AttributeSet attrs, int defStyleAttr) {
      super(context, attrs, defStyleAttr);
      setScaleType(ScaleType.MATRIX);
      mScaleGestureDetector = new ScaleGestureDetector(context, this);
      this.setOnTouchListener(this); //缩放的捕获要建立在setOnTouchListener      //符合滑动的距离 它获得的是触发移动事件的最短距离,如果小于这个距离就不触发移动控件,
      //viewpager就是用这个距离来判断用户是否翻页
      mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
      //监听双击事件 SimpleOnGestureListenerOnGestureListener接口实现类,
      //使用这个复写需要的方法就可以不用复写所有的方法
      mGestureDetector = new GestureDetector(context,
            new   GestureDetector.SimpleOnGestureListener() {
               @Override
               public boolean onDoubleTap(MotionEvent e) {
                  //如果正在缩放中就不向下执行,防止多次双击
                  if (mIsAutoScaling) {
                     return true;
                  }
                  //缩放的中心点
                  float x = e.getX();
                  float y = e.getY();
                  //如果当前缩放值小于这个临界值 则进行放大
                  if (getScale() < mMidScale) {
                     mIsAutoScaling = true;
                     //view中的方法 已x,y为坐标点放大到mMidScale 延时10ms
                     postDelayed(new AutoScaleRunble(mMidScale, x, y), 16);
                  } else {
                     //如果当前缩放值大于这个临界值 则进行缩小操作 缩小到
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值