在自定义相机FrameLayout上添加按钮

时间:2014-06-21 09:51:00

标签: android android-camera android-framelayout

我制作了一个简单的自定义相机应用。现在我想在相机屏幕上添加我自己的按钮。我该怎么做。这是我的layout.xml代码。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="${packageName}.${activityClass}" >

    <FrameLayout
        android:id="@+id/framelayout"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="21dp"
        android:layout_weight="1" >

     <Button android:id="@+id/but2" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" /> 
    </FrameLayout>


</LinearLayout>

1 个答案:

答案 0 :(得分:1)

你的xml文件,Main.xml

         <?xml version="1.0" encoding="utf-8"?>
         < LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:orientation="vertical" 
          android:layout_width="fill_parent"
          android:layout_height="fill_parent"
           android:id="@+id/layout">
            <TextView android:layout_width="fill_parent"
           android:layout_height="wrap_content" android:text="Camera Demo"
           android:textSize="24sp" />
          <FrameLayout android:id="@+id/preview"
           android:layout_weight="1" android:layout_width="fill_parent"
              android:layout_height="fill_parent">
           </FrameLayout>

           <Button android:layout_width="wrap_content"
            android:layout_height="wrap_content" android:id="@+id/buttonClick"
            android:text="Click" android:layout_gravity="center"></Button>

              </LinearLayout> 

您的预览课程

           class Preview extends SurfaceView implements SurfaceHolder.Callback {
              private static final String TAG = "Preview";

           SurfaceHolder mHolder;
         public Camera camera;

          Preview(Context context) {
              super(context);

    // Install a SurfaceHolder.Callback so we get notified when the
    // underlying surface is created and destroyed.
    mHolder = getHolder();
    mHolder.addCallback(this);
    mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}

public void surfaceCreated(SurfaceHolder holder) {
    // The Surface has been created, acquire the camera and tell it where
    // to draw.
    camera = Camera.open();
    try {
        camera.setPreviewDisplay(holder);


        camera.setPreviewCallback(new PreviewCallback() {

            public void onPreviewFrame(byte[] data, Camera arg1) {
                FileOutputStream outStream = null;
                try {
                    outStream = new FileOutputStream(String.format("/sdcard/%d.jpg", System.currentTimeMillis()));    
                    outStream.write(data);
                    outStream.close();
                    Log.d(TAG, "onPreviewFrame - wrote bytes: " + data.length);
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                }
                    Preview.this.invalidate();
            }
        });
    } catch (IOException e) {
        e.printStackTrace();
    }
}

public void surfaceDestroyed(SurfaceHolder holder) {
    // Surface will be destroyed when we return, so stop the preview.
    // Because the CameraDevice object is not a shared resource, it's very
    // important to release it when the activity is paused.
    camera.stopPreview();
    camera = null;
}

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
    // Now that the size is known, set up the camera parameters and begin
    // the preview.
    Camera.Parameters parameters = camera.getParameters();
     //        parameters.setPreviewSize(w, h);
        camera.setParameters(parameters);
        camera.startPreview();
     }

@Override
public void draw(Canvas canvas) {
        super.draw(canvas);
        Paint p= new Paint(Color.RED);
        Log.d(TAG,"draw");
        canvas.drawText("PREVIEW", canvas.getWidth()/2, canvas.getHeight()/2, p );
}

}

和CameraDemo.class

           public class CameraDemo extends Activity {
           private static final String TAG = "CameraDemo";
           Camera camera;
           Preview preview;
           Button buttonClick;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    preview = new Preview(this);
    ((FrameLayout) findViewById(R.id.preview)).addView(preview);

    buttonClick = (Button) findViewById(R.id.buttonClick);
    buttonClick.setOnClickListener( new OnClickListener() {
        public void onClick(View v) {
            preview.camera.takePicture(shutterCallback, rawCallback, jpegCallback);
        }
    });

    Log.d(TAG, "onCreate'd");
}


ShutterCallback shutterCallback = new ShutterCallback() {
    public void onShutter() {
        Log.d(TAG, "onShutter'd");
    }
};

/** Handles data for raw picture */
PictureCallback rawCallback = new PictureCallback() {
    public void onPictureTaken(byte[] data, Camera camera) {
        Log.d(TAG, "onPictureTaken - raw");
    }
};

/** Handles data for jpeg picture */
PictureCallback jpegCallback = new PictureCallback() {
    public void onPictureTaken(byte[] data, Camera camera) {
        FileOutputStream outStream = null;
        long time = 0;
        try {
            // write to local sandbox file system
        // outStream =    CameraDemo.this.openFileOutput(String.format("%d.jpg", System.currentTimeMillis()), 0);        
            // Or write to sdcard
            time =  System.currentTimeMillis();
            outStream = new FileOutputStream(String.format("/sdcard/%d.jpg",time));    
            outStream.write(data);
            outStream.close();
            Log.d(TAG, "onPictureTaken - wrote bytes: " + data.length);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {



        }
        Log.d(TAG, "onPictureTaken - jpeg");
       }
         };

        }

希望这会对你有所帮助