最近被Flash,Exposure-AE,Focus-AF,LongExposure这几个模式搞得焦头烂额, 很多小伙伴在使用手机对准物体拍照时,点击手机界面,会发现点哪相机就会对哪个点有个对焦效果(Focus-AF);如果闪光灯开启的话,还会有一个打闪的效果(Flash);拖动太阳还会有调整亮度的效果(Exposure-AE);这些feature对使用者来说是使用最频繁的,对开发者来讲也是最难处理,联系最多最头大的几个模块了。今天,先把Exposure/AE拎出来在应用层角度讲一下它的处理。
1.Exposure滑动事件以及UI调整处理
以下代码为对点击以及滑动事件改变曝光亮度的处理
@Override
public boolean onDown(MotionEvent event) {
//按压屏幕的点击事件
return false;
}
@Override
public boolean onUp(MotionEvent event) {
//检测到手离开屏幕
if (!isEnvironmentReady()) {
return false;
}
if (!mExposureViewController.needUpdateExposureView()) {
return false;
}
mExposureViewController.onTrackingTouch(false);
return false;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
return false;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
//手指在屏幕上滑动事件的处理
if (!isEnvironmentReady()) {
return false;
}
if (!mExposureViewController.needUpdateExposureView()) {
return false;
}
float deltaY = e2.getY() - e1.getY();
float deltaX = e2.getX() - e1.getX();
//手机横屏或竖屏状态下滑动值的解析
if (Math.abs(deltaX) > Math.abs(deltaY)) {
if (mCompensationOrientation == 90 || mCompensationOrientation == 270) {
//横屏状态,x轴改变量作为亮度改变值
mExposureViewController.onVerticalScroll(e2, distanceX);
return true;
}
} else {
if (mCompensationOrientation == 0 || mCompensationOrientation == 180) {
//竖屏状态,y轴改变量作为亮度改变值
mExposureViewController.onVerticalScroll(e2, distanceY);
return true;
}
}
return false;
}
下一部分代码为曝光调节杆的处理
protected void onTrackingTouch(boolean start) {
if (mEvSeekBarChangedListener == null) {
return;
}
if (start) {
mEvSeekBarChangedListener.onStartTrackingTouch(mEvSeekbar);
} else {
mEvSeekBarChangedListener.onStopTrackingTouch(mEvSeekbar);
}
}
protected void onVerticalScroll(MotionEvent event, float delta) {
if (event.getPointerCount() == ONE_FINGER) {
//开始更新调节杆
updateEvProgressbar(delta);
}
}
private void updateEvProgressbar(float delta) {
int update = extractDeltaScale(delta, mEvSeekbar);
if (mLastProgress == update) {
return;
} else {
mLastProgress = update;
}
mEvSeekbar.setProgressDrawable(new ColorDrawable(Color.WHITE));
mEvSeekbar.setProgress(update);
}
//该函数为将手指在屏幕滑动的坐标差转换为滑动杆的改变幅度
private int extractDeltaScale(float deltaY, SeekBar seekbar) {
int y = (int) deltaY;
float scale;
float progress = seekbar.getProgress();
final int max = seekbar.getMax();
if (mOrientation == 0 || mOrientation == 90) {
scale = (float) (y) / (float) sAvailableSpace;
progress += scale * max;
}
if (mOrientation == 180 || mOrientation == 270) {
scale = (float) (-y) / (float) sAvailableSpace;
progress += scale * max;
}
if (progress > max) {
progress = max;
} else if (progress < 0) {
progress = 0;
}
return (int) progress;
}
//该函数为改变一下曝光调节杆的转