长沙做网站优化,长沙专门做网站公司有哪些,wordpress安装后台,深圳网站建设公司佳速互联最近做项目#xff0c;做到了要让视频缩放的功能#xff0c;所以写了一个小DEMO#xff0c;进行双指手势的操作#xff0c;DEMO是使用TextView做测试#xff0c;实际使用监听放在TextureView也是正常运行。首先就是记录下触摸屏幕的手指数量#xff0c;一个手指触摸的时候…最近做项目做到了要让视频缩放的功能所以写了一个小DEMO进行双指手势的操作DEMO是使用TextView做测试实际使用监听放在TextureView也是正常运行。首先就是记录下触摸屏幕的手指数量一个手指触摸的时候进行移动操作两个手指触摸的时候进行缩放操作大于两个手指触摸的时候将不进行操作。缩放模式的时候主要是记录下第一次双指间距通过ACTION_MOVE回调得到的最新双指间距和第一次得到的双指间距对比通过setScaleX和setScaleY进行缩放的比例改变。而移动模式的时候需要注意到可移动的范围不能超过View的范围。通过setPivotX和setPivotY进行放大后的移动。代码分解如下1.记录触摸手指的个数(触摸数量的变化在onTouch方法)定义缩放最大和最小的比例。isCanTouch 就是在外部可以选择是否开启手势缩放。private boolean isCanTouch false;private int point_num 0;//当前触摸的点数public static final float SCALE_MAX 8.0f; //最大的缩放比例private static final float SCALE_MIN 1.0f;//最小缩放比例2.是否开启手势缩放public void setIsCanTouch(boolean canTouch) {isCanTouch canTouch;}3.计算两个手指之间的距离的方法。/*** 计算两个点的距离** param event* return*/private double spacing(MotionEvent event) {if (event.getPointerCount() 2) {float x event.getX(0) - event.getX(1);float y event.getY(0) - event.getY(1);return Math.sqrt(x * x y * y);} else {return 0;}}4.使用setScaleX和setScaleY进行缩放的比例改变。5.使用setPivotX和setPivotY进行放大后的移动。onTouch方法如下Overridepublic boolean onTouch(View v, MotionEvent event) {if (!isCanTouch) {return false;}switch (event.getAction() MotionEvent.ACTION_MASK) {case MotionEvent.ACTION_DOWN:point_num 1;downX event.getX();downY event.getY();break;case MotionEvent.ACTION_UP:point_num 0;downX 0;downY 0;break;case MotionEvent.ACTION_MOVE:if (point_num 1) {//只有一个手指的时候才有移动的操作float lessX (float) (downX - event.getX());float lessY (float) (downY - event.getY());moveX event.getX();moveY event.getY();moveRawX event.getRawX();moveRawY event.getRawY();setSelfPivot(lessX, lessY);//setPivot(getPivotX() lessX, getPivotY() lessY);} else if (point_num 2) {//只有2个手指的时候才有放大缩小的操作moveDist spacing(event);double space moveDist - oldDist;float scale (float) (getScaleX() space / getWidth());if (scale SCALE_MIN scale SCALE_MAX) {setScale(scale);} else if (scale SCALE_MIN) {setScale(SCALE_MIN);}}break;case MotionEvent.ACTION_POINTER_DOWN:oldDist spacing(event);//两点按下时的距离point_num 1;break;case MotionEvent.ACTION_POINTER_UP:point_num - 1;break;}return true;}6.移动的方法设置了边界值不让View移动到View的范围外。/*** 触摸使用的移动事件** param lessX* param lessY*/private void setSelfPivot(float lessX, float lessY) {float setPivotX 0;float setPivotY 0;setPivotX getPivotX() lessX;setPivotY getPivotY() lessY;Log.e(lawwingLog, setPivotX: setPivotX setPivotY: setPivotY getWidth: getWidth() getHeight: getHeight());if (setPivotX 0 setPivotY 0) {setPivotX 0;setPivotY 0;} else if (setPivotX 0 setPivotY 0) {setPivotY 0;if (setPivotX getWidth()) {setPivotX getWidth();}} else if (setPivotX 0 setPivotY 0) {setPivotX 0;if (setPivotY getHeight()) {setPivotY getHeight();}} else {if (setPivotX getWidth()) {setPivotX getWidth();}if (setPivotY getHeight()) {setPivotY getHeight();}}setPivot(setPivotX, setPivotY);}