`
ableouou
  • 浏览: 73659 次
  • 性别: Icon_minigender_2
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

android camera 源码分析

阅读更多
这里主要是针对android2.2的
    首先,从manifest.xml出发。可以看到:
<activity android:name="com.android.ginwave.camera.Camera"
                android:configChanges="orientation|keyboardHidden"
                android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"
                android:screenOrientation="landscape"
                android:clearTaskOnLaunch="true"
                android:taskAffinity="android.task.camera">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            .
            .
            .
        </activity>
则首先进入的activity是camera.java。
    接着我们就主要分析camera这个类。
    由于camera代码庞大,所以仅针对需要修改的地方进行分析。
    1.如果想处理预览数据,则我们可以在camera中调用setPreviewCallback方法。实现重写onPreviewFrame的方法:
    camera.setPreviewCallback(new PreviewCallback(){
     public void onPreviewFrame(byte[] _data,Camera _camera){
      //增加对数据的处理
       }
    });

    2.拍照的时候,我们调用camera对象的takePicture方法,传递shutterCallback和pictureCallback 实现RAW和JPEG的编码图像。每个图像的回调函数都会得到一个以合适的格式表示图像的字节数组,并且shutter callback会在shutter关闭之后马上触发。
    private void takePicture(){
     camera.takePicture(shutterCallback,rawCallback,jepgCallback);
    }

    例如:
private final class ShutterCallback implements
android.hardware.Camera.ShutterCallback {
public void onShutter() {
mShutterCallbackTime = System.currentTimeMillis();
mShutterLag = mShutterCallbackTime - mCaptureStartTime;
Log.v(TAG, "mShutterLag = " + mShutterLag + "ms");
clearFocusState();
}
}
private final class RawPictureCallback implements PictureCallback {
public void onPictureTaken(byte[] rawData,
android.hardware.Camera camera) {// BY ABLE 数据
mRawPictureCallbackTime = System.currentTimeMillis();
Log.v(TAG, "mShutterToRawCallbackTime = "
+ (mRawPictureCallbackTime - mShutterCallbackTime) + "ms");
}
}

    在private class ImageCapture内:
     mCameraDevice.takePicture(mShutterCallback, mRawPictureCallback,
mPostViewPictureCallback, new JpegPictureCallback(loc));

    基本对数据的处理,就是对预览图像和拍照图像的处理。接着介绍下界面的修改:
     1.对于相机而言,主要的页面存在于camera.xml中。
       这里面有个自定义的布局:PreviewFrameLayout。我们可以在com.android.camera包下找到PreviewFrameLayout.java。它是ViewGroup的扩展类。里面有个FrameLayout/SurfaceView/FocusRectangle,SurfaceView用于显示预览图像、FocusRectangle是用来显示聚焦到拍照完成的那个框框的。
        可以在camera.xml中增加layout来显示自己需要的布局,但是相应地PreviewFrameLayout的布局大小要调整。(这里需要注意相机已经设定了程序是横屏执行的,并且屏蔽了转屏的事件),接着就是根据自己的需要来修改或者增加布局了,其中PreviewFrameLayout的位置主要是由
@Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {...}函数来控制。
    2.对于相机右侧的popupwindow的弹出项,可以在array.xml中进行添加。它主要是个PreferenceGroup。点击popupwindow的选项后,在HeadUpDisplay的90行中onSharedPreferencesChanged()->camera:2222->2169->2191->1972->1950->1818.也就是说我们要想对点击事件进行处理只需要对函数updateCameraParametersPreference()进行修改,当然针对改变的CameraSetting我们也要进行修改。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics