如何阻止布局中特定部分的方向,另一部分应该随方向而改变?

时间:2013-12-06 17:53:29

标签: android android-layout

我使用表面视图创建了一个视频捕获应用程序,我在此布局中有一个页眉和页脚栏。我想阻止只有表面视图的方向更改,而页眉和页脚应该随方向而改变。

public class MainActivity extends Activity implements SurfaceHolder.Callback{

private SurfaceHolder surfaceHolder;
private SurfaceView surfaceView;
public MediaRecorder mrec = new MediaRecorder();
private ImageButton startRecording = null;
//private Button stopRecording = null;
File video;
private Camera mCamera;
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
}

@Override
public void onCreate(Bundle savedInstanceState) {  
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Log.i(null , "Video starting");
    startRecording = (ImageButton)findViewById(R.id.buttonstart);
    mCamera = Camera.open();
    surfaceView = (SurfaceView) findViewById(R.id.surface_camera);

    surfaceHolder = surfaceView.getHolder();
    surfaceHolder.addCallback(this);
    surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}

@Override
public boolean onCreateOptionsMenu(Menu menu)
{
    menu.add(0, 0, 0, "StartRecording");
    menu.add(0, 1, 0, "StopRecording");
    return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item)
{
    switch (item.getItemId())
    {
    case 0:
        try {
            startRecording();
        } catch (Exception e) {
            String message = e.getMessage();
            Log.i(null, "Problem Start"+message);
            mrec.release();
        }
        break;

    case 1: //GoToAllNotes
        mrec.stop();
        mrec.release();
        mrec = null;
        break;

    default:
        break;
    }
    return super.onOptionsItemSelected(item);
}
public void StrBtnClick(View view) throws IOException
{
    startRecording();   
}

protected void startRecording() throws IOException 
{
    mrec = new MediaRecorder();  // Works well
    mCamera.unlock();

    mrec.setCamera(mCamera);

    mrec.setPreviewDisplay(surfaceHolder.getSurface());
    mrec.setVideoSource(MediaRecorder.VideoSource.CAMERA);
    mrec.setAudioSource(MediaRecorder.AudioSource.MIC); 

    mrec.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));
    mrec.setPreviewDisplay(surfaceHolder.getSurface());
    mrec.setOutputFile("/sdcard/Myvideo.3gp"); 

    mrec.prepare();  
    mrec.start();
}

protected void stopRecording() {
    mrec.stop();
    mrec.release();
    mCamera.release();
}

private void releaseMediaRecorder(){
    if (mrec != null) {
        mrec.reset();   // clear recorder configuration
        mrec.release(); // release the recorder object
        mrec = null;
        mCamera.lock();           // lock camera for later use
    }
}

private void releaseCamera(){
    if (mCamera != null){
        mCamera.release();        // release the camera for other applications
        mCamera = null;
    }
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
        int height) {
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
    if (mCamera != null){
        Parameters params = mCamera.getParameters();
        mCamera.setParameters(params);
    }
    else {
        Toast.makeText(getApplicationContext(), "Camera not available!", Toast.LENGTH_LONG).show();
        finish();
    }
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    mCamera.stopPreview();
    mCamera.release();
}

}

1 个答案:

答案 0 :(得分:0)

我会从您的Activity中删除onLayout并将其添加到SurfaceView,应该是这样的:

private CustomSurfaceView surfaceView; //line 4.

class CustomSurfaceView extends SurfaceView { //at the end of your Activity
   public CSurfaceView(Context context, AttributeSet attrs) {
       super(context, attrs);
   }

   @Override
   protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
   }
}

这样,SurfaceView不会受到任何布局更改的影响。