OpenGL ES2.0实现手指滑动平移、双指缩放Android
16lz
2021-01-26
主要是实现了手指在屏幕上滑动实现平移,两个手指进行缩放。主要是这部分矩阵还挺麻烦的。
效果图如下所示:
核心部分代码如下
触控事件处理:
@SuppressLint("ClickableViewAccessibility") @Override public boolean onTouch(View view, MotionEvent motionEvent) { //ACTION_DOWN不return true,就无触发后面的各个事件 if (motionEvent != null) { final float normalizedX =toOpenGLCoord(view,motionEvent.getX(),true); final float normalizedY =toOpenGLCoord(view,motionEvent.getY(),false); switch (motionEvent.getActionMasked()){ case MotionEvent.ACTION_DOWN: X=normalizedX; Y=normalizedY; break; case MotionEvent.ACTION_POINTER_DOWN: isZooming=true; float x1=toOpenGLCoord(view,motionEvent.getX(1),true); float y1=toOpenGLCoord(view,motionEvent.getY(1),false); dis_start=computeDis(normalizedX,x1,normalizedY,y1); break; case MotionEvent.ACTION_MOVE: if(isZooming){ float x2=toOpenGLCoord(view,motionEvent.getX(1),true); float y2=toOpenGLCoord(view,motionEvent.getY(1),false); double dis=computeDis(normalizedX,x2,normalizedY,y2); double scale=dis/dis_start; zoom((float) scale); dis_start=dis; }else { move(normalizedX - X, normalizedY - Y); X = normalizedX; Y = normalizedY; } break; case MotionEvent.ACTION_POINTER_UP: isZooming=false; X = normalizedX; Y = normalizedY; break; case MotionEvent.ACTION_UP: break; default:break; } return true; } return false; } /** * 屏幕坐标系点转OpenGL坐标系 * @return */ private static float toOpenGLCoord(View view,float value,boolean isWidth){ if(isWidth){ return (value / (float) view.getWidth()) * 2 - 1; }else { return -((value / (float) view.getHeight()) * 2 - 1); } } /** * 计算两个点之间的距离 * @param x1 * @param x2 * @param y1 * @param y2 * @return */ private static double computeDis(float x1,float x2,float y1,float y2){ return sqrt(pow((x2-x1),2)+pow((y2-y1),2)); }
render部分矩阵处理:
private final float[] translateMatrix = new float[16];//平移矩阵 private final float[] zoomMatrix = new float[16];//缩放矩阵 @Override public void onSurfaceCreated(GL10 gl10, EGLConfig eglConfig) { glClearColor(1.0f, 1.0f, 1.0f, 1.0f); //初始化平移矩阵和缩放矩阵为单位矩阵 setIdentityM(translateMatrix,0);//建立单位矩阵 setIdentityM(zoomMatrix,0);//建立单位矩阵 } @Override public void onDrawFrame(GL10 gl10) { glClear(GL_COLOR_BUFFER_BIT); //平移支持 //两个矩阵相乘 float[] temp = new float[16]; multiplyMM(temp, 0, projectionMatrix, 0, translateMatrix, 0); float[] temp2 = new float[16]; multiplyMM(temp2, 0, zoomMatrix, 0, temp, 0); Log.e(TAG,"重新绘制"); for(int i=0;i
更多相关文章
- Android动画详解之Android动画属性和实现方法(一)
- Android(安卓)ImageView ScaleTypes介绍
- 分享:android图片浏览器—类微信朋友圈相片浏览【android代码下载
- android图形图像函数汇集
- android修改图片(修改图片大小,图片旋转,图片平移)
- Android(安卓)bitmap 图片缩放,压缩处理
- imageView属性之imageView.setScaleType详解
- Android(安卓)Canvas笔记
- Android(安卓)根据屏幕尺寸适配控件尺寸(按比例缩放)