已阅读5页,还剩17页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Android4.4 Camera app初始化分析Camera app提供的主要功能:预览,拍照,摄影,全景拍摄而这些功能统一组织在CameraActivity这个组件中,并细分到各个模块逐步实现。其中涉及的类如下图PhotoModule:负责与拍照相关的部分VideoModule:负责与视频录制相关的部分WideAnglePanoramaModule:全景照片的拍摄接下来我们分析PhotoModule启动过程,其他两个模块类似。首先给出时序图,结合时序图,分析每一步的实现Step1:CameraActivity.onCreate()当在launcher界面点击camera图标的时候,该函数首先被调用。public void onCreate(Bundle state) setContentView(R.layout.camera_filmstrip);LayoutInflater inflater = getLayoutInflater(); View rootLayout = inflater.inflate(R.layout.camera, null, false); mCameraModuleRootView = rootLayout.findViewById(R.id.camera_app_root); mPanoStitchingPanel = findViewById(R.id.pano_stitching_progress_panel); mBottomProgress = (ProgressBar) findViewById(R.id.pano_stitching_progress_bar); mCameraPreviewData = new CameraPreviewData(rootLayout, FilmStripView.ImageData.SIZE_FULL, FilmStripView.ImageData.SIZE_FULL); / Put a CameraPreviewData at the first position. mWrappedDataAdapter = new FixedFirstDataAdapter( new CameraDataAdapter(new ColorDrawable( getResources().getColor(R.color.photo_placeholder), mCameraPreviewData); setModuleFromIndex(moduleIndex); mCurrentModule.init(this, mCameraModuleRootView);,该函数主要设置activity视图,并根据传过来的intent来判读改启动photomodule还是videomodule,当从launcher启动的时候moduleIndex肯定是0,所以会调用mCurrentModule = new PhotoModule();新建一个PhotoModule对象,该对象就是负责拍照相关的操作。Step2:PhotoModule(),对象创建之后,并没有做实质性的动作,我们接着往下看Step3:mCurrentModule.init(this,mCameraModuleRootView); mCurrentModule就是PhotoModule类的一个实例,public void init(CameraActivity activity, View parent) mActivity = activity; mRootView = parent; mUI = new PhotoUI(activity, this, parent); mPreferences = new ComboPreferences(mActivity); CameraSettings.upgradeGlobalPreferences(mPreferences.getGlobal(); mCameraId = getPreferredCameraId(mPreferences); mContentResolver = mActivity.getContentResolver(); / Surface texture is from camera screen nail and startPreview needs it. / This must be done before startPreview. mIsImageCaptureIntent = isImageCaptureIntent(); mPreferences.setLocalId(mActivity, mCameraId); CameraSettings.upgradeLocalPreferences(mPreferences.getLocal(); / we need to reset exposure for the preview resetExposureCompensation(); initializeControlByIntent(); mQuickCapture = mActivity.getIntent().getBooleanExtra(EXTRA_QUICK_CAPTURE, false); mLocationManager = new LocationManager(mActivity, mUI); mSensorManager = (SensorManager)(mActivity.getSystemService(Context.SENSOR_SERVICE); brightnessProgressBar = (ProgressBar)mRootView.findViewById(R.gress); if (brightnessProgressBar instanceof SeekBar) SeekBar seeker = (SeekBar) brightnessProgressBar; seeker.setOnSeekBarChangeListener(mSeekListener); brightnessProgressBar.setMax(MAXIMUM_BRIGHTNESS); brightnessProgressBar.setProgress(mbrightness); skinToneSeekBar = (SeekBar) mRootView.findViewById(R.id.skintoneseek); skinToneSeekBar.setOnSeekBarChangeListener(mskinToneSeekListener); skinToneSeekBar.setVisibility(View.INVISIBLE); Title = (TextView)mRootView.findViewById(R.id.skintonetitle); RightValue = (TextView)mRootView.findViewById(R.id.skintoneright); LeftValue = (TextView)mRootView.findViewById(R.id.skintoneleft); Storage.setSaveSDCard( mPreferences.getString(CameraSettings.KEY_CAMERA_SAVEPATH, 0).equals(1); 刚才介绍过Photomodule是负责camera照相功能的,主要协调界面的显示,参数的配置,方便用户根据自己的爱好来设置相关参数。参数View parent,是拍照界面的根节点, 即在cameraactivity中inflate 的R.layout.camera的camera_app_root视图。Init函数中做了很多重要的工作。创建UI视图,初始化基本参数,Step4:new PhotoUI(activity, this, parent)视图的真正创建是在PhotoUI对象中,我们接着往下看 public PhotoUI(CameraActivity activity, PhotoController controller, View parent) mActivity = activity; mController = controller; mRootView = parent; mActivity.getLayoutInflater().inflate(R.layout.photo_module, (ViewGroup) mRootView, true); mRenderOverlay = (RenderOverlay) mRootView.findViewById(R.id.render_overlay); mFlashOverlay = mRootView.findViewById(R.id.flash_overlay); mPreviewCover = mRootView.findViewById(R.id.preview_cover); / display the view mTextureView = (TextureView) mRootView.findViewById(R.id.preview_content); mTextureView.setSurfaceTextureListener(this); mTextureView.addOnLayoutChangeListener(mLayoutListener); initIndicators(); mShutterButton = (ShutterButton) mRootView.findViewById(R.id.shutter_button); mSwitcher = (ModuleSwitcher) mRootView.findViewById(R.id.camera_switcher); mSwitcher.setCurrentIndex(ModuleSwitcher.PHOTO_MODULE_INDEX); mSwitcher.setSwitchListener(mActivity); mMenuButton = mRootView.findViewById(R.id.menu); ViewStub faceViewStub = (ViewStub) mRootView .findViewById(R.id.face_view_stub); if (faceViewStub != null) faceViewStub.inflate(); mFaceView = (FaceView) mRootView.findViewById(R.id.face_view); setSurfaceTextureSizeChangedListener(mFaceView); mCameraControls = (CameraControls) mRootView.findViewById(R.id.camera_controls); mAnimationManager = new AnimationManager(); mOrientationResize = false; mPrevOrientationResize = false; 函数首先inflate R.layout.photo_module视图,挂在mRootView节点下,mRootView即是R.layout.camera中的camera_app_root视图,他是photomodule的根视图。photo_module这个视图包括了其他的一些重要视图,其中比较重要的几个mTextureView,mShutterButton,mSwitcher,faceViewStub,mCameraControls,mMenuButton等mTextureView:是TextureView控件,和surfaceview功能差不多,只是实现机制不同,都是用来显示流媒体的。Camera preview数据就在此显示mCameraControls:是个容器,包裹mShutterButton,mSwitcher,PieMenuButton,等控件mShutterButton:拍照按钮,mSwitcher:模式切换,faceViewStub脸部扑捉。mMenuButton:设置参数相关的step5:cameraactivity.onresume()界面和参数的初始化工作完成之后,camera activity进去resume状态,public void onResume() mOrientationListener.enable(); mCurrentModule.onResumeBeforeSuper(); super.onResume(); mCurrentModule.onResumeAfterSuper(); setSwipingEnabled(true); . 这里掉用了一个重要的函数mCurrentModule.onResumeAfterSuper();到目前为止我们还没有看到camera设备被打开的过程,什么原因,以前在oncreate的时候就打开了camera设备,难道是我们在前面分析的时候漏掉了,客官别急,切往下看。Step6,mCurrentModule.onResumeAfterSuper()调用这个函数之后,又进入到photomodule对象中了,我们来看一下具体实现public void onResumeAfterSuper() String action = mActivity.getIntent().getAction(); if (MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA.equals(action) | MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE.equals(action) Log.v(TAG, On resume, from lock screen.); mHandler.postDelayed(new Runnable() public void run() onResumeTasks(); , ON_RESUME_TASKS_DELAY_MSEC); else Log.v(TAG, On resume.); onResumeTasks(); mHandler.post(new Runnable() Override public void run() mActivity.updateStorageSpaceAndHint(); );函数先根据action类型做不同的处理,最终都会调用onResumeTasks函数。Step7:onResumeTasks();private void onResumeTasks() if (mOpenCameraFail | mCameraDisabled) return; mJpegPictureCallbackTime = 0; mZoomValue = 0; resetExposureCompensation(); if (!prepareCamera() / Camera failure. return; 函数接着调用prepareCamera进一步启动camera设备Step8:prepareCamera()private boolean prepareCamera() mCameraDevice = CameraUtil.openCamera( mActivity, mCameraId, mHandler, mActivity.getCameraOpenErrorCallback(); if (mCameraDevice = null) Log.e(TAG, Failed to open camera: + mCameraId); return false; mParameters = mCameraDevice.getParameters(); initializeCapabilities(); if (mFocusManager = null) initializeFocusManager(); setCameraParameters(UPDATE_PARAM_ALL); mHandler.sendEmptyMessage(CAMERA_OPEN_DONE); mCameraPreviewParamsReady = true; startPreview(); mOnResumeTime = SystemClock.uptimeMillis(); checkDisplayRotation(); return true; 这个是很重要的函数,函数先调用CameraUtil.openCamera来获取camera设备,CameraUtil.openCamera我们在上一篇文章中介绍过了,这里不做介绍了。获取到camera设备后,接着设置camera初始化参数,最后调用startPreview();启动预览。在启动预览的时候mHandler.sendEmptyMessage(CAMERA_OPEN_DONE);向mHandler发送了一个CAMERA_OPEN_DONE消息。Camera setting的部分测初始化是在这个阶段完成的。Step10:private void onCameraOpened() View root = mUI.getRootView(); int width = root.getWidth(); int height = root.getHeight(); mFocusManager.setPreviewSize(width, height); openCameraCommon(); resizeForPreviewAspectRatio(); 该函数还是比较简单的,设置mFocusManager区域大小,调用openCameraCommon进一步操作cameraStep11:openCameraCommon();private void openCameraCommon() loadCameraPreferences(); mUI.onCameraOpened(mPreferenceGroup, mPreferences, mParameters, this); if (mIsImageCaptureIntent) mUI.overrideSettings(CameraSettings.KEY_CAMERA_HDR_PLUS, mActivity.getString(R.string.setting_off_value); updateCameraSettings(); showTapToFocusToastIfNeeded();函数首先调用loadCameraPreferences函数,来加载默认初始数据R.xml.camera_preferences,将这些初始数据加载到内存中,最终保存在mPreferenceGroup变量中,被后面的UI空间使用。Step14:mUI.onCameraOpened(mPreferenceGroup, mPreferences, mParameters, this);加载完初始数据之后,下一步便是创建必要的UI控件public void onCameraOpened(PreferenceGroup prefGroup, ComboPreferences prefs, Camera.Parameters params, OnPreferenceChangedListener listener) if (mPieRenderer = null) mPieRenderer = new PieRenderer(mA
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- IT协调员岗位IT行业发展趋势分析
- 高校实验教学安全管理规范汇编
- 钢项目规划方案(范文模板)
- 小学唐诗诵读教学设计与活动安排
- 再生塑料循环利用基地建设项目施工方案
- 经开区集中供热项目施工方案
- 工业气体生产项目技术方案
- 智慧城市建设中功能材料的应用报告
- 幼儿园运动会开幕式主持词范本
- 幼儿早教课程设置与教学计划
- 小米全面预算管理案例
- 2025年船舶租赁合同协议书模板
- 慢性阻塞性肺疾病急性加重期诊疗指南
- 门头招牌长期合同范本
- 江苏省宿迁市泗阳县2024-2025学年高一上学期11月期中物理试题(含答案)
- 2025品牌情绪与增长白皮书
- 土地整治项目竣工验收汇报
- 超星尔雅学习通《人工智能与创业智慧(北京林业大学)》章节测试含答案
- 驾驶员上岗前培训考试及答案解析
- 2025年学校少先队知识应知应会题库(含答案)
- 体检中心护理安全培训课件
评论
0/150
提交评论