Author Topic: I wanna use camera preview  (Read 724 times)

Offline lanslot

  • byte
  • *
  • Posts: 11
    • View Profile
I wanna use camera preview
« on: January 20, 2016, 04:32:06 am »
 :)hi,EgonOlsen:
there is a trouble,i don't know how to use Camera Preview
i open the camera Under the GLView,but there isn't any effect

Code: [Select]
// Used to handle pause and resume...
    private static ModelViewActivity master = null;
    private GLSurfaceView mGLView;
    private MyRenderer renderer = null;
    private FrameBuffer fb = null;
    private World world = null;
    private RGBColor back = new RGBColor(255, 255, 255, 255);

    private float touchTurn = 0;
    private float touchTurnUp = 0;

    private float xpos = -1;
    private float ypos = -1;

    private double start_distance = 0;
    private double distance = 0;

    private Object3D model = null;
    private int fps = 0;
    private boolean gl2 = true;

    private Light sun = null;

    private float scale = 0;

    FrameLayout frameLayout;
    private MovementHandler _movementHandler = new MovementHandler();
    SurfaceView surfaceView;

    android.hardware.Camera mCamera;

    protected void onCreate(Bundle savedInstanceState) {

        Logger.log("onCreate");

        if (master != null) {
            copy(master);
        }

        super.onCreate(savedInstanceState);
        //添加一个FrameLayout,布局文件不知道怎么滴,用不了,只有这么添加了
        frameLayout = new FrameLayout(getApplication());
        frameLayout.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
        surfaceView = new SurfaceView(getApplication());
        surfaceView.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
        //设置SurfaceView开启相机预览
        surfaceView.getHolder().addCallback(this);
        surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        frameLayout.addView(surfaceView);

        mGLView = new GLSurfaceView(getApplication());
//        设置GLView透明
        mGLView.setZOrderOnTop(true);
        mGLView.setEGLConfigChooser(8, 8, 8, 8, 16, 0);
        mGLView.getHolder().setFormat(PixelFormat.TRANSLUCENT);
        renderer = new MyRenderer();
        mGLView.setRenderer(renderer);

        frameLayout.addView(mGLView);
        setContentView(frameLayout);
        //开始相机预览
        mCamera = android.hardware.Camera.open();

    }

    @Override
    protected void onPause() {
        super.onPause();
        mGLView.onPause();
        mCamera.stopPreview();
    }

    @Override
    public void onBackPressed() {
        super.onBackPressed();
        finish();
    }

    @Override
    protected void onResume() {
        super.onResume();
        mGLView.onResume();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        mCamera.release();
    }

    @Override
    protected void onStop() {
        super.onStop();
    }

    private void copy(Object src) {
        try {
            Logger.log("Copying data from master Activity!");
            Field[] fs = src.getClass().getDeclaredFields();
            for (Field f : fs) {
                f.setAccessible(true);
                f.set(this, f.get(src));
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 计算两点间的距离
     */
    private double spacing(MotionEvent event) {
        float x = event.getX(0) - event.getX(1);
        float y = event.getY(0) - event.getY(1);
        return Math.sqrt(x * x + y * y);
    }

    int mode = 0;

    public boolean onTouchEvent(MotionEvent me) {
        switch (me.getAction() & MotionEvent.ACTION_MASK) {
            case MotionEvent.ACTION_DOWN:
                mode = 1;
                xpos = me.getX();
                ypos = me.getY();
                break;

            case MotionEvent.ACTION_UP:
                mode = 0;
                xpos = -1;
                ypos = -1;
                touchTurn = 0;
                touchTurnUp = 0;
                break;

            case MotionEvent.ACTION_POINTER_DOWN:
                start_distance = spacing(me);
                mode += 1;
                break;

            case MotionEvent.ACTION_POINTER_UP:
                mode -= 1;
                break;

            case MotionEvent.ACTION_MOVE:
                if (mode >= 2) {
                    distance = spacing(me);
                    if (distance != start_distance) {
                        scale = (float) (distance / start_distance);
                        start_distance = distance;
                    }
                    break;
                }
                float xd = me.getX() - xpos;
                float yd = me.getY() - ypos;

                xpos = me.getX();
                ypos = me.getY();

                touchTurn = xd / -100f;
                touchTurnUp = yd / -100f;
                break;
        }

        try {
            Thread.sleep(15);
        } catch (Exception e) {
            // No need for this...
        }
        return true;
    }

    protected boolean isFullscreenOpaque() {
        return true;
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        try {
            mCamera.setPreviewDisplay(surfaceView.getHolder());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        android.hardware.Camera.Parameters params = mCamera.getParameters();
        List<android.hardware.Camera.Size> sizes = params.getSupportedPreviewSizes();
        android.hardware.Camera.Size selected = sizes.get(0);
        params.setPreviewSize(selected.width, selected.height);
        mCamera.setParameters(params);

        mCamera.startPreview();
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {

    }

    class MyRenderer implements GLSurfaceView.Renderer {

        private long time = System.currentTimeMillis();

        public MyRenderer() {
        }

        public void onSurfaceChanged(GL10 gl, int w, int h) {
            if (fb != null) {
                fb.dispose();
            }
            fb = new FrameBuffer(gl, w, h); // OpenGL ES 1.x constructor

            if (master == null) {

                world = new World();
                world.setAmbientLight(20, 20, 20);

                sun = new Light(world);
                sun.setIntensity(250, 250, 250);

                Texture texture = new Texture(getResources().getDrawable(R.mipmap.body_d));
                fb.blit(texture,0,0,0,0,128,128,128,128,10,true,null);
                TextureManager.getInstance().addTexture("texture", texture);

                try {
                    model = Object3D.mergeAll(Loader.load3DS(getAssets().open("objs/hk.3ds"), 1));
                } catch (IOException e) {
                    e.printStackTrace();
                }
                model.setTexture("texture");

                model.clearRotation();
                model.rotateZ((float) Math.PI);
                model.rotateY((float) Math.PI);

                model.strip();
                model.build();

                world.addObject(model);

                Camera cam = world.getCamera();
                cam.moveCamera(Camera.CAMERA_MOVEOUT, 50);
                cam.lookAt(model.getTransformedCenter());

                SimpleVector sv = new SimpleVector();
                sv.set(model.getTransformedCenter());
                sv.y -= 100;
                sv.z -= 100;
                sun.setPosition(sv);
                MemoryHelper.compact();

                if (master == null) {
                    Logger.log("Saving master Activity!");
                    master = ModelViewActivity.this;
                }
            }
        }

        public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        }

        public void onDrawFrame(GL10 gl) {
            if (touchTurn != 0) {
                model.rotateY(touchTurn);
                touchTurn = 0;
            }

            if (touchTurnUp != 0) {
                model.rotateX(touchTurnUp);
                touchTurnUp = 0;
            }

            if (scale != 0) {
                model.scale(scale);
                scale = 0;
            }
            fb.clear(back);
            world.renderScene(fb);
            world.draw(fb);
            fb.display();

            if (System.currentTimeMillis() - time >= 1000) {
                Logger.log(fps + "fps");
                fps = 0;
                time = System.currentTimeMillis();
            }
            fps++;
        }
    }
}
please help me. ;D

Offline EgonOlsen

  • Administrator
  • quad
  • *****
  • Posts: 11977
    • View Profile
    • http://www.jpct.net
Re: I wanna use camera preview
« Reply #1 on: January 20, 2016, 08:18:01 am »

Offline lanslot

  • byte
  • *
  • Posts: 11
    • View Profile
Re: I wanna use camera preview
« Reply #2 on: January 20, 2016, 08:49:40 am »
Thank you for your halp,Sir. ;D