android 图片放大缩小,简洁 附完整源码

设计是空 分类:程序源码 发布日期:2020-03-06 19:59
android 图片放大缩小,简洁 附完整源码

核心代码package com.wf.test.activity;   import Android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Matrix; import android.graphics.PointF; import android.graphics.RectF; import android.os.Bundle; import android.util.DisplayMetrics; import android.util.floatMath; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchlistener; import android.widget.ImageView;   /**  * 图片浏览、缩放、拖动、自动居中  */ public class ImageZoomActivity extends Activity implements OnTouchListener {       Matrix matrix = new Matrix();     Matrix savedmatrix = new Matrix();     DisplayMetrics dm;     ImageView imgView;     Bitmap bitmap;       float minScaleR;// 最小缩放比例     static final float MAX_SCALE = 4f;// 最大缩放比例       static final int NONE = 0;// 初始状态     static final int DRAG = 1;// 拖动     static final int ZOOM = 2;// 缩放     int mode = NONE;       PointF prev = new PointF();     PointF mid = new PointF();     float dist = 1f;       @override     public void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);                   setContentView(R.layout.main);         imgView = (ImageView) findViewById(R.id.image);// 获取控件         bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image_test);// 获取图片资源         imgView.seTimageBitmap(bitmap);// 填充控件         imgView.setOnTouchListener(this);// 设置触屏监听         dm = new DisplayMetrics();         getWindowManager().getDEFAULTDisplay().getMetrics(dm);// 获取分辨率         minZoom();         center();         imgView.setImageMatrix(matrix);     }       /**      * 触屏监听      */     public boolean onTouch(View v, MotionEvent event) {           switch (event.getAction() & MotionEvent.ACTION_MASK) {         // 主点按下         case MotionEvent.ACTION_DOWN:             savedMatrix.set(matrix);             prev.set(event.getX(), event.getY());             mode = DRAG;             break;         // 副点按下         case MotionEvent.ACTION_POINTER_DOWN:             dist = spacing(event);             // 如果连续两点距离大于10,则判定为多点模式             if (spacing(event) > 10f) {                 savedMatrix.set(matrix);                 midPoint(mid, event);                 mode = ZOOM;             }             break;         case MotionEvent.ACTION_UP:         case MotionEvent.ACTION_POINTER_UP:             mode = NONE;             break;         case MotionEvent.ACTION_MOVE:             if (mode == DRAG) {                 matrix.set(savedMatrix);                 matrix.postTranslate(event.getX() - prev.x, event.getY()                         - prev.y);             } else if (mode == ZOOM) {                 float newDist = spacing(event);                 if (newDist > 10f) {                     matrix.set(savedMatrix);                     float tScale = newDist / dist;                     matrix.postScale(tScale, tScale, mid.x, mid.y);                 }             }             break;         }         imgView.setImageMatrix(matrix);         CheckView();         return true;     }       /**      * 限制最大最小缩放比例,自动居中      */     private void CheckView() {         float p[] = new float[9];         matrix.getValues(p);         if (mode == ZOOM) {             if (p[0] < minScaleR) {                 matrix.setScale(minScaleR, minScaleR);             }             if (p[0] > MAX_SCALE) {                 matrix.set(savedMatrix);             }         }         center();     }       /**      * 最小缩放比例,最大为100%      */     private void minZoom() {         minScaleR = Math.min(                 (float) dm.widthPixels / (float) bitmap.getWidth(),                 (float) dm.heightPixels / (float) bitmap.getHeight());         if (minScaleR < 1.0) {             matrix.postScale(minScaleR, minScaleR);         }     }       private void center() {         center(true, true);     }       /**      * 横向、纵向居中      */     protected void center(boolean horizontal, boolean vertical) {           Matrix m = new Matrix();         m.set(matrix);         RectF rect = new RectF(0, 0, bitmap.getWidth(), bitmap.getHeight());         m.mapRect(rect);           float height = rect.height();         float width = rect.width();           float deltaX = 0, deltaY = 0;           if (vertical) {             // 图片小于屏幕大小,则居中显示。大于屏幕,上方留空则往上移,下方留空则往下移             int screenHeight = dm.heightPixels;             if (height < screenHeight) {                 deltaY = (screenHeight - height) / 2 - rect.top;             } else if (rect.top > 0) {                 deltaY = -rect.top;             } else if (rect.bottom < screenHeight) {                 deltaY = imgView.getHeight() - rect.bottom;             }         }           if (horizontal) {             int screenWidth = dm.widthPixels;             if (width < screenWidth) {                 deltaX = (screenWidth - width) / 2 - rect.left;             } else if (rect.left > 0) {                 deltaX = -rect.left;             } else if (rect.right < screenWidth) {                 deltaX = screenWidth - rect.right;             }         }         matrix.postTranslate(deltaX, deltaY);     }       /**      * 两点的距离      */     private float spacing(MotionEvent event) {         float x = event.getX(0) - event.getX(1);         float y = event.getY(0) - event.getY(1);         return FloatMath.sqrt(x * x   y * y);     }       /**      * 两点的中点      */     private void midPoint(PointF point, MotionEvent event) {         float x = event.getX(0)   event.getX(1);         float y = event.getY(0)   event.getY(1);         point.set(x / 2, y / 2);     } }
android 图片放大缩小,简洁 附完整源码

简介:核心代码package com.wf.test.activity; im

来源:搜素材网素材

搜素材网所有素材均为本站用户上传,仅供学习与参考,请勿用于商业用途,如有侵犯您的版权请联系客服服务QQ
本站提供各类html5响应式模板,前端js素材,网站模板,后台模板素材,程序源码素材。
由于技术有限本站不提供安装服务与bug修复,各类源码只提供分享服务,感谢您的理解。
如果对本站有任何意见请点击右侧侧边栏的反馈意见,我们会及时处理。


评论


亲,登录后才可以留言!