Java 如何使用GLSURFACHEVIEW创建和理解拖放和缩放事件
我制作了一个测试应用程序,它使用标准顶点、颜色和点缓冲区显示3D对象 我能Java 如何使用GLSURFACHEVIEW创建和理解拖放和缩放事件,java,android,opengl-es,touch,glsurfaceview,Java,Android,Opengl Es,Touch,Glsurfaceview,我制作了一个测试应用程序,它使用标准顶点、颜色和点缓冲区显示3D对象 我能 使用触摸事件旋转对象 使用GL10使用openGL ES 1.0渲染对象 一切都很好 现在,我想能够放大和缩小使用两个手指的“捏”动作。我找到了一些很好的教程和示例代码,但主要是针对ImageView的。我对Android还是半新手,我不完全了解如何让这个缩放功能在GLSurfaceView上工作 下面是我到目前为止为Activity类编写的代码。第一个触摸处理程序用于我通过为ImageView设计的教程找到的缩放事
- 使用触摸事件旋转对象
- 使用GL10使用openGL ES 1.0渲染对象
- 一切都很好
// Activity for rendering 3D object openGL ES 1.0
public class GL_ExampleActivity extends Activity
{
private GLSurfaceView surface;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
surface = new GL_ExampleSurfaceView(this);
setContentView(surface);
}
@Override
protected void onPause()
{
// TODO Auto-generated method stub
super.onPause();
surface.onPause();
}
@Override
protected void onResume()
{
// TODO Auto-generated method stub
super.onResume();
surface.onResume();
}
}
class GL_ExampleSurfaceView extends GLSurfaceView
{
private static final String TAG = "Touch";
Matrix matrix_new = new Matrix();
Matrix last_matrix = new Matrix();
static final int NONE = 0;
static final int DRAG = 1;
static final int ZOOM = 2;
int mode = NONE;
PointF start = new PointF();
PointF mid = new PointF();
float oldDist = 1f;
private final float SCALE_FACTOR = 180.0f / 320;
private GLRenderer renderer;
private float previous_x;
private float previous_y;
public GL_ExampleSurfaceView(Context context)
{
super(context);
renderer = new GLRenderer();
setRenderer(renderer);
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
}
@Override
public boolean onTouchEvent(MotionEvent e)
{
// handler for drag and zoom events
switch (e.getAction() & MotionEvent.ACTION_MASK)
{
case MotionEvent.ACTION_DOWN:
last_matrix.set(matrix_new);
start.set(e.getX(), e.getY());
Log.d(TAG, "mode=DRAG");
mode = DRAG;
//requestRender();
break;
case MotionEvent.ACTION_POINTER_DOWN:
oldDist = finger_distance(e);
Log.d(TAG, "oldDist=" + oldDist);
if (oldDist > 10f)
{
last_matrix.set(matrix_new);
finger_distance_midpoint(mid, e);
mode = ZOOM;
Log.d(TAG, "mode=ZOOM");
}
//requestRender();
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP:
mode = NONE;
Log.d(TAG, "mode=NONE");
//requestRender();
break;
case MotionEvent.ACTION_MOVE:
if (mode == DRAG)
{
matrix_new.set(last_matrix);
matrix_new.postTranslate(e.getX() - start.x, e.getY() - start.y);
}
else if (mode == ZOOM)
{
float newDist = finger_distance(e);
Log.d(TAG, "newDist=" + newDist);
if (newDist > 10f)
{
matrix_new.set(last_matrix);
float scale = newDist / oldDist;
matrix_new.postScale(scale, scale, mid.x, mid.y);
}
}
//requestRender();
break;
}
//view.setImageMatrix(matrix_new);
// handler for rotation event, y and x axis
float x = e.getX();
float y = e.getY();
switch (e.getAction())
{
case MotionEvent.ACTION_MOVE:
float dx = x - previous_x;
float dy = y - previous_y;
if (y > getHeight() / 2)
{
dx = dx * -1 ;
}
if (x < getWidth() / 2)
{
dy = dy * -1 ;
}
renderer.angle_x += dx * SCALE_FACTOR;
renderer.angle_y += dy * SCALE_FACTOR;
requestRender();
}
previous_x = x;
previous_y = y;
return true;
}
private float finger_distance(MotionEvent e)
{
float x = e.getX(0) - e.getX(1);
float y = e.getY(0) - e.getY(1);
return FloatMath.sqrt(x * x + y * y);
}
private void finger_distance_midpoint(PointF point, MotionEvent e)
{
float x = e.getX(0) + e.getX(1);
float y = e.getY(0) + e.getY(1);
point.set(x / 2, y / 2);
}
}
//用于渲染三维对象的活动openGL ES 1.0
公共类GL_示例活动扩展活动
{
私人GLSURFACHEVIEW表面;
@凌驾
创建时的公共void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
表面=新的GL_示例表面视图(此);
setContentView(表面);
}
@凌驾
受保护的void onPause()
{
//TODO自动生成的方法存根
super.onPause();
surface.onPause();
}
@凌驾
受保护的void onResume()
{
//TODO自动生成的方法存根
super.onResume();
surface.onResume();
}
}
类GL_示例surfaceview扩展了GLSurfaceView
{
私有静态最终字符串TAG=“Touch”;
矩阵矩阵_new=新矩阵();
矩阵last_矩阵=新矩阵();
静态最终int NONE=0;
静态最终整数阻力=1;
静态最终整数缩放=2;
int模式=无;
PointF start=新的PointF();
PointF mid=新的PointF();
浮动oldDist=1f;
私人最终浮动比例系数=180.0f/320;
私营部门;
私有浮动前_x;
私人浮动;
公共GL_示例SurfaceView(上下文)
{
超级(上下文);
renderer=新的GLRenderer();
设置渲染器(渲染器);
setRenderMode(GLSurfaceView.RENDERMODE_脏时);
}
@凌驾
公共事件(运动事件e)
{
//拖动和缩放事件的处理程序
开关(如getAction()&MotionEvent.ACTION\u掩码)
{
case MotionEvent.ACTION\u DOWN:
最后一个矩阵集合(矩阵新);
set(e.getX(),e.getY());
Log.d(标记“mode=DRAG”);
模式=拖动;
//requestRender();
打破
case MotionEvent.ACTION\u指针\u向下:
oldDist=手指距离(e);
Log.d(标记“oldDist=“+oldDist”);
如果(旧区>10f)
{
最后一个矩阵集合(矩阵新);
手指距离中点(中点,e);
模式=缩放;
Log.d(标记“mode=ZOOM”);
}
//requestRender();
打破
case MotionEvent.ACTION\u UP:
case MotionEvent.ACTION\u指针\u向上:
模式=无;
Log.d(标记“mode=NONE”);
//requestRender();
打破
case MotionEvent.ACTION\u移动:
如果(模式==拖动)
{
矩阵新集合(最后一个矩阵);
矩阵_new.postTranslate(e.getX()-start.x,e.getY()-start.y);
}
else if(模式==缩放)
{
float newDist=指距(e);
Log.d(标记“newDist=“+newDist”);
如果(新距离>10f)
{
矩阵新集合(最后一个矩阵);
浮动比例=新距离/旧距离;
矩阵_新的后标度(标度、标度、中x、中y);
}
}
//requestRender();
打破
}
//视图.setImageMatrix(新矩阵);
//旋转事件的处理程序,y轴和x轴
float x=e.getX();
float y=e.getY();
开关(如getAction())
{
case MotionEvent.ACTION\u移动:
浮点数dx=x——上一个_x;
float dy=y-上一个y;
如果(y>getHeight()/2)
{
dx=dx*-1;
}
if(x
再次感谢……有两种明显的方法