安卓照相机源码分析2——PreviewFrameLayout类
来源:互联网 发布:淘宝客ev是什么 编辑:程序博客网 时间:2024/06/05 21:59
PreviewFrameLayout类主要是实现预览纵横比的改变,默认是4:3。
主要xml类:res/layout/camera.xml video_camera.xml
继承于ViewGroup类,定义了接口OnSizeChangedListener(),监听尺寸是否改变。
private final DisplayMetrics mMetrics = new DisplayMetrics(); public PreviewFrameLayout(Context context, AttributeSet attrs) { super(context, attrs); ((Activity) context).getWindowManager() .getDefaultDisplay().getMetrics(mMetrics); }这里mMetrics获得了屏幕的尺寸,但下面并没有进行处理。
设置frame纵横比
public void setAspectRatio(double ratio) { if (ratio <= 0.0) throw new IllegalArgumentException(); if (mAspectRatio != ratio) { mAspectRatio = ratio; requestLayout(); } }当调用requestLayout()后,会执行onLayout()方法:
protected void onLayout(boolean changed, int l, int t, int r, int b) { int frameWidth = getWidth(); int frameHeight = getHeight(); FrameLayout f = mFrame; int horizontalPadding = f.getPaddingLeft() + f.getPaddingRight(); int verticalPadding = f.getPaddingBottom() + f.getPaddingTop(); int previewHeight = frameHeight - verticalPadding; int previewWidth = frameWidth - horizontalPadding; // resize frame and preview for aspect ratio if (previewWidth > previewHeight * mAspectRatio) { previewWidth = (int) (previewHeight * mAspectRatio + .5); } else { previewHeight = (int) (previewWidth / mAspectRatio + .5); } frameWidth = previewWidth + horizontalPadding; frameHeight = previewHeight + verticalPadding; int hSpace = ((r - l) - frameWidth) / 2; int vSpace = ((b - t) - frameHeight) / 2; mFrame.measure( MeasureSpec.makeMeasureSpec(frameWidth, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(frameHeight, MeasureSpec.EXACTLY)); mFrame.layout(l + hSpace, t + vSpace, r - hSpace, b - vSpace); if (mSizeListener != null) { mSizeListener.onSizeChanged(); } }其中l,t,r,b为PreviewFrameLayout的大小,方法里面有对mFrame尺寸的设置;
主要是学习measure方法的使用,一个MeasureSpec封装了父布局传递给子布局的布局要求,主要有三种模式:UNSPECIFIED,EXACTLY,AT_MOST。其中EXACTLY表示父元素完全确定子元素的大小。layout方法设置了mFrame的大小。
还有一个方法是继承自父类的onFinishInflate()方法:
protected void onFinishInflate() { mFrame = (FrameLayout) findViewById(R.id.frame); if (mFrame == null) { throw new IllegalStateException( "must provide child with id as \"frame\""); } }这个主要是此view的子类必须要有id为frame的FrameLayout控件,否则会抛出异常。
0 0
- 安卓照相机源码分析2——PreviewFrameLayout类
- 安卓照相机源码分析1——Switcher类,ShutterButton类,RotateImageView类
- 安卓照相机开发
- 安卓 照相机
- 自定义安卓照相机
- android源码解析—-camera 照相机 摄像机
- 安卓直播界面开发,自定义照相机拍照,前后摄像头切换教程加源码!
- 安卓addView源码分析
- 安卓照相机扫描号码拨打.apk
- 安卓系统源码编译系列(2)——安卓系统源码编译教程
- Android 最常用的设计模式五 安卓源码分析——建造者模式
- Android 最常用的设计模式十一 安卓源码分析—— 代理模式(proxy)
- Android 最常用的设计模式十 安卓源码分析——策略模式(Strategy)
- Android 最常用的设计模式三 安卓源码分析—Observer观察者模式
- Android 最常用的设计模式八 安卓源码分析—工厂方法模式factory
- Android 最常用的设计模式一 安卓源码分析—单例模式singleInstance
- 安卓源码分析(一)Andriod.mk
- 安卓 Drawable源码分析简述
- iOS从当前隐藏导航界面push到下一个显示导航界面出现闪一下的问题
- 对于windows驱动在debugview里无法看到日志的解决办法
- merges sort use c++
- 并行逻辑回归
- 路由转发规则 & Sitescope无限提示重启的BUG
- 安卓照相机源码分析2——PreviewFrameLayout类
- c++中vector的用法详解
- HTML标签
- hdu 2087 剪花布条
- Python:AttributeError: 问题
- 一个月来运营工作总结
- 朴素贝叶斯多项式模型个人笔记
- arccatalog不能创建ORACLE连接的问题
- 插入排序用递归实现