Search code examples
androidglsurfaceviewrajawali

Want to apply pinch and zoom to GLSurfaceView(3d Object)


I am using rajawali library for loading .obj file.

My .obj rendering perfectly fine but not able to apply pinch and zoom functionality to it.


Solution

  • Have solved using ScaleGestureDetector.

    Following is the sample code:

    public class MainActivity extends RajawaliExampleActivity implements OnTouchListener, OnObjectPick {// ,
                                                                                                        // BackfromTemple
                                                                                                        // {
    private RajawaliLoadModelRenderer mRenderer;
    private float mPreviousX;
    // private float mPreviousY;
    private final float TOUCH_SCALE_FACTOR = 180.0f / 320;
    private ScaleGestureDetector mScaleDetector;
    private boolean isRotationStarted;
    private boolean firsttime = false;
    private Camera cam;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mRenderer = new RajawaliLoadModelRenderer(this);
        mRenderer.setSurfaceView(mSurfaceView);
        super.setRenderer(mRenderer);
        mSurfaceView.setOnTouchListener(this);
        initLoader();
        mScaleDetector = new ScaleGestureDetector(getBaseContext(), mRenderer);
    
        firsttime = false;
        cam = mRenderer.getCamera();
        mSurfaceView.setPreserveEGLContextOnPause(true);
    }
    
    
    void showProgressDialog(final Context c, final String msg) {
        runOnUiThread(new Runnable() {
    
            @Override
            public void run() {
                pd = new ProgressDialog(c);
                pd.setMessage(msg);
                pd.setCancelable(false);
                pd.setIndeterminate(true);
                if (!pd.isShowing()) {
                    pd.show();
                }
            }
        });
    
    }
    
    protected void hideProgressDialog() {
        runOnUiThread(new Runnable() {
    
            @Override
            public void run() {
                if (pd != null && pd.isShowing()) {
                    pd.dismiss();
                }
            }
        });
    
    }
    
    @Override
    protected void onRestart() {
        super.onRestart();
    
        firsttime = true;
        isRotationStarted = false;
    
        mRenderer.mPickedObject = null;
        runOnUiThread(new Runnable() {
    
            @Override
            public void run() {
                if (SuperActivity.pd != null && SuperActivity.pd.isShowing()) {
                    SuperActivity.pd.dismiss();
                }
            }
        });
    }
    
    @Override
    public boolean onTouchEvent(MotionEvent e) {
        mScaleDetector.onTouchEvent(e);
        float x = e.getX();
        float y = e.getY();
    
        if (e.getAction() == MotionEvent.ACTION_MOVE) {
            float dx = x - mPreviousX;
            // float dy = y - mPreviousY;
            if (Math.abs(dx) > 2.5) {
                isRotationStarted = true;
                mRenderer.mObjectGroup.getRotation().y -= dx * TOUCH_SCALE_FACTOR;
            }
            // else if (Math.abs(dy) > 2.5) {
            // isRotationStarted = true;
            // mRenderer.mObjectGroup.getRotation().x -= dy *
            // TOUCH_SCALE_FACTOR;
            // }
        }
    
        mPreviousX = x;
        return false;
    }
    
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        mScaleDetector.onTouchEvent(event);
        float x = event.getX();
        // float y = event.getY();
    
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            mRenderer.getObjectAt(event.getX(), event.getY());
            // if (mRenderer.isObjectPicked) {
            // showProgressDialog();
            // }
        } else if (event.getAction() == MotionEvent.ACTION_MOVE) {
            // if (mRenderer.isObjectPicked) {
            float dx = x - mPreviousX;
            // float dy = y - mPreviousY;
            if (Math.abs(dx) > 2.5 && mRenderer.mObjectGroup != null) {
                isRotationStarted = true;
                mRenderer.mObjectGroup.getRotation().y -= dx * TOUCH_SCALE_FACTOR;
            }
            // else if (Math.abs(dy) > 2.5 && mRenderer.mObjectGroup != null) {
            // isRotationStarted = true;
            // mRenderer.mObjectGroup.getRotation().x -= dy *
            // TOUCH_SCALE_FACTOR;
            // }
            // }
        } else if (event.getAction() == MotionEvent.ACTION_CANCEL || event.getAction() == MotionEvent.ACTION_UP) {
    
            isRotationStarted = false;
    
            mRenderer.mPickedObject = null;
    
            // runOnUiThread(new Runnable() {
            // @Override
            // public void run() {
            // if (!mRenderer.isObjectPicked) {
            // hideProgressDialog();
            // isRotationStarted = false;
            // mRenderer.isObjectPicked = false;
            // mRenderer.mPickedObject = null;
            // }
            // }
            // });
        }
    
        mPreviousX = x;
        // mPreviousY = y;
    
        return true;
    }
    
    @Override
    public void objSelected(BaseObject3D object) {
    
        final Intent i = new Intent(this, newactivity.class);
        String objName = object.getName();
    
    
        isRotationStarted = false;
    
        mRenderer.mPickedObject = null;
        startActivity(i);
    }}