2013-09-12 6 views

ответ

1

Решили использовать ScaleGestureDetector.

Ниже приводится пример кода:

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); 
}} 
+0

можете ли вы привести пример? –

+1

@LakshmiNarayanan: Добавлен пример кода – Dhrupal

+0

благодаря большому помощнику. Я использую инфраструктуру min3D, пытаясь понять, какими могут быть общие функции из приведенного выше кода, который я могу использовать. –

0

Легкий способ добиться этого с помощью ArcballCamera

ArcballCamera arcball = new ArcballCamera(mContext, ((Activity)mContext).findViewById(R.id.linear_layout)); 
     arcball.setTarget(object3D); //your 3D Object 
     arcball.setPosition(0,0,4); //optional 
     //arcball.setScreenMappingRatio(-1); // Not yet merged at master branch as of now 

getCurrentScene().replaceAndSwitchCamera(getCurrentCamera(), arcball);