snapdragon camera menu控制与事件触发介绍
来源:互联网 发布:薛之谦网络合唱丑八怪 编辑:程序博客网 时间:2024/06/07 01:20
menu即拍照界面上排的选项按钮,有设置,吗,美颜,滤镜,闪光灯,情景模式等等。menu有photoMenu与videoMenu,这里以photoMenu为例介绍其控制流程。
这里以滤镜为例讲解流程。
photoMenu的初始化是在打开camera的时候实例化的。
camera启动后会调用PhotoModule.java里面的onCameraOpened> openCameraCommon最后在photoUI里面的onCameraOpened实例化
private void onCameraOpened() {
... ... ...
openCameraCommon();
... ... ...
}
private void openCameraCommon() {
loadCameraPreferences();//根据配置加载camera的switch按钮
mUI.onCameraOpened(mPreferenceGroup, mPreferences, mParameters, this, this);
... ... ...
}
PhotoUI.java 》new PhotoMenu(mActivity, this, makeupListener);即完成初始化并将实例设置上去
public void onCameraOpened(PreferenceGroup prefGroup, ComboPreferences prefs,
Camera.Parameters params, OnPreferenceChangedListener listener, MakeupLevelListener makeupListener) {
... ... ...
if (mMenu == null) {
mMenu = new PhotoMenu(mActivity, this, makeupListener);实例化menu并赋予点击事件
mMenu.setListener(listener);
}
mMenu.initialize(prefGroup);//实例化menu后初始化所有的menu选项
mMenuInitialized = true;
... ... ...
mGestures.setPhotoMenu(mMenu);//将menu添加到预览手势触摸点击事件控制器PreviewGestures.java(这个个控制器负责了整个预览界面触摸事件分发,保证正确的控件事件响应)
... ... ...
}
自此photoMenu已经初始化完毕,接下来的控制流程就直接到photoMenu.java里面看了。如上,这里以滤镜来解析其控制流程。如上实例化menu后调用了mMenu.initialize(Group).
super.initialize(group);
初始化包括filter按钮的初始值,根据初始值设置颜色,按钮的点击事件,点击后我们会看到左侧面会移出一侧边filter选项popmenu,此由addFilterMode实现,再下面是其显示动画
button.setVisibility(View.INVISIBLE);
final IconListPreference pref = (IconListPreference) mPreferenceGroup
.findPreference(CameraSettings.KEY_COLOR_EFFECT);//得到配置文件里面配置的所有滤镜信息
if (pref == null || pref.getValue() == null)
return;
changeFilterModeControlIcon(pref.getValue());//滤镜按钮(三个圈)数值更新,为none就灰显,不为none就蓝显
button.setVisibility(View.VISIBLE);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
closeMakeup();
addFilterMode();//加载滤镜选项,为滤镜menu布好局
ViewGroup menuLayout = mUI.getPreviewMenuLayout();
if (menuLayout != null) {
View view = mUI.getPreviewMenuLayout().getChildAt(0);
mUI.adjustOrientation();//确定方向
animateSlideIn(view, previewMenuSize, false);//动画飞出滤镜选择menu视图
}
}
});
}
final IconListPreference pref = (IconListPreference) mPreferenceGroup
.findPreference(CameraSettings.KEY_COLOR_EFFECT);//得到配置文件中的滤镜配置项
if (pref == null)
return;
Display display = wm.getDefaultDisplay();
CharSequence[] entries = pref.getEntries();//从配置项中得到所有滤镜条目
Resources r = mActivity.getResources();
int height = (int) (r.getDimension(R.dimen.filter_mode_height) + 2
* r.getDimension(R.dimen.filter_mode_padding) + 1);
int width = (int) (r.getDimension(R.dimen.filter_mode_width) + 2
* r.getDimension(R.dimen.filter_mode_padding) + 1);
int gridRes = 0;
boolean portrait = (rotation == 0) || (rotation == 180);
int size = height;
if (portrait) {//根据横竖屏加载对应布局
gridRes = R.layout.vertical_grid;
size = width;
} else {
gridRes = R.layout.horiz_grid;
}
private long startTime;
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
startTime = System.currentTimeMillis();
} else if (event.getAction() == MotionEvent.ACTION_UP) {
if (System.currentTimeMillis() - startTime < CLICK_THRESHOLD) {
pref.setValueIndex(j);
changeFilterModeControlIcon(pref.getValue());//根据点击的滤镜选项图片更新三圈图标
onSettingChanged(pref);//重新刷新一遍设置项,并使对应的滤镜预览生效。最后都是回调PhotoModule(其它xxxModule类同)里面的onSharedPreferenceChanged
for (View v1 : views) {
v1.setBackground(null);
}
ImageView image = (ImageView) v.findViewById(R.id.image);
image.setBackgroundColor(0xff33b5e5);//给点击的那个图片着色
}
}
return true;
}
});
if (i == init)
imageView.setBackgroundColor(0xff33b5e5);
TextView label = (TextView) layout2.findViewById(R.id.label);
imageView.setImageResource(thumbnails[i])//为对应的滤镜选项设置对应的表示图片
label.setText(entries[i]);
layout.addView(layout2);//将item加到pop布局里面
}
previewMenuLayout.addView(basic);
mPreviewMenu = basic;
public void onSettingChanged(ListPreference pref) {
tips:
所有的设置项改变,即各个menu的点击最后都会调用这个onSettingChanged触发camera根据设置项的改变preview新的数据与展示新的界面交互与显示。这里需要注意的是滤镜并不是在每个预览模式下都支持的,所以会通过updateFilterModeIcon重新规划menu是否可点击,比如在在选择了hdr mode时就不可以有滤镜。会将滤镜按钮灰显不可点击,如果原来是滤镜模式就会还原为普通模式。这里脱离滤镜选择旅程只是做个额外的介绍
if (scenePref == null || hdrPref == null) return;
if ((notSame(scenePref, CameraSettings.KEY_SCENE_MODE, Parameters.SCENE_MODE_AUTO))
|| (notSame(hdrPref, CameraSettings.KEY_CAMERA_HDR, mSettingOff))) {
buttonSetEnabled(mFilterModeSwitcher, false);//设置滤镜按钮不可点击
changeFilterModeControlIcon("none");//重新设置滤镜按钮为关闭
自此滤镜UI部分交互完毕,接下来是数据流部分,即点击对应的滤镜后preview的大致流程见上面对应滤镜选项点击事件触发super.onSettingChanged父类对应
MenuController.java里面
if (mListener != null) {
mListener.onSharedPreferenceChanged(pref);
}
}
onSharedPreferenceChanged实现在PhotoModule.java
public void onSharedPreferenceChanged(ListPreference pref) {//设置对应属性后都会被监听回调到这里更新各个属性后通过 onSharedPreferenceChanged() 调用setCameraParametersWhenIdle重新设置参数后preview出变化的数据
... ... ...
onSharedPreferenceChanged();//根据设置项更新后重新preview
public void onSharedPreferenceChanged() {
// ignore the events after "onPause()"
if (mPaused) return;
boolean recordLocation = RecordLocationPreference.get(mPreferences);
mLocationManager.recordLocation(recordLocation);
if(needRestart()){
Log.v(TAG, "Restarting Preview... Camera Mode Changed");
stopPreview();
startPreview();
setCameraState(IDLE);
mRestartPreview = false;
}
/* Check if the PhotoUI Menu is initialized or not. This
* should be initialized during onCameraOpen() which should
* have been called by now. But for some reason that is not
* executed till now, then schedule these functionality for
* later by posting a message to the handler */
if (mUI.mMenuInitialized) {
setCameraParametersWhenIdle(UPDATE_PARAM_PREFERENCE);//重新设置参数,这个就是上层preview数据变化的地方,底层会根据参数的改变设置滤镜
mUI.updateOnScreenIndicators(mParameters, mPreferenceGroup,
mPreferences);
} else {
mHandler.sendEmptyMessage(SET_PHOTO_UI_PARAMS);//这个消息接受者最后与上面一样调用setCameraParametersWhenIdle重新设置参数preview数据
}
resizeForPreviewAspectRatio();//根据设置项更新后重新preview包括屏幕比率
}
mUpdateSet |= additionalUpdateSet;
if (mCameraDevice == null) {
// We will update all the parameters when we open the device, so
// we don't need to do anything now.
mUpdateSet = 0;
return;
} else if (isCameraIdle()) {
setCameraParameters(mUpdateSet); //重新设置参数
... ... ...
if (mCameraDevice == null) {
return;
}
synchronized (mCameraDevice) {//切换前后摄时下面if全部刷一遍更新parameter
boolean doModeSwitch = false;
if ((updateSet & UPDATE_PARAM_INITIALIZE) != 0) {
updateCameraParametersInitialize();//貌似和录像有关
}
if ((updateSet & UPDATE_PARAM_ZOOM) != 0) {
updateCameraParametersZoom();
}
if ((updateSet & UPDATE_PARAM_PREFERENCE) != 0) {//重刷parameter参数//比如设置滤镜时,
doModeSwitch = updateCameraParametersPreference();
}
mCameraDevice.setParameters(mParameters);
// Switch to gcam module if HDR+ was selected
if (doModeSwitch && !mIsImageCaptureIntent) {
mHandler.sendEmptyMessage(SWITCH_TO_GCAM_MODULE);
}
}
}
接着updateCameraParametersPreference--》 qcomUpdateCameraParametersPreference();
private void qcomUpdateCameraParametersPreference() {
String colorEffect = mPreferences.getString(
CameraSettings.KEY_COLOR_EFFECT,
mActivity.getString(R.string.pref_camera_coloreffect_default));
Log.v(TAG, "Color effect value =" + colorEffect);
if (CameraUtil.isSupported(colorEffect, mParameters.getSupportedColorEffects())) {
mParameters.setColorEffect(colorEffect);
}
- snapdragon camera menu控制与事件触发介绍
- snapdragon camera 缩略图各个场景显示介绍
- snapdragon camera中专业名词简单介绍
- javascript控制事件触发
- javascript控制事件触发
- 第一代Snapdragon介绍
- menu介绍与实例
- 碰撞与触发事件
- 防止touch事件穿层从而触发下层menu响应
- php事件与事件监听、事件触发
- 事件委托、事件触发与事件冒泡
- trigger触发图片控制事件--动画效果
- <Linux+Qt>时间控制事件触发
- 代码控制按钮点击事件的触发
- 控制事件触发的时机问题
- Jquery控制点击事件的触发顺序
- 事件触发列表与解说
- 事件触发列表与解说
- AngularJS
- 我们爱分享----200多个js技巧代码
- msgServer(基于请求回应的网关服务器模板)
- jQuery学习笔记——jQuery选择器练习
- The AnimationClip 'xxx' used by the Animation component 'xxx' must be marked as Legacy.
- snapdragon camera menu控制与事件触发介绍
- okGo详细使用步骤(一)
- 字典树(前缀数)例题以及模板
- Codeforces Round #428 (Div. 2):D. Winter is here(组合数公式)
- 五个方法成为更好的程序员
- 浏览器同源政策及其规避方法
- win10安装scrapy
- SQLSERVER 存储过程分页算法
- 如何更改CPropertySheet的背景色