zoukankan      html  css  js  c++  java
  • 图片操作(缩放移动)

    view_show.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
      xmlns:android="http://schemas.android.com/apk/res/android"
      android:orientation="vertical"
      android:layout_width="match_parent"
      android:layout_height="match_parent">
        <FrameLayout 
            android:layout_height="fill_parent"
            android:layout_width="fill_parent">
            <ImageView 
                android:id="@+id/view_img"
                android:layout_height="fill_parent"
                android:layout_width="fill_parent"
                android:background="@drawable/camera_gray"/>
            <ImageButton 
                android:id="@+id/view_close"
                android:layout_height="wrap_content"
                android:layout_width="wrap_content"
                android:layout_gravity="top|left"
                android:layout_margin="5dip"/>
            <ImageButton 
                android:id="@+id/view_del"
                android:layout_height="wrap_content"
                android:layout_width="wrap_content"
                android:layout_gravity="top|right"
                android:layout_margin="5dip"/>
            <ImageButton 
                android:id="@+id/view_narrow"
                android:layout_height="wrap_content"
                android:layout_width="wrap_content"
                android:layout_gravity="bottom|center_horizontal"
                android:layout_marginRight="10dip"/>
            <ImageButton 
                android:id="@+id/view_amplification"
                android:layout_height="wrap_content"
                android:layout_width="wrap_content"
                android:layout_gravity="bottom|center_horizontal"
                android:layout_marginLeft="10dip"/>
        </FrameLayout>
    </LinearLayout>

    GalleryViewTouch.java:

    package com.kotei.lbs.Anthurium.LawCases;
    
    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.util.Log;
    import android.view.MotionEvent;
    import android.view.View;
    import android.view.Window;
    import android.view.View.OnTouchListener;
    import android.widget.ImageView;
    import android.widget.ImageView.ScaleType;
    
    /**
     * 查看图片的操作
     * @author hongj
     */
    public class GalleryViewTouch extends Activity  {
        private ImageView iv;
         private Bitmap bitmap=null;
            Matrix matrix = new Matrix();
            Matrix savedMatrix = new Matrix();
            DisplayMetrics dm;
            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;
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            setContentView(R.layout.view_show);
            dm = new DisplayMetrics();
            getWindowManager().getDefaultDisplay().getMetrics(dm);// 获取分辨率
            bitmap=BitmapFactory.decodeResource(getResources(), R.drawable.bottom_layout_background);
            iv=(ImageView)findViewById(R.id.view_img);
            iv.setImageBitmap(bitmap);
            iv.setOnTouchListener(new ImageTouch(bitmap,dm.widthPixels,dm.heightPixels,iv));
            
        }
        
        class ImageTouch implements OnTouchListener {
            private ImageView iv;
             private Bitmap bitmap=null;
                Matrix matrix = new Matrix();
                Matrix savedMatrix = new Matrix();
                int dmwidth,dmheight;
                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;
                ImageTouch(Bitmap bitmap,int width,int height,ImageView iv){
                    this.bitmap= bitmap;
                    this.dmwidth=width;
                    this.dmheight=height;
                    this.iv=iv;
                    initImage();
                }
                public void initImage(){
                    if (dmwidth < bitmap.getWidth()|| dmheight < bitmap.getHeight()) {
                        
                        minZoom();
                        center();
                        iv.setImageMatrix(matrix);
                    } else {
                        iv.setScaleType(ScaleType.CENTER);
                    }
                }
            @Override
            
            public boolean onTouch(View v, MotionEvent event) {
                 switch (event.getAction() & MotionEvent.ACTION_MASK) {
                    // 主点按下
                    case MotionEvent.ACTION_DOWN:
                        Log.d("System.out", "ACTION_DOWN");
                        savedMatrix.set(matrix);
                        prev.set(event.getX(), event.getY());
                        mode = DRAG;
                        break; // 副点按下
                    case MotionEvent.ACTION_POINTER_DOWN:
                        Log.d("System.out", "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;
                    }
                 
                    iv.setImageMatrix(matrix);
                    if(mode!=NONE)
                   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();
                }
             
             public void minZoom() {
                    Log.i("test", bitmap.getWidth()+"");
                    Log.i("test", bitmap.getHeight()+"");
                    minScaleR = Math.min(
                            (float) dmwidth / (float) bitmap.getWidth(),
                            (float) dmheight / (float) bitmap.getHeight());
                    if (minScaleR < 1.0) {
                        matrix.postScale(minScaleR, minScaleR);
                    }
                }
              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();
                    Log.d("System.out",rect.top+"************"+ rect.bottom);
                    float deltaX = 0, deltaY = 0;
                    if (vertical) { // 图片小于屏幕大小,则居中显示。大于屏幕,上方留空则往上移,下方留空则往下移
    
                        int screenHeight = dmheight;
                        if (height < screenHeight) {
                            deltaY = (screenHeight - height) / 2 - rect.top;
                        } else if (rect.top > 0) {
                            deltaY = -rect.top;
                        } else if (rect.bottom < screenHeight) {
                            deltaY = iv.getHeight() - rect.bottom;
                        }
                        //deltaY-=50;
                    }
                    if (horizontal) {
                        int screenWidth = dmwidth;
                        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);
                }
             public void center() {
                    center(true, true);
                }
             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);
                }
        }
    }
  • 相关阅读:
    java8新特性→方法和构造函数引用:替代Lambda表达式
    java8新特性→Stream流:用于解决已有集合类库既有的弊端
    java8新特性→函数式接口
    java8新特新→Lambda表达式
    子查询
    Vue之监听数据变化watch、computed、methods
    Vue路由-使用命名视图实现经典布局
    Vue路由-使用children属性实现路由
    Vue之路由传参
    Vue路由之touter-link、router-direct的使用
  • 原文地址:https://www.cnblogs.com/jh5240/p/3149062.html
Copyright © 2011-2022 走看看