求大神帮忙啊
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