0

我在android中有一个相机应用程序。有一个图像视图和两个按钮。当我处于横向模式时,两个按钮将在图像视图中可用,而当我处于纵向模式时,按钮必须隐藏并且纵横比是正确的。

在此处输入图像描述

公共类 CustomCameraActivity 扩展 Activity 实现 SurfaceHolder.Callback {

Camera camera;
SurfaceView surfaceView;
SurfaceHolder surfaceHolder;
boolean previewing = false;
LayoutInflater controlInflater = null;
Context context;
ImageView imageView;

SensorManager sensorManager;
float[] mGravs = new float[3];
float[] mGeoMags = new float[3];
float[] mRotationM = new float[16];
float[] mInclinationM = new float[16];
float[] mOrientation = new float[3];
float[] mOldOreintation = new float[3];
String[] mAccelerometer =  new String[3];
String[] mMagnetic =  new String[3];    
String[] mRotation =  new String[16];
String[] mInclination =  new String[16];
String[] mOrientationString =  new String[3];
String[] mOldOreintationString =  new String[3];


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

    setContentView(R.layout.main);

    context = this;

    sensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);

    //setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

    imageView = (ImageView)findViewById(R.id.imgError);

    getWindow().setFormat(PixelFormat.UNKNOWN);
    surfaceView = (SurfaceView)findViewById(R.id.camerapreview);
    surfaceHolder = surfaceView.getHolder();
    surfaceHolder.addCallback(this);
    surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

    controlInflater = LayoutInflater.from(getBaseContext());

    View viewControl = controlInflater.inflate(R.layout.custom, null);
    LayoutParams layoutParamsControl = new LayoutParams(LayoutParams.FILL_PARENT, 
                                                LayoutParams.FILL_PARENT);


    Button btn1 = (Button)viewControl.findViewById(R.id.Button01);
    Button btn2 = (Button)viewControl.findViewById(R.id.Button02);

    btn1.setOnClickListener(new OnClickListener() {

     @Override
         public void onClick(View arg0) {
            //Toast.makeText(context, "1111111111111111111111111", Toast.LENGTH_SHORT).show();
             camera.takePicture(null, null, mPicture);

             Constant.rotationValueForCamera = Constant.rotationValue;
        }
    });

    btn2.setOnClickListener(new OnClickListener() {

         @Override
         public void onClick(View arg0) {
            //Toast.makeText(context, "22222222222222222222222222", Toast.LENGTH_SHORT).show();
            Log.e("0 imagePickerStatus", Constant.imagePickerStatus+"");

            Constant.imagePickerStatus = 0;

            Log.e("0 imagePickerStatus", Constant.imagePickerStatus+"");


            finish();
        }
     });

    this.addContentView(viewControl, layoutParamsControl);

    int ot = getResources().getConfiguration().orientation;

    if(Configuration.ORIENTATION_LANDSCAPE == ot)
    {
        imageView.setVisibility(View.GONE);
        Log.e("ori1111", "land");
    }
    else
    {
        imageView.setVisibility(View.VISIBLE);
        Log.e("ori111", "port");
    }
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    // Checks the orientation of the screen
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {

        //Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
        imageView.setVisibility(View.GONE);
        Log.e("ori", "land");
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
        //Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
        imageView.setVisibility(View.VISIBLE);
        Log.e("ori", "port");
    }
  }

public String getPollDeviceAttitude()
{

   return Constant.rotationValueForCamera;
}

private SensorEventListener sensorEventListener = new SensorEventListener() {

    public void onAccuracyChanged(Sensor sensor, int accuracy) {

    }


    /* Get the Sensors */
    public void onSensorChanged(SensorEvent event) {

          switch (event.sensor.getType()) {
                 case Sensor.TYPE_ACCELEROMETER:
                          System.arraycopy(event.values, 0, mGravs, 0, 3);
                          break;
                 case Sensor.TYPE_MAGNETIC_FIELD:
                          System.arraycopy(event.values, 0, mGeoMags, 0, 3);
                          break;
                 case Sensor.TYPE_ORIENTATION:
                        System.arraycopy(event.values, 0, mOldOreintation, 0, 3);
                  break;

                 default:
                          return;
        }

            // If mGravs and mGeoMags have values then find rotation matrix
            if (mGravs != null && mGeoMags != null) {

                // checks that the rotation matrix is found
                boolean success = SensorManager.getRotationMatrix(mRotationM, mInclinationM, mGravs, mGeoMags);
                if (success) {
                    /* getOrientation Values */   
                    SensorManager.getOrientation(mRotationM, mOrientation);

                      for(int i=0; i<3; i++){
                          mAccelerometer[i] = Float.toString(mGravs[i]);
                          mMagnetic[i] = Float.toString(mGeoMags[i]);
                          mOrientationString[i] = Float.toString(mOrientation[i]);
                          mOldOreintationString[i] = Float.toString(mOldOreintation[i]);
                      }

                     /*  Make everything text to show on device 
                      TextView xaxisAccelerometerText = (TextView)findViewById(R.id.xaxisAccelerometer);
                      xaxisAccelerometerText.setText(mAccelerometer[0]);      
                      TextView yaxisAccelerometerText = (TextView)findViewById(R.id.yaxisAccelerometer);
                      yaxisAccelerometerText.setText(mAccelerometer[1]);
                      TextView zaxisAccelerometerText = (TextView)findViewById(R.id.zaxisAccelerometer);
                      zaxisAccelerometerText.setText(mAccelerometer[2]);    
                      TextView xaxisMagneticText = (TextView)findViewById(R.id.xaxisMagnetic);
                      xaxisMagneticText.setText(mMagnetic[0]);    
                      TextView yaxisMagneticText = (TextView)findViewById(R.id.yaxisMagnetic);
                      yaxisMagneticText.setText(mMagnetic[1]);
                      TextView zaxisMagneticText = (TextView)findViewById(R.id.zaxisMagnetic);
                      zaxisMagneticText.setText(mMagnetic[2]);
                      TextView xaxisOrientationText = (TextView)findViewById(R.id.xaxisOrientation);
                      xaxisOrientationText.setText(mOrientationString[0]);    
                      TextView yaxisOrientationText = (TextView)findViewById(R.id.yaxisOrientation);
                      yaxisOrientationText.setText(mOrientationString[1]);
                      TextView zaxisOrientationText = (TextView)findViewById(R.id.zaxisOrientation);
                      zaxisOrientationText.setText(mOrientationString[2]);
                      TextView xaxisOldOrientationText = (TextView)findViewById(R.id.xaxisOldOrientation);
                      xaxisOldOrientationText.setText(mOldOreintationString[0]);      
                      TextView yaxisOldOrientationText = (TextView)findViewById(R.id.yaxisOldOrientation);
                      yaxisOldOrientationText.setText(mOldOreintationString[1]);
                      TextView zaxisOldOrientationText = (TextView)findViewById(R.id.zaxisOldOrientation);
                      zaxisOldOrientationText.setText(mOldOreintationString[2]);*/

                      Constant.rotationValue = mOrientationString[0] + " " + mOrientationString[1] + " " + mOrientationString[2];





                }else{

                     /* Make everything text to show on device even if getRotationMatrix fails
                      String matrixFailed = "Rotation Matrix Failed";
                      TextView xaxisAccelerometerText = (TextView)findViewById(R.id.xaxisAccelerometer);
                      xaxisAccelerometerText.setText(mAccelerometer[0]);      
                      TextView yaxisAccelerometerText = (TextView)findViewById(R.id.yaxisAccelerometer);
                      yaxisAccelerometerText.setText(mAccelerometer[1]);
                      TextView zaxisAccelerometerText = (TextView)findViewById(R.id.zaxisAccelerometer);
                      zaxisAccelerometerText.setText(mAccelerometer[2]);    
                      TextView xaxisMagneticText = (TextView)findViewById(R.id.xaxisMagnetic);
                      xaxisMagneticText.setText(mMagnetic[0]);    
                      TextView yaxisMagneticText = (TextView)findViewById(R.id.yaxisMagnetic);
                      yaxisMagneticText.setText(mMagnetic[1]);
                      TextView zaxisMagneticText = (TextView)findViewById(R.id.zaxisMagnetic);
                      zaxisMagneticText.setText(mMagnetic[2]);
                      TextView xaxisOrientationText = (TextView)findViewById(R.id.xaxisOrientation);
                      xaxisOrientationText.setText(matrixFailed);     
                      TextView yaxisOrientationText = (TextView)findViewById(R.id.yaxisOrientation);
                      yaxisOrientationText.setText(matrixFailed);
                      TextView zaxisOrientationText = (TextView)findViewById(R.id.zaxisOrientation);
                      zaxisOrientationText.setText(matrixFailed);
                      TextView xaxisOldOrientationText = (TextView)findViewById(R.id.xaxisOldOrientation);
                      xaxisOldOrientationText.setText(mOldOreintationString[0]);      
                      TextView yaxisOldOrientationText = (TextView)findViewById(R.id.yaxisOldOrientation);
                      yaxisOldOrientationText.setText(mOldOreintationString[1]);
                      TextView zaxisOldOrientationText = (TextView)findViewById(R.id.zaxisOldOrientation);
                      zaxisOldOrientationText.setText(mOldOreintationString[2]);*/



                      Constant.rotationValue = mOrientationString[0] + " " + mOrientationString[1] + " " + mOrientationString[2];

                }
            }


    }
};

protected void onPause()
{
    super.onPause();

     sensorManager.unregisterListener(sensorEventListener);

}

@Override
public void onResume()
{
    super.onResume();



    sensorManager.registerListener(sensorEventListener, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
    sensorManager.registerListener(sensorEventListener, sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), SensorManager.SENSOR_DELAY_NORMAL);
    sensorManager.registerListener(sensorEventListener, sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION), SensorManager.SENSOR_DELAY_NORMAL);

    if(Constant.isCapturedOk)
    {
        Constant.isCapturedOk = false;

        finish();
    }

}



PictureCallback mPicture = new PictureCallback() {
    @Override
    public void onPictureTaken(byte[] data, Camera camera) {

        Log.e("Camrera", "22222222222222222");

        Intent intent =  new Intent(context, PreviewActivity.class);
         //intent.putExtra("data", data);

        Constant.imageData = data;

        startActivity(intent);


    }
};

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    if(previewing){
        camera.stopPreview();
        previewing = false;
    }

    if (camera != null){
        try {
            camera.setPreviewDisplay(surfaceHolder);
            camera.startPreview();
            previewing = true;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
    camera = Camera.open();
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    camera.stopPreview();
    camera.release();
    camera = null;
    previewing = false;
}


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

    Log.e("Tab", "Stoping");
}

@Override  
  public boolean onKeyDown(int keyCode,KeyEvent event) 
  {

      if(keyCode==KeyEvent.KEYCODE_BACK)
      {

          return true;

      }
    return super.onKeyDown(keyCode, event);


  }

}

4

1 回答 1

0

为纵向和横向创建不同的布局,如下所示:

http://mdaslam.wordpress.com/2013/01/15/android-programming-screen-orientationportrait-landscape/

并使用以下方法更改其他布局中按钮的可见性: android:visibility="invisible" 您的问题肯定会得到解决。

于 2013-09-18T10:43:46.527 回答