主要是实现了手指在屏幕上滑动实现平移,两个手指进行缩放。主要是这部分矩阵还挺麻烦的。

效果图如下所示:

核心部分代码如下

触控事件处理:

@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

Brush brush=brushes.get(i);

brush.draw(temp2);

}

}

/**

* 改变绘图坐标系的偏移值

* @param dx

* @param dy

*/

public void move(float dx, float dy){

//根据当前缩放的比例调节平移参数

translateM(translateMatrix,0,dx/zoomMatrix[0],dy/zoomMatrix[0],0);//添加平移参数

}

/**

* 缩放视图

* @param scale 缩放比例

*/

public void zoom(float scale){

scaleM(zoomMatrix,0,scale,scale,0);//添加缩放参数

}

android双指滑动方向,OpenGL ES2.0实现手指滑动平移、双指缩放Android相关推荐

  1. Eclipse中通过Android模拟器调用OpenGL ES2.0函数操作步骤

    1.  先按照http://blog.csdn.net/fengbingchun/article/details/10439281中操作搭建好基本的Android开发环境: 2.  打开Eclipse ...

  2. 初识 OpenGL ES2.0

    原文链接:Android OpenGLES2.0(一)--了解OpenGLES2.0 OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL 三维图形 API ...

  3. iOS OpenGL ES2.0教程   Lesson03 旋转

    iOS OpenGL ES2.0教程    Lesson03  旋转 注:可供翻译的课程只有前两课.从这节课起,我试着根据我对OpenGL ES的理解写接下去的课程,希望能和大家一起学习. 在上节课中 ...

  4. OpenGL ES2.0 – Iphone开发指引

    原文链接地址:http://www.raywenderlich.com/3664/opengl-es-2-0-for-iphone-tutorial 免责申明(必读!):本博客提供的所有教程的翻译原稿 ...

  5. OpenGL ES的性能范围(OpenGL ES2.0官方文档)

    http://blog.csdn.net/mengtnt/article/details/7773304 OpenGL ES 1.1和OpengGL ES2.0的规范中,都定义了每种实现必须支持的最低 ...

  6. opengl es2.0 渲染文字

    在OpenGL 家族中是没有提供直接渲染文字的接口,所以我们要在opengl中显示文字,就需要借助于其他的三方库或者自己解析绘制文字,然后使用opengl中的绘制接口去渲染出文字 这里我使用的free ...

  7. opengl es2.0 使用字符偏移图渲染文字

    在OpenGL 家族中是没有提供直接渲染文字的接口,所以我们要在opengl中显示文字,就需要借助于其他的三方库或者自己解析绘制文字,然后使用opengl中的绘制接口去渲染出文字 这里我使用的free ...

  8. Android BackgroundViewPager:类似桌面背景壁纸随手指滑动

     Android BackgroundViewPager:类似桌面背景壁纸随手指滑动 Android BackgroundViewPager要实现的功能和Android桌面极为类似,即,假设用户的 ...

  9. Android 基于OpenGL ES2.0 的CircleProgressBar

    之前想在播放器上加一个那种卡顿的转转提示: 类似: https://github.com/lsjwzh/MaterialLoadingProgressBar 这种效果的 由于当时没想到怎么在openg ...

最新文章

  1. Linux期末复习题库(1)
  2. 通过powerdns实现主机名解析
  3. 对下图所示的连通网络G,用克鲁斯卡尔(Kruskal)算法求G的最小生成树T,请写出在算法执行过程中,依次加入T的边集TE中的边。说明该算法的基本思想及贪心策略,并简要分析算法的时间复杂度
  4. Linux下交叉编译gdb和gdbserver
  5. java原始类型和引用类型_Java中的8种原始类型
  6. [转]面向对象的六大原则
  7. Wix 安装部署(二)自定义安装界面和行为
  8. 前端-requests-flask对应关系 HTTPTokenAuth
  9. ubuntu mysql主从库的搭建
  10. 摄像机跟随与视野调整
  11. 解决 Composer 运行时的 Xdebug 冲突
  12. 关于VS编译的程序内存分配只能用1.5~2G上限的优化方案
  13. 网易云 NeteaseCloudMusicApi 码云下载
  14. 【转载】Win10强制删除文件夹
  15. 360算法工程师初面总结
  16. 考研英语近义词与反义词·三
  17. 小虾米的求助Massage
  18. 微信小程相对图片路径_微信小程序中图片绝对定位(背景图片)的方法
  19. 安卓开发基础知识3(国内深度摄像头方案)
  20. SyntaxError: Non-ASCII character ‘\xe9‘ in file dun.py on line 4

热门文章

  1. 物联网大数据的爆发只是一个开始
  2. hibernate 错误 could not determine type for
  3. 关于jacob 无法创建ActiveXCompnent对象的几种可能性
  4. 马哥教育20-2期27号学员的7.27上课笔记
  5. java.lang.OutOfMemoryError: GC overhead limit exceeded 问题分析和解决(转)
  6. 【cocos2d-x从c++到js】10:JS与C++的交互2——JS与C++的“函数重载”问题
  7. C++ ini 文件处理类-简易版
  8. 310. 最小高度树
  9. brew 安装php7.1.6_mac上通过brew安装php7
  10. 【免费毕设】ASP.NET基于.NET的城市公交查询系统的实现与设计(源代码+lunwen)