java 安卓触摸,响应触摸事件  |  Android 开发者  |  Android Developers

使对象根据预设程序(例如旋转的三角形)移动有助于吸引用户的注意力,但如果您希望用户与您的 OpenGL ES 图形互动的话,该怎么办呢?让 OpenGL ES 应用触摸互动的关键是扩展您的

本课程介绍了如何监听触摸事件,以使用户可以旋转 OpenGL ES 对象。

设置触摸监听器

为了使您的 OpenGL ES 应用响应触摸事件,您必须在

Kotlin

private const val TOUCH_SCALE_FACTOR: Float = 180.0f / 320f

...

private var previousX: Float = 0f

private var previousY: Float = 0f

override fun onTouchEvent(e: MotionEvent): Boolean {

// MotionEvent reports input details from the touch screen

// and other input controls. In this case, you are only

// interested in events where the touch position changed.

val x: Float = e.x

val y: Float = e.y

when (e.action) {

MotionEvent.ACTION_MOVE -> {

var dx: Float = x - previousX

var dy: Float = y - previousY

// reverse direction of rotation above the mid-line

if (y > height / 2) {

dx *= -1

}

// reverse direction of rotation to left of the mid-line

if (x < width / 2) {

dy *= -1

}

renderer.angle += (dx + dy) * TOUCH_SCALE_FACTOR

requestRender()

}

}

previousX = x

previousY = y

return true

}Java

private final float TOUCH_SCALE_FACTOR = 180.0f / 320;

private float previousX;

private float previousY;

@Override

public boolean onTouchEvent(MotionEvent e) {

// MotionEvent reports input details from the touch screen

// and other input controls. In this case, you are only

// interested in events where the touch position changed.

float x = e.getX();

float y = e.getY();

switch (e.getAction()) {

case MotionEvent.ACTION_MOVE:

float dx = x - previousX;

float dy = y - previousY;

// reverse direction of rotation above the mid-line

if (y > getHeight() / 2) {

dx = dx * -1 ;

}

// reverse direction of rotation to left of the mid-line

if (x < getWidth() / 2) {

dy = dy * -1 ;

}

renderer.setAngle(

renderer.getAngle() +

((dx + dy) * TOUCH_SCALE_FACTOR));

requestRender();

}

previousX = x;

previousY = y;

return true;

}

请注意,计算过旋转角度之后,此方法会调用

Kotlin

class MyGlSurfaceView(context: Context) : GLSurfaceView(context) {

init {

// Render the view only when there is a change in the drawing data

renderMode = GLSurfaceView.RENDERMODE_WHEN_DIRTY

}

}Java

public MyGLSurfaceView(Context context) {

...

// Render the view only when there is a change in the drawing data

setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);

}

公开旋转角度

上述示例代码要求您添加公开成员,以此来通过渲染程序公开旋转角度。由于渲染程序代码在独立于应用的主界面线程的线程上运行,因此必须将此公开变量声明为 volatile。以下是用于声明变量和公开 getter 和 setter 对的代码:

Kotlin

class MyGLRenderer4 : GLSurfaceView.Renderer {

@Volatile

var angle: Float = 0f

}Java

public class MyGLRenderer implements GLSurfaceView.Renderer {

...

public volatile float mAngle;

public float getAngle() {

return mAngle;

}

public void setAngle(float angle) {

mAngle = angle;

}

}

应用旋转

要应用触摸输入生成的旋转,请为生成角度的代码取消备注并添加包含触摸输入生成的角度的变量:

Kotlin

override fun onDrawFrame(gl: GL10) {

...

val scratch = FloatArray(16)

// Create a rotation for the triangle

// long time = SystemClock.uptimeMillis() % 4000L;

// float angle = 0.090f * ((int) time);

Matrix.setRotateM(rotationMatrix, 0, angle, 0f, 0f, -1.0f)

// Combine the rotation matrix with the projection and camera view

// Note that the mvpMatrix factor *must be first* in order

// for the matrix multiplication product to be correct.

Matrix.multiplyMM(scratch, 0, mvpMatrix, 0, rotationMatrix, 0)

// Draw triangle

triangle.draw(scratch)

}Java

public void onDrawFrame(GL10 gl) {

...

float[] scratch = new float[16];

// Create a rotation for the triangle

// long time = SystemClock.uptimeMillis() % 4000L;

// float angle = 0.090f * ((int) time);

Matrix.setRotateM(rotationMatrix, 0, mAngle, 0, 0, -1.0f);

// Combine the rotation matrix with the projection and camera view

// Note that the vPMatrix factor *must be first* in order

// for the matrix multiplication product to be correct.

Matrix.multiplyMM(scratch, 0, vPMatrix, 0, rotationMatrix, 0);

// Draw triangle

mTriangle.draw(scratch);

}

完成上述步骤后,运行程序并在屏幕上拖动手指以旋转该三角形:

2e5b48345840918aa324f58fd83546ca.png

图 1.使用触摸输入进行旋转的三角形(圆圈表示触摸位置)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值