বাংলায় অ্যান্ড্রয়েড সহায়িকা - Bangla Android Guide

টাচ লিসেনার সেটআপ

আপনার OpenGL ES অ্যাপলিকেশনকে টাচ ইভেন্টে রেসপন্স করার জন্য তৈরী করতে , আপনাকে অবশ্যই আপনার GLSurfaceView ক্লাসে onTouchEvent()পদ্ধতি বাস্তবায়ন করতে হবে। নীচের বাস্তবায়ন উদাহরন দেখায় কীভাবে MotionEvent.ACTION_MOVE ইভেন্ট লিসেন করতে হয় এবং একটি শেপের জন্য রোটেশনের একটি এ্যাঙ্গেলে তাদের অনুবাদ করতে হয়।

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

উল্লেখ্য যে রোটেশন অ্যাঙ্গেল ক্যালকুলেকশন করার পর, এই পদ্ধতি requestRender() কে কল করে রেন্ডারকে বলতে চায় যে এটা ফ্রেমকে রেন্ডার করার সময়। এই উদাহরনে এই অ্যাপ্রোচ সবচেয়ে কার্যকরী কারন ফ্রেমটিকে নতুন করে অংকন করার কোন প্রয়োজন নেই যদি না সেখানে রোটেশনে একটি পরিবর্তন হয়। কিন্ত, এটা কার্যকারিতার উপর কোন প্রভাব ফেলে না যদি না আপনি আরও রিকোয়েস্ট করেন যে রেন্ডারার তখনই রিড্র (পূনরায় অংকন) করতে হবে যখন setRenderMode()পদ্ধতি ব্যবহার করে পরিবর্তন করে, সুতরাং নিশ্চিত করুন যে এই লাইন রেন্ডারের মধ্যে আনকমেন্টেড হয়:

public MyGLSurfaceView(Context context) {
    ...
    // Render the view only when there is a change in the drawing data
    setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
}