qq_33287827 2016-08-25 05:02 采纳率: 11.1%
浏览 2530

安卓手机点击图片全屏观看,再点击回到原位。没有手势放大查看效果

图片说明

求大神帮忙啊

  • 写回答

1条回答 默认 最新

  • 新根 2016-08-25 10:32
    关注

    你点击默认图片跳转到一个界面或者切换到fragment或者其他的dialog(看喜欢而定),activity中写缩放,拖拉的功能代码,对应的imageview写点击事件,finish().
    拖拉和缩放的功能代码:

         private ImageView toucher_iv;
    
                toucher_iv.setOnTouchListener(this);//添加触摸监听器
    
               //记录当前图片的Matrix
        private Matrix  beforeMatrix=new Matrix();
        //改变状态后的Matrix
        private  Matrix  changeMatrix=new Matrix();
        //记录当前图片处于的状态
        private  int currentState=0;//当前状态
        private final static int MOVE=1;//拖动
        private  final static int SCALLE=2;//缩放
        //记录两个坐标(float类型)
         private  PointF  before_PointF=new PointF();
        //记录下一开两个手指间的距离:
        private  float before_Distance;
        //记录下开始时,两个手指间的中心点
        private  PointF midPointf;
    
    
        /**
         * 1.拖动分析:
         * 在原本Matrix基础上添加移动的x,y距离,实现拖动
         * 做法:先记录开始的Matrix1,
         *       然后计算移动的x,y,
         *       创建一个以Matrix1为基础的新的Matrix2,添加移动的x,y
         *       图片设置新的Matrix2
         *
         *
         * 2.缩放分析:
         * 先记录中心点(缩放,旋转都需要用到),原本的Matrix,原本手指间距离,通过距离比率来设置
         *
         * @param v
         * @param event
         * @return
         */
        @Override
        public boolean onTouch(View v, MotionEvent event) {
                 switch (event.getAction() & MotionEvent.ACTION_MASK){
                     //手指压下屏幕
                     case MotionEvent.ACTION_DOWN:
                         currentState=MOVE;
                         beforeMatrix.set(toucher_iv.getImageMatrix());
                         before_PointF.set(event.getX(),event.getY());
                         break;
                     //手指在滑动
                     case MotionEvent.ACTION_MOVE:
                            if(currentState==MOVE){//拖动状态
                                float distance_x=event.getX()-before_PointF.x;
                                float ditance_y=event.getY()-before_PointF.y;
                                changeMatrix.set(beforeMatrix);
                                changeMatrix.postTranslate(distance_x,ditance_y);
                            }else if (currentState==SCALLE){//缩放状态
                                     float endDistance=distance(event);
                                     if(endDistance>10f){
                                         float scale=endDistance/before_Distance;
                                         changeMatrix.set(beforeMatrix);
                                         changeMatrix.postScale(scale,scale,midPointf.x,midPointf.y);
                                     }
                            }
                         break;
                     //手指离开触摸
                     case MotionEvent.ACTION_UP:
                         currentState=0;
                         break;
                     //多一个手指在触摸
                     case MotionEvent.ACTION_POINTER_DOWN:
                         currentState=SCALLE;
                         //开始时,两个手指间距离
                         before_Distance=distance(event);
                         if(before_Distance>10f){
                             midPointf=mid(event);
                             beforeMatrix.set(toucher_iv.getImageMatrix());
                         }
                         break;
                     //还有手指在触摸
                     case MotionEvent.ACTION_POINTER_UP:
                         currentState=0;
                         break;
                 }
              toucher_iv.setImageMatrix(changeMatrix);
            return true;
        }
        /** 计算两个手指间的距离 */
        private float distance(MotionEvent event) {
            float dx = event.getX(1) - event.getX(0);
            float dy = event.getY(1) - event.getY(0);
            /** 使用勾股定理返回两点之间的距离 */
            return (float) Math.sqrt(dx * dx + dy * dy);
        }
    
        /** 计算两个手指间的中间点 */
        private PointF mid(MotionEvent event) {
            float midX = (event.getX(1) + event.getX(0)) / 2;
            float midY = (event.getY(1) + event.getY(0)) / 2;
            return new PointF(midX, midY);
        }
    
    
    
    

    //设置图片一开始居中的代码:

     if(bitmap==null){
                    return;
                }
                float y=  ((height-bitmap.getHeight())/2);
                LogController.i(TAG,"move_y"+y);
                if(y>0){
                    beforeMatrix.setTranslate(0,y);
                    toucher_iv.setImageMatrix(beforeMatrix);
                }
                toucher_iv.setImageBitmap(bitmap);
    
    评论

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog