android双指滑动方向,OpenGL ES2.0实现手指滑动平移、双指缩放Android
主要是实现了手指在屏幕上滑动实现平移,两个手指进行缩放。主要是这部分矩阵还挺麻烦的。
效果图如下所示:
核心部分代码如下
触控事件处理:
@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相关推荐
- Eclipse中通过Android模拟器调用OpenGL ES2.0函数操作步骤
1. 先按照http://blog.csdn.net/fengbingchun/article/details/10439281中操作搭建好基本的Android开发环境: 2. 打开Eclipse ...
- 初识 OpenGL ES2.0
原文链接:Android OpenGLES2.0(一)--了解OpenGLES2.0 OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL 三维图形 API ...
- iOS OpenGL ES2.0教程 Lesson03 旋转
iOS OpenGL ES2.0教程 Lesson03 旋转 注:可供翻译的课程只有前两课.从这节课起,我试着根据我对OpenGL ES的理解写接下去的课程,希望能和大家一起学习. 在上节课中 ...
- OpenGL ES2.0 – Iphone开发指引
原文链接地址:http://www.raywenderlich.com/3664/opengl-es-2-0-for-iphone-tutorial 免责申明(必读!):本博客提供的所有教程的翻译原稿 ...
- OpenGL ES的性能范围(OpenGL ES2.0官方文档)
http://blog.csdn.net/mengtnt/article/details/7773304 OpenGL ES 1.1和OpengGL ES2.0的规范中,都定义了每种实现必须支持的最低 ...
- opengl es2.0 渲染文字
在OpenGL 家族中是没有提供直接渲染文字的接口,所以我们要在opengl中显示文字,就需要借助于其他的三方库或者自己解析绘制文字,然后使用opengl中的绘制接口去渲染出文字 这里我使用的free ...
- opengl es2.0 使用字符偏移图渲染文字
在OpenGL 家族中是没有提供直接渲染文字的接口,所以我们要在opengl中显示文字,就需要借助于其他的三方库或者自己解析绘制文字,然后使用opengl中的绘制接口去渲染出文字 这里我使用的free ...
- Android BackgroundViewPager:类似桌面背景壁纸随手指滑动
Android BackgroundViewPager:类似桌面背景壁纸随手指滑动 Android BackgroundViewPager要实现的功能和Android桌面极为类似,即,假设用户的 ...
- Android 基于OpenGL ES2.0 的CircleProgressBar
之前想在播放器上加一个那种卡顿的转转提示: 类似: https://github.com/lsjwzh/MaterialLoadingProgressBar 这种效果的 由于当时没想到怎么在openg ...
最新文章
- Linux期末复习题库(1)
- 通过powerdns实现主机名解析
- 对下图所示的连通网络G,用克鲁斯卡尔(Kruskal)算法求G的最小生成树T,请写出在算法执行过程中,依次加入T的边集TE中的边。说明该算法的基本思想及贪心策略,并简要分析算法的时间复杂度
- Linux下交叉编译gdb和gdbserver
- java原始类型和引用类型_Java中的8种原始类型
- [转]面向对象的六大原则
- Wix 安装部署(二)自定义安装界面和行为
- 前端-requests-flask对应关系 HTTPTokenAuth
- ubuntu mysql主从库的搭建
- 摄像机跟随与视野调整
- 解决 Composer 运行时的 Xdebug 冲突
- 关于VS编译的程序内存分配只能用1.5~2G上限的优化方案
- 网易云 NeteaseCloudMusicApi 码云下载
- 【转载】Win10强制删除文件夹
- 360算法工程师初面总结
- 考研英语近义词与反义词·三
- 小虾米的求助Massage
- 微信小程相对图片路径_微信小程序中图片绝对定位(背景图片)的方法
- 安卓开发基础知识3(国内深度摄像头方案)
- SyntaxError: Non-ASCII character ‘\xe9‘ in file dun.py on line 4
热门文章
- 物联网大数据的爆发只是一个开始
- hibernate 错误 could not determine type for
- 关于jacob 无法创建ActiveXCompnent对象的几种可能性
- 马哥教育20-2期27号学员的7.27上课笔记
- java.lang.OutOfMemoryError: GC overhead limit exceeded 问题分析和解决(转)
- 【cocos2d-x从c++到js】10:JS与C++的交互2——JS与C++的“函数重载”问题
- C++ ini 文件处理类-简易版
- 310. 最小高度树
- brew 安装php7.1.6_mac上通过brew安装php7
- 【免费毕设】ASP.NET基于.NET的城市公交查询系统的实现与设计(源代码+lunwen)