3

私はアンドロイドに少し新しいです。指だけで 3D オブジェクトにピンチ/ズーム効果を適用したい。ImageView で画像のピンチ/ズーム効果を参照しました。GLSurfaceView で 3D オブジェクト (トリングル、キューブなど) を表示しようとしました。オブジェクトは表示でき、回転することもできますが、ピンチ/ズーム効果を適用して 3D オブジェクトをズームできません。

http://www3.ntu.edu.sg/home/ehchua/programming/android/Android_3D.html http://insanitydesign.com/wp/projects/nehe-androidにアクセスしたリンクの一部をリストします。 -ports/ http://x-tutorials.blogspot.sg/2011/11/implement-pinch-zoom-in-ontouchlistener.html

ここでコードを提供しています...

public class MyGLActivity extends Activity {

    private GLSurfaceView glView;   // Use GLSurfaceView
    public static Context context;

   // Call back when the activity is started, to initialize the view
   @Override
   protected void onCreate(Bundle savedInstanceState) 
   {
      super.onCreate(savedInstanceState);

      glView = new MyGLSurfaceView(this);           // Allocate a GLSurfaceView

      setContentView(glView);                // This activity sets to GLSurfaceView
   }


   // Call back when the activity is going into the background
   @Override
   protected void onPause() {
      super.onPause();
      //glView.onPause();
   }

   // Call back after onPause()
   @Override
   protected void onResume() {
      super.onResume();
     // glView.onResume();
   }


 class MyGLSurfaceView extends GLSurfaceView
   {
       private final float TOUCH_SCALE_FACTOR = 180.0f / 320;
        private float mPreviousX;
        private float mPreviousY;

        // touch events
        private final int NONE = 0;
        private final int DRAG = 0;
        private final int ZOOM = 0;

        // pinch to zoom
        float oldDist = 100.0f;
        float newDist;

        int mode = 0;

        MyGLRenderer renderer;

        public MyGLSurfaceView(Context context) 
        {
            super(context);

            renderer=new MyGLRenderer();
            setRenderer(renderer);


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

    public boolean onTouchEvent(MotionEvent event)
    {
        //Log.e("tag", "Touched");
        //Toast.makeText(this.getContext(), "Touched",Toast.LENGTH_SHORT).show();


        float x = event.getX();
        float y = event.getY();
        switch (event.getAction())
        {
                case MotionEvent.ACTION_DOWN:           // one touch: drag
                    mode = DRAG;
                    break;
                case MotionEvent.ACTION_POINTER_DOWN:   // two touches: zoom
                    oldDist = spacing(event);
                    if (oldDist > 10.0f) {
                        mode = ZOOM; // zoom
                    }
                    break;
                case MotionEvent.ACTION_UP:     // no mode
                    mode = NONE;
                    oldDist = 100.0f;
                    break;
                case MotionEvent.ACTION_POINTER_UP:     // no mode
                    mode = NONE;
                    oldDist = 100.0f;
                    break;
                case MotionEvent.ACTION_MOVE:                       // rotation
                    if (event.getPointerCount() > 1 && mode == ZOOM) 
                    {
                        newDist = spacing(event);
                        //Log.d("SPACING: ", "OldDist: " + oldDist + ", NewDist: " + newDist);
                        if (newDist > 10.0f) 
                        {
                            float scale = newDist/oldDist; // scale
                            // scale in the renderer




                            Log.i("Zoom", "Zooming......");

                            oldDist = newDist;
                        }
                    }
                    else if (mode == DRAG)
                    {
                        float dx = x - mPreviousX;
                        float dy = y - mPreviousY;
                        renderer.mAngleX += dx * TOUCH_SCALE_FACTOR;
                        renderer.mAngleY += dy * TOUCH_SCALE_FACTOR;
                        requestRender();
                    }
                    break;
                }
                mPreviousX = x;
                mPreviousY = y;
                return true;
        }
   }

    private float spacing(MotionEvent event)
    {
        float x = event.getX(0) - event.getX(1);
        float y = event.getY(0) - event.getY(1);
        return (float) Math.sqrt(x * x + y * y);
    }

}

3D キューブにズーム効果を適用するデモの例を教えてください。私はこの問題に行き詰まっており、それ以上の作業は停止しています。どんな助けでも大歓迎です。前もって感謝します

4

0 に答える 0