android 多点触控
2017-01-09 00:00
525 查看
public float []lastx = new float[]{0,0}; public float []lasty = new float[]{0,0}; int mode; @Override public boolean onTouch(View v, MotionEvent event) { float []tmpx = new float[]{0,0}; float []tmpy = new float[]{0,0}; int actionIndex; switch (event.getActionMasked()){ case MotionEvent.ACTION_POINTER_DOWN: actionIndex = event.getActionIndex(); lastx[actionIndex] = event.getX(actionIndex); lasty[actionIndex] = event.getY(actionIndex); break; case MotionEvent.ACTION_POINTER_UP: break; case MotionEvent.ACTION_DOWN: actionIndex = event.getActionIndex(); lastx[actionIndex] = event.getX(actionIndex); lasty[actionIndex] = event.getY(actionIndex); break; case MotionEvent.ACTION_UP: break; case MotionEvent.ACTION_MOVE: if(event.getPointerCount()==1){ //单手 tmpx[0] = event.getX(0); tmpy[0] = event.getY(0); rotate(lastx[0], lasty[0], tmpx[0], tmpy[0]); lastx[0] = tmpx[0]; lasty[0] = tmpy[0]; }else if(event.getPointerCount()>=2){ //双手 tmpx[0] = event.getX(0); tmpy[0] = event.getY(0); tmpx[1] = event.getX(1); tmpy[1] = event.getY(1); moveOrScale(lastx, lasty, tmpx, tmpy); lastx[0] = tmpx[0]; lasty[0] = tmpy[0]; lastx[1] = tmpx[1]; lasty[1] = tmpy[1]; } break; } return true; }
private float scale = 0f; //上一个scale private float defaultScale = 0f; private float maxScale = 8; //位移x private float translateX = 0; //位移y private float translateY = 0; boolean isLongClick = false; public float []lastx = new float[]{0,0}; public float []lasty = new float[]{0,0}; public float []downx = new float[]{0,0}; public float []downy = new float[]{0,0}; public float downScale = 0; private void onPDFTouch(MotionEvent event) { float []tmpx = new float[]{0,0}; float []tmpy = new float[]{0,0}; int actionIndex; switch (event.getActionMasked()){ case MotionEvent.ACTION_POINTER_DOWN: actionIndex = event.getActionIndex(); if(actionIndex>=2){ return; } lastx[actionIndex] = event.getX(actionIndex); lasty[actionIndex] = event.getY(actionIndex); downx[actionIndex] = lastx[actionIndex]; downy[actionIndex] = lasty[actionIndex]; downScale = scale; break; case MotionEvent.ACTION_POINTER_UP: break; case MotionEvent.ACTION_DOWN: isLongClick = true; lastx[0] = event.getX(0); lasty[0] = event.getY(0); downx[0] = lastx[0]; downy[0] = lasty[0]; //长按时间,等待 longClickTime 毫秒触发 longClickRunable = new Runnable() { @Override public void run() { if(isLongClick&&listener!=null) { listener.onLongClick(NetcaPDFView.this, downx[0], downy[0]); } isLongClick = false; longClickRunable = null; } }; handler.postDelayed(longClickRunable, longClickTime); break; case MotionEvent.ACTION_UP: removeLongClick(); break; case MotionEvent.ACTION_MOVE: if(event.getPointerCount()==1){ //单手 tmpx[0] = event.getX(0); tmpy[0] = event.getY(0); //移动过大,判断为非长按 if(Math.abs(downx[0]-tmpx[0])>precision||Math.abs(downy[0]-tmpy[0])>precision){ removeLongClick(); } //移动图片 float width = bitmapFactor*pageWidth*scale; float height = bitmapFactor * pageHeight*scale; float testX = translateX; float testY = translateY; testX -= (lastx[0]-tmpx[0]); testY -= (lasty[0]-tmpy[0]); if(testX<0&&testX+width>displayWidth){ translateX = testX; } if(testY<0&&testY+height>displayHeight){ translateY = testY; } invalidate(); lastx[0] = tmpx[0]; lasty[0] = tmpy[0]; }else if(event.getPointerCount()>=2){ removeLongClick(); //双手 tmpx[0] = event.getX(0); tmpy[0] = event.getY(0); tmpx[1] = event.getX(1); tmpy[1] = event.getY(1); float width = bitmapFactor*pageWidth*scale; float height = bitmapFactor * pageHeight*scale; float userScale = distance(tmpx[0], tmpy[0], tmpx[1], tmpy[1])/distance(downx[0], downy[0], downx[1], downy[1]); float testScale = userScale*downScale; if(testScale<defaultScale){ testScale= defaultScale; } if(testScale>maxScale){ testScale = maxScale; } float testX = translateX; float testY = translateY; float centerX = (downx[0]+downx[1])/2/testScale; float centerY = (downy[0]+downy[1])/2/testScale; testX = centerX-width/2.f; testY = centerY-height/2.f; if(testX+width<displayWidth){ testX = displayWidth - width; } if(testY+height<displayHeight){ testY = displayHeight - height; } if(testX>0){ testX = 0; } if(testY>0){ testY = 0; } if(Math.abs(testScale-scale)>0.01){ translateX = testX; translateY = testY; scale = testScale; } invalidate(); lastx[0] = tmpx[0]; lasty[0] = tmpy[0]; lastx[1] = tmpx[1]; lasty[1] = tmpy[1]; } break; } }
相关文章推荐
- Xamarin开发教程如何使用Xamarin开发Android应用
- android 学习笔记9-服务 启动停止 调用服务方法 远程服务 AIDL进程通信
- Android常见内存泄漏和LeakCanary的使用
- Android Studio常用快捷键
- Android自定义View
- Android常用Dialog的几种格式显示,普通,列表,单选,多选,可编辑dialog等
- Android ListView 源码分析
- android sdk环境变量配置
- 关于魅族系列手机在adb中显示不出来的问题的解决方案
- 支持手机和控制台log的小工具-ZeusLog
- android opengles光照效果-环境光
- Android textview 实现长按自由选择复制功能
- Android权限
- android调试工具--dumpsys
- Android通用流行框架大全
- Android系统五大布局详解Layout
- Fragment在生命周期中是如何走到onCreateView的(一)
- iOS/Android SQLite 全文检索——FTS (Full Text Search)
- Android Error:Failed to complete Gradle execution.
- 鸟人的Android揭秘(12)——Init进程源代码分析(三)