Camera:Exposure / AE mode

    最近被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;
    }

    //该函数为改变一下曝光调节杆的转
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值