Saturday, March 15, 2014

OpenGL ES 2.0 trên android - Trả lời sự kiện chạm

Trả lời sự kiện chạm

Làm cho đối tượng di chuyển theo một chương trình định sẵn như hình tam giác xoay rất hữu ích để có được một số sự chú ý, nhưng những gì nếu bạn muốn có người dùng tương tác với đồ họa OpenGL ES của bạn? Chìa khóa để làm ứng dụng cảm ứng OpenGL ES của bạn tương tác được mở rộng thực hiện của bạn GLSurfaceView để ghi đè lên onTouchEvent () để lắng nghe cho các sự kiện liên lạc.
Bài học này cho bạn thấy làm thế nào để lắng nghe cho các sự kiện liên lạc cho phép người dùng xoay một đối tượng OpenGL ES.

1.1.   Cài đặt một Touch Listener

Để làm cho ứng dụng OpenGL ES phản ứng với các sự kiện chạm vào, bạn phải thực hiện onTouchEvent() trong lớp GLSurfaceView của bạn. Việc thực hiện ví dụ dưới đây cho thấy làm thế nào để lắng nghe cho các sự kiện MotionEvent.ACTION_MOVE và dịch chúng vào một góc quay cho một shape.
@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 - mPreviousX;
            float dy = y - mPreviousY;

            // 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 ;
            }

            mRenderer.setAngle(
                    mRenderer.getAngle() +
                    ((dx + dy) * TOUCH_SCALE_FACTOR);  // = 180.0f / 320
            requestRender();
    }

    mPreviousX = x;
    mPreviousY = y;
    return true;
}
Chú ý rằng sau khi tính toán góc quay, phương pháp này gọi requestRender () để cho các renderer rằng đó là thời gian để làm cho khung. Phương pháp này là hiệu quả nhất trong ví dụ này vì khung không cần phải được vẽ lại, trừ khi có một sự thay đổi trong vòng quay. Tuy nhiên, nó không có bất kỳ tác động hiệu quả trừ khi bạn cũng yêu cầu các renderer chỉ vẽ lại khi dữ liệu thay đổi bằng cách sử dụng hàm setRenderMode(), do đó hãy chắc chắn rằng dòng này là không chú thích trong renderer:
public MyGLSurfaceView(Context context) {

    ...
    // Render the view only when there is a change in the drawing data
    setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);

}

1.2.   Phơi bày các góc quay

Mã ví dụ trên yêu cầu bạn tiếp xúc với các góc quay thông qua renderer của bạn bằng cách thêm một thành viên public. Kể từ khi mã renderer đang chạy trên một thread khác từ phía giao diện người dùng chính thread của ứng dụng của bạn, bạn phải khai báo biến công cộng này là volatile. Đây là mã để làm điều đó:
public class MyGLRenderer implements GLSurfaceView.Renderer {

    ...
    public volatile float mAngle;

1.3.   Áp dụng phép xoay

Áp dụng phép xoay được tạo ra bởi đầu vào cảm ứng, chú thích ra các mã để tạo một góc và thêm mAngle, trong đó có các đầu vào tạo ra góc cảm ứng:
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(mRotationMatrix, 0, mAngle, 0, 0, -1.0f);

    // Combine the rotation matrix with the projection and camera view
    // Note that the mMVPMatrix factor *must be first* in order
    // for the matrix multiplication product to be correct.
    Matrix.multiplyMM(scratch, 0, mMVPMatrix, 0, mRotationMatrix, 0);

    // Draw triangle
    mTriangle.draw(scratch);
}
Khi bạn đã hoàn thành các bước mô tả ở trên, chạy chương trình và kéo tay của bạn trên màn hình để xoay hình tam giác:

Figure 1. Triangle being rotated with touch input (circle shows touch location).

No comments:

Post a Comment