旋转矩形框
来源:互联网 发布:电视节目片头制作软件 编辑:程序博客网 时间:2024/06/10 05:09
MotionEvent中getAction( )与getActionMasked( )的区别:
getAction( )得到的值是由触控点index + 触控事件 构成;
getActionMasked( )得到的值仅由 触控事件 构成.
onTouchEvent(MotionEvent event)的实现:
public boolean onTouchEvent(MotionEvent event){ PointF current=new PointF(event.getX(),event.getY()); String action=""; switch(event.getActionMasked()){ case MotionEvent.ACTION_DOWN: action="ACTION_DOWN"; mCurrentBox=new Box(current); mBoxen.add(mCurrentBox); pointer1=event.getPointerId(event.getActionIndex()); //当第一个手指触摸到屏幕后,记录第一个触控点的ID break; case MotionEvent.ACTION_POINTER_DOWN: action="ACTION_POINTER_DOWN"; pointer2=event.getPointerId(event.getActionIndex()); //当第二个手指触摸到屏幕后,记录第二个触控点的ID fx=event.getX(event.findPointerIndex(pointer1)); fy=event.getY(event.findPointerIndex(pointer1)); sx=event.getX(event.findPointerIndex(pointer2)); sy=event.getY(event.findPointerIndex(pointer2)); //得到第一,第二个触控点的横,纵坐标 mCurrentBox=null; break; case MotionEvent.ACTION_UP: action="ACTION_UP"; pointer1=-1; mCurrentBox=null; break; case MotionEvent.ACTION_POINTER_UP: action="ACTION_POINTER_UP"; pointer2=-1; break; case MotionEvent.ACTION_MOVE: action="ACTION_MOVE"; if(pointer1!=removed && pointer2!=removed){ nfx=event.getX(event.findPointerIndex(pointer1)); nfy=event.getY(event.findPointerIndex(pointer1)); nsx=event.getX(event.findPointerIndex(pointer2)); nsy=event.getY(event.findPointerIndex(pointer2)); //得到手指移动后第一,第二个触控点的横,纵坐标 mAngle=angleBetweenLines(fx,fy,sx,sy,nfx,nfy,nsx,nsy); //计算移动前后的角度差值 } if(mCurrentBox!=null && pointer2==removed){ mCurrentBox.setCurrent(current); } invalidate(); break; case MotionEvent.ACTION_CANCEL: action="ACTION_CANCEL"; mCurrentBox=null; pointer1=-1; pointer2=-1; break; default:; } Log.d(TAG,"action "+action+" at x="+current.x+" y="+current.y); return true; }
其中注意ACTION_DOWN与ACTION_POINTER_DOWN的区别,ACTION_DOWN是在第一根手指触摸屏幕时产生的事件,而ACTION_POINTER_DOWN是在多点触控下(也就是已经有手指触摸在屏幕上),又有一根手指触摸屏幕产生的事件。
上面代码中angleBetweenLines( )方法的实现:
public float angleBetweenLines(float fx, float fy, float sx, float sy, float nfx, float nfy, float nsx, float nsy){ float radian1=(float)Math.atan2(fy-sy,fx-sx); float radian2=(float)Math.atan2(nfy-nsy,nfx-nsx); float angle=(float)(Math.toDegrees(radian2-radian1)%360); if(angle<0){ angle+=360; } return angle; }利用反三角函数atan2( )计算出对应斜率的弧度,移动前后的弧度值相减,并转换为角度值。
onDraw( Canvas)的实现:
public void onDraw(Canvas canvas){ canvas.drawPaint(mBackgroundPaint); for(Box box:mBoxen){ if(mAngle!=null){ //mAngle存储的是angleBetweenLines方法中计算出的角度值 canvas.rotate(mAngle); //旋转画布 mAngle=null; } float leftX=Math.min(box.getCurrent().x,box.getOrigin().x); float leftY=Math.min(box.getCurrent().y,box.getOrigin().y); float rightX=Math.max(box.getCurrent().x,box.getOrigin().x); float rightY=Math.max(box.getCurrent().y,box.getOrigin().y); canvas.drawRect(leftX,leftY,rightX,rightY,mBoxPaint); } }
效果:
demo地址:https://github.com/zycoJamie/Rotate-Rectangle
阅读全文
0 0
- 旋转矩形框
- 矩形旋转
- opencv-Python旋转矩形框裁减
- openglesForC++矩形旋转
- android 矩形变换 图像旋转
- opencv 3.0 旋转矩形 RotatedRect
- 矩形旋转后的绘制
- RotatedRect类(旋转矩形)
- cocos旋转矩形碰撞检测
- 【Python】旋转打印各种矩形
- 计算机图形学_矩形的旋转
- 计算矩形旋转角度(不精确)
- cci-Q1.6 矩形90度旋转
- OpenGL学习记录——旋转矩形
- OpenGL中简单动画之矩形旋转
- OpenCV 求外接矩形以及旋转角度
- 计算未旋转2矩形相交面积
- OpenGL制作会旋转的矩形
- PAT程序设计考题——甲级1077(Kuchiguse ) C++实现
- git去除已经add index的文件
- 暑假杂感
- 作为一名及格的站长都知道内容为王,外链为皇”,一个上网站想要有一个好的排名除了要有吸惹人高质量的内容外还需要强年夜的外链。对于网站内容要环绕网站主题,若是自己文采欠好可以伪原创下,万万不要用工具伪原创
- python语言学习代码联系--small甲鱼课程学习
- 旋转矩形框
- struct2环境搭建
- 粗细粒度权限 --权限
- 今天又是充满希望的一天,实训第三天。美滋滋○| ̄|_ (╯‵□′)╯︵┻━┻。还是html css。
- springMVC增删改的实现过程
- 简单LinuxC程序关于统计0~n有多少个0~9(main函数的参数)
- HDU-4035 Maze(期望dp)
- Cookie Session跨站无法共享问题(单点登录解决方案)
- android 解析并显示dicom文件的数据和图像