ImageView自由缩放图片工具类

该工具类可以使ImageView自由缩放、移动图片。初始状态为fitCenter。

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.ScaleGestureDetector;
import android.view.View;
import android.widget.ImageView;

import androidx.annotation.NonNull;

public class Utils {
    private  double imageView_height,imageView_width,resource_width,resource_height;//控件大小,资源大小
    private  double scaleValue,scaleValue_default;//缩放值、默认缩放值
    private  double scrollX,scrollY,scrollX_default,scrollY_default;//x偏移量,y偏移量,默认x偏移量,默认y偏移量
    private  double ix,iy;//触发位置
    private  Bitmap bitmap_resource,bitmap_scale;

    /**
     * 该工具方法可以使ImageView自由缩放、移动图片。初始状态为fitCenter。
     * !!使用本方法时请确定ImageView已有固定大小值,如XXdp、XXsp、wrap_context!!
     * 使用match_parent无法获取大小
     * 设置后imageView可对设置的图片放大缩小,移动位置、双击恢复初始
     * !!想让imageView对点击、双击、长按等有反应可修改、添加gestureDetector内部方法!!
     * @param context
     * @param imageView 有固定大小值的ImageView
     * @param imageResourceId 显示的图片id
     */
    @SuppressLint("ClickableViewAccessibility")
    public  void setImageViewCanScaleAndImageResource(Context context, ImageView imageView, int imageResourceId){
        //所有值初始化-因为是静态变量
        imageView_height=0;imageView_width=0;resource_width=0;resource_height=0;
        scaleValue=0;scaleValue_default=0;
        scrollX=0;scrollY=0;scrollX_default=0;scrollY_default=0;
        ix=0;iy=0;
        //获取控件
        imageView_height=imageView.getLayoutParams().height;
        imageView_width=imageView.getLayoutParams().width;
        Log.d("控件大小","h"+imageView_height+"w"+imageView_width);
        imageView.setScaleType(ImageView.ScaleType.MATRIX);
        //获取资源位图&&宽高
        bitmap_resource= BitmapFactory.decodeResource(context.getResources(),imageResourceId);
        resource_width=bitmap_resource.getWidth();
        resource_height=bitmap_resource.getHeight();
        //初始缩放
        if(resource_width/resource_height>imageView_width/imageView_height){
            //宽型图-宽度填满
            scaleValue=imageView_width/resource_width;
            scrollY=(imageView_height-resource_height*scaleValue)/2;
        } else {
            //高型图-高度填满
            scaleValue=imageView_height/resource_height;
            scrollX=(imageView_width-resource_width*scaleValue)/2;
        }
        //储存初始值
        scaleValue_default=scaleValue;
        scrollX_default=scrollX;
        scrollY_default=scrollY;
        //缩放
        Matrix matrix=new Matrix();
        matrix.setScale((float) scaleValue, (float) scaleValue);
        bitmap_scale=Bitmap.createBitmap(bitmap_resource,0,0, bitmap_resource.getWidth(), bitmap_resource.getHeight(),matrix,true);
        //设置图片位置
        matrix=new Matrix();
        matrix.setTranslate((float) scrollX, (float) scrollY);
        imageView.setImageMatrix(matrix);
        //设置图片
        imageView.setImageBitmap(bitmap_scale);

        ScaleGestureDetector scaleGestureDetector=new ScaleGestureDetector(context,new ScaleGestureDetector.SimpleOnScaleGestureListener(){
            public boolean onScale(@NonNull ScaleGestureDetector detector) {
                //缩放触发
                //获取新缩放值
                double newScaleValue=scaleValue*detector.getScaleFactor();
                if(newScaleValue<0.5*scaleValue_default){
                    newScaleValue=0.5*scaleValue_default;
                } else if (newScaleValue>5*scaleValue_default) {
                    newScaleValue=5*scaleValue_default;
                }
                //获取ix,iy在资源图缩放前假位置
                double resource_x=ix-scrollX;
                double resource_y=iy-scrollY;
                //获取ix,iy在资源图缩放前真位置
                double reallyX=resource_x/scaleValue;
                double reallyY=resource_y/scaleValue;
                //获取缩放后移动
                scrollX=ix-reallyX*newScaleValue;
                scrollY=iy-reallyY*newScaleValue;
                scaleValue=newScaleValue;
                //缩放
                Matrix matrix=new Matrix();
                matrix.setScale((float) scaleValue, (float) scaleValue);
                bitmap_scale=Bitmap.createBitmap(bitmap_resource,0,0, (int) resource_width, (int) resource_height,matrix,true);
                //设置图片位置
                matrix=new Matrix();
                matrix.setTranslate((float) scrollX, (float) scrollY);
                imageView.setImageMatrix(matrix);
                //设置图片
                imageView.setImageBitmap(bitmap_scale);
                return true;
            }
        });

        GestureDetector gestureDetector=new GestureDetector(context,new GestureDetector.SimpleOnGestureListener(){
            public boolean onScroll(@NonNull MotionEvent e1, @NonNull MotionEvent e2, float distanceX, float distanceY) {
                //设置图片位置
                Matrix matrix=new Matrix();
                scrollX=scrollX-distanceX;
                scrollY=scrollY-distanceY;
                //宽大于控件宽
                if((resource_width*scaleValue)>imageView_width){
                    //防止图片太靠左导致看不见
                    if(scrollX<(0-resource_width*scaleValue+imageView_width)){
                        scrollX=0-resource_width*scaleValue+imageView_width;
                    }
                    //防止图片太靠右导致看不见
                    else if(scrollX>0){
                        scrollX=0;
                    }
                }
                //宽小于控件宽
                else {
                    //防止图片太靠左导致看不见
                    if(scrollX<(0-resource_width*scaleValue)/2){
                        scrollX=(0-resource_width*scaleValue)/2;
                    }
                    //防止图片太靠右导致看不见
                    else if(scrollX>imageView_width-(resource_width*scaleValue/2)){
                        scrollX=imageView_width-(resource_width*scaleValue/2);
                    }
                }
                //图高大于控件高
                if(resource_height*scaleValue>imageView_height){
                    //防止图片太靠上导致看不见
                    if(scrollY<0-resource_height*scaleValue+imageView_height){
                        scrollY=0-resource_height*scaleValue+imageView_height;
                    }
                    //防止图片太靠下导致看不见
                    else if (scrollY>0){
                        scrollY=0;
                    }
                }
                //图高小于控件高
                else {
                    //防止图片太靠上导致看不见
                    if(scrollY<=(0-resource_height*scaleValue)/2){
                        scrollY=(0-resource_height*scaleValue)/2;
                    }
                    //防止图片太靠下导致看不见
                    else if (scrollY>=imageView_height-(resource_height*scaleValue)/2){
                        scrollY=imageView_height-(resource_height*scaleValue)/2;
                    }
                }//防止图片太靠右导致看不见
                if(scrollX>=imageView_width-(resource_width*scaleValue/2)){
                    scrollX=imageView_width-(resource_width*scaleValue/2);
                }
                //防止图片太靠左导致看不见
                if(scrollX<=(0-resource_width*scaleValue)/2){
                    scrollX=(0-resource_width*scaleValue)/2;
                }
                //防止图片太靠下导致看不见
                if (scrollY>=imageView_height-(resource_height*scaleValue)/2){
                    scrollY=imageView_height-(resource_height*scaleValue)/2;
                }
                //防止图片太靠上导致看不见
                if(scrollY<=(0-resource_height*scaleValue)/2){
                    scrollY=(0-resource_height*scaleValue)/2;
                }
                matrix.setTranslate((float) scrollX, (float) scrollY);
                imageView.setImageMatrix(matrix);
                //设置图片
                imageView.setImageBitmap(bitmap_scale);
                return true;
            }
            public boolean onDoubleTap(@NonNull MotionEvent e) {
                scaleValue=scaleValue_default;
                scrollX=scrollX_default;
                scrollY=scrollY_default;
                //缩放
                Matrix matrix=new Matrix();
                matrix.setScale((float) scaleValue, (float) scaleValue);
                bitmap_scale=Bitmap.createBitmap(bitmap_resource,0,0, (int) resource_width, (int) resource_height,matrix,true);
                //设置图片位置
                matrix=new Matrix();
                matrix.setTranslate((float) scrollX, (float) scrollY);
                imageView.setImageMatrix(matrix);
                //设置图片
                imageView.setImageBitmap(bitmap_scale);
                return true;
            }
        });

        imageView.setOnTouchListener(new View.OnTouchListener() {
            public boolean onTouch(View view, MotionEvent motionEvent) {
                ix= motionEvent.getX();
                iy=motionEvent.getY();
                //缩放
                scaleGestureDetector.onTouchEvent(motionEvent);
                //滑动
                gestureDetector.onTouchEvent(motionEvent);
                return true;
            }
        });
    }
}

你可能感兴趣的:(android,java,算法)