图片缩放不使用依赖

2020-01-07  本文已影响0人  玖块

最初版本参考:https://www.itcodemonkey.com/article/6238.html

第二版 参考:https://blog.csdn.net/lpcrazyboy/article/details/80777112

第二版ontouch和onclick冲突处理参考:https://blog.csdn.net/nihaoqiulinhe/article/details/51556103

最终版参考:https://blog.csdn.net/dpl12/article/details/78160993或者我的文章 android图片缩放photoview也可以

java 代码

public class OtherActivityextends Activityimplements View.OnTouchListener{

//    private MyImageView imageView;

// 縮放控制

    private Matrixmatrix =new Matrix();

    private MatrixsavedMatrix =new Matrix();

    // 不同状态的表示:

    private static final int NONE =0;

    private static final int DRAG =1;

    private static final int ZOOM =2;

    private int mode =NONE;

    // 定义第一个按下的点,两只接触点的重点,以及出事的两指按下的距离:

    private PointFstartPoint =new PointF();

    private PointFmidPoint =new PointF();

    private float oriDis =1f;

    boolean is =true;

    private int firstX;

    private int secondX;

    @Override

    protected void onCreate(@Nullable Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

        this.requestWindowFeature(Window.FEATURE_NO_TITLE);

        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,

                WindowManager.LayoutParams.FLAG_FULLSCREEN);

        setContentView(R.layout.other);

        imageView = findViewById(R.id.imageView2);

        Intent intent = getIntent();

        String content = intent.getStringExtra("photo");

        Glide.with(this)

.load(content)

.into(imageView);

        imageView.setOnClickListener(new View.OnClickListener() {

@Override

            public void onClick(View view) {

// 注意这里不使用finish

                ActivityCompat.finishAfterTransition(OtherActivity.this);

            }

});

//        imageView.setOnTouchListener(this);

    }

// 计算两个触摸点之间的距离

    private float distance(MotionEvent event) {

float x = event.getX(0) - event.getX(1);

        float y = event.getY(0) - event.getY(1);

        return Float.valueOf(String.valueOf(Math.sqrt(x * x + y * y)));

    }

// 计算两个触摸点的中点

    private PointFmiddle(MotionEvent event) {

float x = event.getX(0) + event.getX(1);

        float y = event.getY(0) + event.getY(1);

        return new PointF(x /2, y /2);

    }

@Override

    public boolean onTouch(View v, MotionEvent event) {

ImageView view = (ImageView) v;

        switch (event.getAction() & MotionEvent.ACTION_MASK) {

// 单指

//表示按下了屏幕,第一个执行也是必然执行的方法。

            case MotionEvent.ACTION_DOWN:

firstX = (int) event.getX();//按下的时候开始的x的位置

//                if (event.getAction() == MotionEvent.ACTION_DOWN){

//                    is = false;

//                }else {

                    matrix.set(view.getImageMatrix());

                    savedMatrix.set(matrix);

                    startPoint.set(event.getX(), event.getY());

                    mode =DRAG;

//                }

                break;

            // 双指

            case MotionEvent.ACTION_POINTER_DOWN:

oriDis = distance(event);

                if (oriDis >10f) {

savedMatrix.set(matrix);

                    midPoint = middle(event);

                    mode =ZOOM;

                }

break;

            // 手指放开

//表示为离开屏幕,触摸停止的时候执行。

            case MotionEvent.ACTION_UP:

secondX = (int)event.getX();//up的时候x的位置

                int distance =secondX -firstX;

                if (distance ==0) {

//当没有变化的时候什么都不做

                    is =false;

                }else {

//执行move滑动后的操作

                    is =true;

                }

break;

            case MotionEvent.ACTION_POINTER_UP:

mode =NONE;

break;

            // 单指滑动事件

//表示为移动手势,会不断的执行直到触摸停止。

            case MotionEvent.ACTION_MOVE:

if (mode ==DRAG) {

// 是一个手指拖动

                    matrix.set(savedMatrix);

                    matrix.postTranslate(event.getX() -startPoint.x, event.getY() -startPoint.y);

                }else if (mode ==ZOOM) {

// 两个手指滑动

                    float newDist = distance(event);

                    if (newDist >10f) {

matrix.set(savedMatrix);

                        float scale = newDist /oriDis;

                        matrix.postScale(scale, scale, midPoint.x, midPoint.y);

                    }

}

break;

        }

// 设置ImageView的Matrix

        view.setImageMatrix(matrix);

        return is;

    }

}

布局

布局

有缺点

主要是横版图片放得太大主要是没有边界控制

竖版图片还好

没有回弹效果

放大和缩小没有控制在一定范围内

上一篇 下一篇

猜你喜欢

热点阅读