unity3d新手小游戏教程的相机如何实现在安卓手机上自动聚焦功能

代码与范例:首先需要在Manifest文件中添加以下内容:
以使程序获取摄像头使用以及自动对焦功能的使用权限。
CameraTestActivity.java
import android.app.Aimport android.os.Bimport android.view.Wimport android.view.WindowMpublic class CameraTestActivity extends Activity {
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
requestWindowFeature(Window.FEATURE_NO_TITLE);// 设置横屏模式以及全屏模式
setContentView(new CameraView(this)); //设置View
  CameraView.java
import java.io.FileOutputSimport android.content.Cimport android.hardware.Cimport android.os.Eimport android.view.MotionEimport android.view.SurfaceHimport android.view.SurfaceVpublic class CameraView extends SurfaceView implements SurfaceHolder.Callback, Camera.PictureCallback {
private SurfaceH
private boolean
public CameraView(Context context) {//构造函数
super(context);
holder = getHolder();//生成Surface Holder
holder.addCallback(this);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);//指定Push Buffer
public void surfaceCreated(SurfaceHolder holder) {//Surface生成事件的处理try {
camera = Camera.open();//摄像头的初始化
camera.setPreviewDisplay(holder);
} catch (Exception e) {
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {//Surface改变事件的处理
Camera.Parameters parameters = camera.getParameters();
parameters.setPreviewSize(width, height);
camera.setParameters(parameters);//设置参数
camera.startPreview();//开始预览
public void surfaceDestroyed(SurfaceHolder holder) {//Surface销毁时的处理
camera.setPreviewCallback(null);
camera.stopPreview();
camera.release();
camera =null;
public boolean onTouchEvent(MotionEvent event) {//屏幕触摸事件if (event.getAction() == MotionEvent.ACTION_DOWN) {//按下时自动对焦
camera.autoFocus(null);
}if (event.getAction() == MotionEvent.ACTION_UP && af ==true) {//放开后拍照
camera.takePicture(null, null, this);
af =false;
}returntrue;
public void onPictureTaken(byte[] data, Camera camera) {//拍摄完成后保存照片try {
String path = Environment.getExternalStorageDirectory() +"/test.jpg";
data2file(data, path);
} catch (Exception e) {
camera.startPreview();
private void data2file(byte[] w, String fileName) throws Exception {//将二进制数据转换为文件的函数
FileOutputStream out =null;try {
out =new FileOutputStream(fileName);
out.write(w);
out.close();
} catch (Exception e) {if (out !=null)
out.close();throw
  说明:这是一个简单的示例程序。功能是使用自动对焦功能拍摄一张照片保存于SD卡根目录下。需要注意的是要在manifest文件中声明相关的许可。本例中许多参数都没有设置,可以根据具体需要进行适当的修改以满足特定要求。
sunshangfeng
浏览: 6398 次
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'关于unity3d 安卓手机怎么用控制摄像机_百度知道
关于unity3d 安卓手机怎么用控制摄像机
我有更好的答案
  1.认识Unity3D
Unity3D是一个让开发者能够在多平台制作同一款游戏的游戏开发工具,有专业的图像处理和游戏引擎,能做出各式各样的游戏。
羽化以前认为Android游戏开发只能在Eclipse里面死活敲代码,也许是自己阅历不够,不知道游戏引擎能给游戏开发带来如此大的便利,无论是3D游戏还是2D游戏都可以用Unity3D开发而且转成IPHONE游戏也很简单,因为Unity3D很多移动开发功能IPHONE与Android是共用的,其中最主要的控制器就是一样的,这样我们就基本上告别Eclipse了。。。
由于Unity3D里面的脚本是用C#或者Java Script写的,学习过这两个语言最好,不会也没关系,还可以学嘛(和羽化一样),其实C#和JS与Java类似,看起来不会那么陌生,要注意的是JS中无论什么变量声明都是”var”表示,这点对于声明经常出错的羽化来说很好-0-
2. Unity3D环境搭建与Android软件生成方法
这里给大家介绍两个网站,在里面可以下载到最新的UnitySetup-3.3.0包括破解补丁U3v3.3.0f4_Win和脚本编辑器UnityScriptEditor2.55,还有很多学习资料,包括羽化正在学的Unity视频教程(全英文啊=。=),还有全中文帮助文档,虽然现在资料很少,但可以看出Unity3D越来越给力中。。。
安装过程就不详细写了,很简单的。这里要注意的是,安装的系统用户名不要是中文的,要不打开Unity3D以后Scene里面看不到东西,这是羽化的切生体验- -。
1)第一次打开Unity3D后会出现创建Project的界面,这就和Eclipse创建项目一样的道理,这时候可以添加一些插件包,这步操作羽化留在了软件打开后。
2)新建以后就出现了开发界面,这里简单介绍下:
Scene 开发视图:里面可以拖拽物体位置、改变大小、旋转角度等,是开发中最常的地方。
Game
游戏视图:点上面的运行以后游戏就会在Game视图里面运行,没点的时候可以看到摄像机当前的图像。
Hierarchy 层试图:放置游戏物件,在游戏运行时可以观察游戏物件变化
Project 工程视图:里面可以新建文件夹管理脚本,渲染,图片等。
Inspector 检查视图:显示物件属性等
最下面一条,一般情况下不会显示东西,如果出错或者打印语句都是显示在下面:
先不管那么多,生成个Android软件再说。
3)在Project里面右击 ——〉 Import Package ——〉 Standard Assets(Mobile)这是移动开发的包,全部Import导入吧。再在Project里面选中导入的Standard Assets(Mobile)———〉Control Setups——〉CameraRelativeSetup,这会提示保存Scene,我们就保存一个,可以看到Project里面多了一个我们保存的Scene,游戏运行就是从Scene开始,这时应该可以看到这个包的显示了。一眼就看出这是一个演示控制器的包,这个时候我们就不管这个工作原理,先放在Android手机里面看看效果。
4)点击左上角的File菜单——〉Build Settings——〉选中Android——〉右边Development Build勾打上——〉点击下面Player Settings,这时在Insperctor视图里面可以看到一些基本设定,第一个Resolution and Presentation是游戏视图设定,横屏还是竖屏随你可以默认它,点击Other Settings,这里主要设置Identification这个属性,里面第一个相当于项目包,这个一定不能默认,自己随便写个名字比如羽化就是com.LB.first其他设定大家可以自己研究,对于生成这个软件,这步必须改。
5)然后回到窗口点击Build,这里第一次点会跳出一个选中Android SDK的路径,大家都懂的,自己放哪的选哪,确定后,输入一个apk的名字,就叫作LB,如果发生什么错误,可以看看下面的提示。
6)软件已经生成好了后就可以丢到手机里面安装试试了,你可以直接丢在SD卡里面安装,这里羽化给大家介绍个简单的方法,对于模拟器还是真机都适用,首先设置环境变量,在Path里面添加如羽化自己目录的D:android-sdk-windowsplatform-tools,这样就可以在命令控制台里面打命令了,比如羽化安装的命令是cd C:UsersLiBeiDocumentsLB先到apk目录下,再输入adb install LB.apk这里要注意若你原来安装过相同名字软件,先卸载了再装。
7)实际运行效果左摇杆是控制位移,右摇杆是控制方向:
步骤看起很多,其实很简单。
3.Unity3D基本使用方法
这里羽化推荐大家看看视频,看视频学起来得很快,羽化就讲讲自己照视频做的例子,解压后可以通过Open Project选项打开这个例子,选中Scene里面的Scene1打开,运行是在电脑上。
1)场景创建
全是Cube搭建的,看一眼就知道了,Cube可以在上方Gameobject——〉create other里面创建,也点击Hierarchy层视图下面的Create创建,位置调整可以在Scene里面通过左上角的物件选项慢慢调整,第一个是观察,第二个是调整位置,第三个是调整角度,第四个调整大小。
2)主视角
这里主视角是用Standard Assets(这要自己导入)——〉Character Controllers——〉First Person Controller 可以看到这里能直接用的物件其实都是Prefab预设。这里可以看天空,其实是运用了Skybox组件,选中Main Camera可以在菜单中Component——〉Rendering——〉Skybox。
3)光
若无光运行的时候漆黑一片,这里放了个Point Light点光,数值可自行调整,添加和Cube一样。
4)脚本
脚本放在Scripts文件夹下,里面Door是控制门开关,Shoot是鼠标点击事件,Respawn是坠落返原地。注意这里脚本写好以后要拖到对应物体上才能运行。
5)动画
开门其实是个动画,创建在Component——〉Miscellaneous ——〉Animation
6)火焰
火焰是粒子产生的,粒子创建和Cube类似,Particle System里面的数值要做相应调整就会有火焰效果了。
再介绍几个Component里面重要的组件
1)Rigidbody 刚体
刚体顾名思义,有重量,带碰撞都是刚体的属性,若你为一个物件添加这个组件,证明你需要前面这几个属性。
2)Character 人物
其实里面放的都是控制视角或者是主角操作的脚本。
3)Trail Renderer 路径渲染器
很有用的组件,可以看到自己走过的路径,论坛上有个切水果刀光的例子就是用到它。
为您推荐:
其他类似问题
您可能关注的内容
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。&>&unity ar 相机自动对焦
unity ar 相机自动对焦
上传大小:831B
相机自动对焦。。可以快速找到识别图。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
综合评分:0
{%username%}回复{%com_username%}{%time%}\
/*点击出现回复框*/
$(".respond_btn").on("click", function (e) {
$(this).parents(".rightLi").children(".respond_box").show();
e.stopPropagation();
$(".cancel_res").on("click", function (e) {
$(this).parents(".res_b").siblings(".res_area").val("");
$(this).parents(".respond_box").hide();
e.stopPropagation();
/*删除评论*/
$(".del_comment_c").on("click", function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_invalid/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parents(".conLi").remove();
alert(data.msg);
$(".res_btn").click(function (e) {
var parentWrap = $(this).parents(".respond_box"),
q = parentWrap.find(".form1").serializeArray(),
resStr = $.trim(parentWrap.find(".res_area_r").val());
console.log(q);
//var res_area_r = $.trim($(".res_area_r").val());
if (resStr == '') {
$(".res_text").css({color: "red"});
$.post("/index.php/comment/do_comment_reply/", q,
function (data) {
if (data.succ == 1) {
var $target,
evt = e || window.
$target = $(evt.target || evt.srcElement);
var $dd = $target.parents('dd');
var $wrapReply = $dd.find('.respond_box');
console.log($wrapReply);
//var mess = $(".res_area_r").val();
var mess = resS
var str = str.replace(/{%header%}/g, data.header)
.replace(/{%href%}/g, 'http://' + window.location.host + '/user/' + data.username)
.replace(/{%username%}/g, data.username)
.replace(/{%com_username%}/g, data.com_username)
.replace(/{%time%}/g, data.time)
.replace(/{%id%}/g, data.id)
.replace(/{%mess%}/g, mess);
$dd.after(str);
$(".respond_box").hide();
$(".res_area_r").val("");
$(".res_area").val("");
$wrapReply.hide();
alert(data.msg);
}, "json");
/*删除回复*/
$(".rightLi").on("click", '.del_comment_r', function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_comment_del/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parent().parent().parent().parent().parent().remove();
$(e.target).parents('.res_list').remove()
alert(data.msg);
//填充回复
function KeyP(v) {
var parentWrap = $(v).parents(".respond_box");
parentWrap.find(".res_area_r").val($.trim(parentWrap.find(".res_area").val()));
评论共有0条
VIP会员动态
CSDN下载频道资源及相关规则调整公告V11.10
下载频道用户反馈专区
下载频道积分规则调整V1710.18
spring mvc+mybatis+mysql+maven+bootstrap 整合实现增删查改简单实例.zip
资源所需积分/C币
当前拥有积分
当前拥有C币
输入下载码
为了良好体验,不建议使用迅雷下载
unity ar 相机自动对焦
会员到期时间:
剩余下载个数:
剩余积分:0
为了良好体验,不建议使用迅雷下载
积分不足!
资源所需积分/C币
当前拥有积分
您可以选择
程序员的必选
绿色安全资源
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
您的积分不足,将扣除 10 C币
为了良好体验,不建议使用迅雷下载
无法举报自己的资源
你当前的下载分为234。
你还不是VIP会员
开通VIP会员权限,免积分下载
你下载资源过于频繁,请输入验证码
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
若举报审核通过,可返还被扣除的积分
被举报人:
请选择类型
资源无法下载 ( 404页面、下载失败、资源本身问题)
资源无法使用 (文件损坏、内容缺失、题文不符)
侵犯版权资源 (侵犯公司或个人版权)
虚假资源 (恶意欺诈、刷分资源)
含色情、危害国家安全内容
含广告、木马病毒资源
*投诉人姓名:
*投诉人联系方式:
*版权证明:
*详细原因:
unity ar 相机自动对焦知道自己想做什么的人,比什么都想做的人更容易成功!
Android相机实时自动对焦的完美实现(带源码)
Android相机实时自动对焦的完美实现
想写这篇文章很久了,去年十月份接触了相机这一块的知识,由于android碎片化严重,而且各大厂商极有可能去修改相关API的实现,其中遇到了不少坑,包括实时相机高斯模糊,自动对焦的兼容问题,以及一系列性能问题。换过很多搜索引擎,访问过很多网站,访问过很多网站,拜读过很多代码,没有发现对于相机实时自动对焦特别完美的实现方式。现对相机的自动对焦问题单独做一个记录,算是对这部分的一个总结。也希望后人在这部分能够快速地解决问题,不必浪费过多的时间。测试手机包括:MX4 pro,小米4,华为荣耀3C等等。
参考过@yanzi1225627 大神的一些做法,测试结果不是特别满意。
一,一些对焦方案的尝试
1,autoFocus()的尝试:
&code class="language-java hljs
has-numbering" style="display: padding: 0 color: box-sizing: border- font-family: 'Source Code Pro',font-size: white-space: border-top-left-radius: 0 border-top-right-radius: 0 border-bottom-right-radius: 0 border-bottom-left-radius: 0 word-wrap: background:"&
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&private&/span& Camera.AutoFocusCallback mAutoFocusC
mAutoFocusCallback = &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&new&/span& Camera.AutoFocusCallback() {
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&public&/span& &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&void&/span& &span class="hljs-title" style="box-sizing: border-"&onAutoFocus&/span&(&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&boolean&/span& success, Camera camera) {
&span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-"&// TODO Auto-generated method stub&/span&
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&if&/span&(success){
myCamera.setOneShotPreviewCallback(&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&null&/span&);
Toast.makeText(TestPhotoActivity.&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&this&/span&,
&span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-"&"自动聚焦成功"&/span& , Toast.LENGTH_SHORT).show();
myCamera.autoFocus(mAutoFocusCallback);
&/code&&ul class="pre-numbering" style="box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);"&&li style="box-sizing: border- padding: 0px 5"&1&/li&&li style="box-sizing: border- padding: 0px 5"&2&/li&&li style="box-sizing: border- padding: 0px 5"&3&/li&&li style="box-sizing: border- padding: 0px 5"&4&/li&&li style="box-sizing: border- padding: 0px 5"&5&/li&&li style="box-sizing: border- padding: 0px 5"&6&/li&&li style="box-sizing: border- padding: 0px 5"&7&/li&&li style="box-sizing: border- padding: 0px 5"&8&/li&&li style="box-sizing: border- padding: 0px 5"&9&/li&&li style="box-sizing: border- padding: 0px 5"&10&/li&&li style="box-sizing: border- padding: 0px 5"&11&/li&&li style="box-sizing: border- padding: 0px 5"&12&/li&&li style="box-sizing: border- padding: 0px 5"&13&/li&&li style="box-sizing: border- padding: 0px 5"&14&/li&&li style="box-sizing: border- padding: 0px 5"&15&/li&&/ul&
在一部分手机上,始终只对焦一次,也就是说根本不能实现。即使是在按下拍照的时候去调用一次对焦,等对焦成功后再进行拍照,实现的效果也不是很完美。
还见部分博客把autoFocus()方法放在Camera预览SurfaceView的surfaceChanged()中的一些实现,发现也只对焦了一次。
2,设置对焦模式FOCUS_MODE_CONTINUOUS_PICTURE
&code class="hljs applescript has-numbering" style="display: padding: 0 color: box-sizing: border- font-family: 'Source Code Pro',font-size: white-space: border-top-left-radius: 0 border-top-right-radius: 0 border-bottom-right-radius: 0 border-bottom-left-radius: 0 word-wrap: background:"&
* Continuous auto focus mode intended &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&for&/span& taking pictures. The camera
* continuously tries &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&to&/span& focus. The speed &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&of&/span& focus change &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&is&/span& more
* aggressive than {@link &span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-"&#FOCUS_MODE_CONTINUOUS_VIDEO}. Auto focus&/span&
* starts when &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&the&/span& parameter &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&is&/span& &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&set&/span&.
* &p&Applications can call {@link &span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-"&#autoFocus(AutoFocusCallback)} in&/span&
* this mode. If &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&the&/span& autofocus &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&is&/span& &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&in&/span& &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&the&/span& &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&middle&/span& &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&of&/span& scanning, &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&the&/span& focus
* callback will &span class="hljs-constant" style="box-sizing: border-"&return&/span& when &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&it&/span& completes. If &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&the&/span& autofocus &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&is&/span& &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&not&/span&
* scanning, &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&the&/span& focus callback will immediately &span class="hljs-constant" style="box-sizing: border-"&return&/span& &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&with&/span& a &span class="hljs-type" style="box-sizing: border-"&boolean&/span&
* &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&that&/span& indicates whether &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&the&/span& focus &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&is&/span& sharp &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&or&/span& &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&not&/span&. The apps can &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&then&/span&
* decide &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&if&/span& they want &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&to&/span& take a picture immediately &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&or&/span& &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&to&/span& change &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&the&/span&
* focus mode &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&to&/span& auto, &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&and&/span& &span class="hljs-command" style="box-sizing: border-"&run&/span& a full autofocus cycle. The focus
* position &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&is&/span& locked &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&after&/span& autoFocus call. If applications want &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&to&/span&
* resume &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&the&/span& continuous focus, cancelAutoFocus must be called.
* Restarting &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&the&/span& preview will &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&not&/span& resume &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&the&/span& continuous autofocus. To
* stop continuous focus, applications should change &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&the&/span& focus mode &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&to&/span&
* other modes.
* @see &span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-"&#FOCUS_MODE_CONTINUOUS_VIDEO&/span&
public static final String FOCUS_MODE_CONTINUOUS_PICTURE = &span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-"&"continuous-picture"&/span&;
&/code&&ul class="pre-numbering" style="box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);"&&li style="box-sizing: border- padding: 0px 5"&1&/li&&li style="box-sizing: border- padding: 0px 5"&2&/li&&li style="box-sizing: border- padding: 0px 5"&3&/li&&li style="box-sizing: border- padding: 0px 5"&4&/li&&li style="box-sizing: border- padding: 0px 5"&5&/li&&li style="box-sizing: border- padding: 0px 5"&6&/li&&li style="box-sizing: border- padding: 0px 5"&7&/li&&li style="box-sizing: border- padding: 0px 5"&8&/li&&li style="box-sizing: border- padding: 0px 5"&9&/li&&li style="box-sizing: border- padding: 0px 5"&10&/li&&li style="box-sizing: border- padding: 0px 5"&11&/li&&li style="box-sizing: border- padding: 0px 5"&12&/li&&li style="box-sizing: border- padding: 0px 5"&13&/li&&li style="box-sizing: border- padding: 0px 5"&14&/li&&li style="box-sizing: border- padding: 0px 5"&15&/li&&li style="box-sizing: border- padding: 0px 5"&16&/li&&li style="box-sizing: border- padding: 0px 5"&17&/li&&li style="box-sizing: border- padding: 0px 5"&18&/li&&li style="box-sizing: border- padding: 0px 5"&19&/li&&li style="box-sizing: border- padding: 0px 5"&20&/li&&li style="box-sizing: border- padding: 0px 5"&21&/li&&li style="box-sizing: border- padding: 0px 5"&22&/li&&li style="box-sizing: border- padding: 0px 5"&23&/li&&/ul&&code class="hljs avrasm has-numbering" style="display: padding: 0 color: box-sizing: border- font-family: 'Source Code Pro',font-size: white-space: border-top-left-radius: 0 border-top-right-radius: 0 border-bottom-right-radius: 0 border-bottom-left-radius: 0 word-wrap: background:"&
setFocusMode(Camera&span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-"&.Parameters&/span&&span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-"&.FOCUS&/span&_MODE_CONTINUOUS_PICTURE)&span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-"&;&/span&&/code&&ul class="pre-numbering" style="box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);"&&li style="box-sizing: border- padding: 0px 5"&1&/li&&/ul&
在大部分手机上实现了自动对焦,而且效果还不错,而且不需要去额外调用方法。但是测试后发现小米4机型不会自动对焦。
3,设置对焦模式为FOCUS_MODE_CONTINUOUS_VIDEO
&code class="hljs applescript has-numbering" style="display: padding: 0 color: box-sizing: border- font-family: 'Source Code Pro',font-size: white-space: border-top-left-radius: 0 border-top-right-radius: 0 border-bottom-right-radius: 0 border-bottom-left-radius: 0 word-wrap: background:"&
* Continuous auto focus mode intended &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&for&/span& video recording. The camera
* continuously tries &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&to&/span& focus. This &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&is&/span& &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&the&/span& best choice &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&for&/span& video
* recording because &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&the&/span& focus changes smoothly . Applications still can
* call {@link &span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-"&#takePicture(Camera.ShutterCallback,&/span&
* Camera.PictureCallback, Camera.PictureCallback)} &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&in&/span& this mode &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&but&/span& &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&the&/span&
* subject may &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&not&/span& be &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&in&/span& focus. Auto focus starts when &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&the&/span& parameter &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&is&/span&
* &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&set&/span&.
* &p&Since API level &span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-"&14&/span&, applications can call {@link
* &span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-"&#autoFocus(AutoFocusCallback)} in this mode. The focus callback will&/span&
* immediately &span class="hljs-constant" style="box-sizing: border-"&return&/span& &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&with&/span& a &span class="hljs-type" style="box-sizing: border-"&boolean&/span& &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&that&/span& indicates whether &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&the&/span& focus &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&is&/span&
* sharp &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&or&/span& &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&not&/span&. The focus position &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&is&/span& locked &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&after&/span& autoFocus call. If
* applications want &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&to&/span& resume &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&the&/span& continuous focus, cancelAutoFocus
* must be called. Restarting &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&the&/span& preview will &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&not&/span& resume &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&the&/span& continuous
* autofocus. To stop continuous focus, applications should change &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&the&/span&
* focus mode &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&to&/span& other modes.
* @see &span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-"&#FOCUS_MODE_CONTINUOUS_PICTURE&/span&
public static final String FOCUS_MODE_CONTINUOUS_VIDEO = &span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-"&"continuous-video"&/span&;&/code&&ul class="pre-numbering" style="box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);"&&li style="box-sizing: border- padding: 0px 5"&1&/li&&li style="box-sizing: border- padding: 0px 5"&2&/li&&li style="box-sizing: border- padding: 0px 5"&3&/li&&li style="box-sizing: border- padding: 0px 5"&4&/li&&li style="box-sizing: border- padding: 0px 5"&5&/li&&li style="box-sizing: border- padding: 0px 5"&6&/li&&li style="box-sizing: border- padding: 0px 5"&7&/li&&li style="box-sizing: border- padding: 0px 5"&8&/li&&li style="box-sizing: border- padding: 0px 5"&9&/li&&li style="box-sizing: border- padding: 0px 5"&10&/li&&li style="box-sizing: border- padding: 0px 5"&11&/li&&li style="box-sizing: border- padding: 0px 5"&12&/li&&li style="box-sizing: border- padding: 0px 5"&13&/li&&li style="box-sizing: border- padding: 0px 5"&14&/li&&li style="box-sizing: border- padding: 0px 5"&15&/li&&li style="box-sizing: border- padding: 0px 5"&16&/li&&li style="box-sizing: border- padding: 0px 5"&17&/li&&li style="box-sizing: border- padding: 0px 5"&18&/li&&li style="box-sizing: border- padding: 0px 5"&19&/li&&li style="box-sizing: border- padding: 0px 5"&20&/li&&li style="box-sizing: border- padding: 0px 5"&21&/li&&/ul&&code class="hljs avrasm has-numbering" style="display: padding: 0 color: box-sizing: border- font-family: 'Source Code Pro',font-size: white-space: border-top-left-radius: 0 border-top-right-radius: 0 border-bottom-right-radius: 0 border-bottom-left-radius: 0 word-wrap: background:"&
setFocusMode(Camera&span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-"&.Parameters&/span&&span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-"&.FOCUS&/span&_MODE_CONTINUOUS_VIDEO)&span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-"&;&/span&&/code&&ul class="pre-numbering" style="box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);"&&li style="box-sizing: border- padding: 0px 5"&1&/li&&/ul&
经过测试,发现大部分手机可以连续对焦,但是在对焦过程中屏幕会连续闪烁,而且体验极其不好。魅族MX4不支持此种方式的对焦。也就是说第二,第三种方案都要放弃。
4,触摸对焦
本来在一番焦头烂额后准备妥协,先把触摸对焦实现吧。基本思路是支持定点对焦,就调用定点对焦,否则调用autoFocus()。
&code class="hljs java has-numbering" style="display: padding: 0 color: box-sizing: border- font-family: 'Source Code Pro',font-size: white-space: border-top-left-radius: 0 border-top-right-radius: 0 border-bottom-right-radius: 0 border-bottom-left-radius: 0 word-wrap: background:"&
&span class="hljs-javadoc" style="color: rgb(136, 0, 0); box-sizing: border-"&/**
* 手动聚焦
*&span class="hljs-javadoctag" style="color: rgb(102, 0, 102); box-sizing: border-"& @param&/span& point 触屏坐标
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&protected&/span& &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&boolean&/span& &span class="hljs-title" style="box-sizing: border-"&onFocus&/span&(Point point, Camera.AutoFocusCallback callback) {
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&if&/span& (mCamera == &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&null&/span&) {
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&return&/span& &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&false&/span&;
Camera.Parameters parameters = &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&null&/span&;
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&try&/span& {
parameters = mCamera.getParameters();
} &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&catch&/span& (Exception e) {
e.printStackTrace();
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&return&/span& &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&false&/span&;
&span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-"&//不支持设置自定义聚焦,则使用自动聚焦,返回&/span&
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&if&/span&(Build.VERSION.SDK_INT &= &span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-"&14&/span&) {
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&if&/span& (parameters.getMaxNumFocusAreas() &= &span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-"&0&/span&) {
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&return&/span& focus(callback);
Log.i(TAG, &span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-"&"onCameraFocus:"&/span& + point.x + &span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-"&","&/span& + point.y);
&span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-"&//定点对焦&/span&
List&Camera.Area& areas = &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&new&/span& ArrayList&Camera.Area&();
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&int&/span& left = point.x - &span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-"&300&/span&;
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&int&/span& top = point.y - &span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-"&300&/span&;
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&int&/span& right = point.x + &span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-"&300&/span&;
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&int&/span& bottom = point.y + &span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-"&300&/span&;
left = left & -&span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-"&1000&/span& ? -&span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-"&1000&/span& :
top = top & -&span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-"&1000&/span& ? -&span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-"&1000&/span& :
right = right & &span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-"&1000&/span& ? &span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-"&1000&/span& :
bottom = bottom & &span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-"&1000&/span& ? &span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-"&1000&/span& :
areas.add(&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&new&/span& Camera.Area(&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&new&/span& Rect(left, top, right, bottom), &span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-"&100&/span&));
parameters.setFocusAreas(areas);
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&try&/span& {
&span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-"&//本人使用的小米手机在设置聚焦区域的时候经常会出异常,看日志发现是框架层的字符串转int的时候出错了,&/span&
&span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-"&//目测是小米修改了框架层代码导致,在此try掉,对实际聚焦效果没影响&/span&
mCamera.setParameters(parameters);
} &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&catch&/span& (Exception e) {
&span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-"&// TODO: handle exception&/span&
e.printStackTrace();
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&return&/span& &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&false&/span&;
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&return&/span& focus(callback);
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&private&/span& &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&boolean&/span& &span class="hljs-title" style="box-sizing: border-"&focus&/span&(Camera.AutoFocusCallback callback) {
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&try&/span& {
mCamera.autoFocus(callback);
} &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&catch&/span& (Exception e) {
e.printStackTrace();
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&return&/span& &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&false&/span&;
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&return&/span& &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&true&/span&;
}&/code&&ul class="pre-numbering" style="box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);"&&li style="box-sizing: border- padding: 0px 5"&1&/li&&li style="box-sizing: border- padding: 0px 5"&2&/li&&li style="box-sizing: border- padding: 0px 5"&3&/li&&li style="box-sizing: border- padding: 0px 5"&4&/li&&li style="box-sizing: border- padding: 0px 5"&5&/li&&li style="box-sizing: border- padding: 0px 5"&6&/li&&li style="box-sizing: border- padding: 0px 5"&7&/li&&li style="box-sizing: border- padding: 0px 5"&8&/li&&li style="box-sizing: border- padding: 0px 5"&9&/li&&li style="box-sizing: border- padding: 0px 5"&10&/li&&li style="box-sizing: border- padding: 0px 5"&11&/li&&li style="box-sizing: border- padding: 0px 5"&12&/li&&li style="box-sizing: border- padding: 0px 5"&13&/li&&li style="box-sizing: border- padding: 0px 5"&14&/li&&li style="box-sizing: border- padding: 0px 5"&15&/li&&li style="box-sizing: border- padding: 0px 5"&16&/li&&li style="box-sizing: border- padding: 0px 5"&17&/li&&li style="box-sizing: border- padding: 0px 5"&18&/li&&li style="box-sizing: border- padding: 0px 5"&19&/li&&li style="box-sizing: border- padding: 0px 5"&20&/li&&li style="box-sizing: border- padding: 0px 5"&21&/li&&li style="box-sizing: border- padding: 0px 5"&22&/li&&li style="box-sizing: border- padding: 0px 5"&23&/li&&li style="box-sizing: border- padding: 0px 5"&24&/li&&li style="box-sizing: border- padding: 0px 5"&25&/li&&li style="box-sizing: border- padding: 0px 5"&26&/li&&li style="box-sizing: border- padding: 0px 5"&27&/li&&li style="box-sizing: border- padding: 0px 5"&28&/li&&li style="box-sizing: border- padding: 0px 5"&29&/li&&li style="box-sizing: border- padding: 0px 5"&30&/li&&li style="box-sizing: border- padding: 0px 5"&31&/li&&li style="box-sizing: border- padding: 0px 5"&32&/li&&li style="box-sizing: border- padding: 0px 5"&33&/li&&li style="box-sizing: border- padding: 0px 5"&34&/li&&li style="box-sizing: border- padding: 0px 5"&35&/li&&li style="box-sizing: border- padding: 0px 5"&36&/li&&li style="box-sizing: border- padding: 0px 5"&37&/li&&li style="box-sizing: border- padding: 0px 5"&38&/li&&li style="box-sizing: border- padding: 0px 5"&39&/li&&li style="box-sizing: border- padding: 0px 5"&40&/li&&li style="box-sizing: border- padding: 0px 5"&41&/li&&li style="box-sizing: border- padding: 0px 5"&42&/li&&li style="box-sizing: border- padding: 0px 5"&43&/li&&li style="box-sizing: border- padding: 0px 5"&44&/li&&li style="box-sizing: border- padding: 0px 5"&45&/li&&li style="box-sizing: border- padding: 0px 5"&46&/li&&li style="box-sizing: border- padding: 0px 5"&47&/li&&li style="box-sizing: border- padding: 0px 5"&48&/li&&li style="box-sizing: border- padding: 0px 5"&49&/li&&li style="box-sizing: border- padding: 0px 5"&50&/li&&li style="box-sizing: border- padding: 0px 5"&51&/li&&li style="box-sizing: border- padding: 0px 5"&52&/li&&li style="box-sizing: border- padding: 0px 5"&53&/li&&li style="box-sizing: border- padding: 0px 5"&54&/li&&li style="box-sizing: border- padding: 0px 5"&55&/li&&li style="box-sizing: border- padding: 0px 5"&56&/li&&li style="box-sizing: border- padding: 0px 5"&57&/li&&li style="box-sizing: border- padding: 0px 5"&58&/li&&li style="box-sizing: border- padding: 0px 5"&59&/li&&li style="box-sizing: border- padding: 0px 5"&60&/li&&li style="box-sizing: border- padding: 0px 5"&61&/li&&li style="box-sizing: border- padding: 0px 5"&62&/li&&li style="box-sizing: border- padding: 0px 5"&63&/li&&/ul&
二,自动对焦方案
在实现无力的情况下,打开了其他已经实现自定义相机而且能够完美对焦的app,一番操作后,发现很多app都是在我移动手机或者有轻微晃动才进行了第二次对焦,等等,这不就是基于传感器实现的吗?
我们完全可以判断手机的运动状态啊,比如静止和移动。在移动一定时间后去对焦。
核心代码:
&code class="hljs java has-numbering" style="display: padding: 0 color: box-sizing: border- font-family: 'Source Code Pro',font-size: white-space: border-top-left-radius: 0 border-top-right-radius: 0 border-bottom-right-radius: 0 border-bottom-left-radius: 0 word-wrap: background:"&&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&package&/span& com.jerry.
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&import&/span& android.app.A
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&import&/span& android.hardware.S
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&import&/span& android.hardware.SensorE
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&import&/span& android.hardware.SensorEventL
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&import&/span& android.hardware.SensorM
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&import&/span& android.util.L
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&import&/span& java.util.C
&span class="hljs-javadoc" style="color: rgb(136, 0, 0); box-sizing: border-"&/**
* 加速度控制器
用来控制对焦
*&span class="hljs-javadoctag" style="color: rgb(102, 0, 102); box-sizing: border-"& @author&/span& jerry
*&span class="hljs-javadoctag" style="color: rgb(102, 0, 102); box-sizing: border-"& @date&/span&
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&public&/span& &span class="hljs-class" style="box-sizing: border-"&&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&class&/span& &span class="hljs-title" style="box-sizing: border- color: rgb(102, 0, 102);"&SensorControler&/span& &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&implements&/span& &span class="hljs-title" style="box-sizing: border- color: rgb(102, 0, 102);"&IActivityLifiCycle&/span&, &span class="hljs-title" style="box-sizing: border- color: rgb(102, 0, 102);"&SensorEventListener&/span& {&/span&
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&public&/span& &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&static&/span& &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&final&/span& String TAG = &span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-"&"SensorControler"&/span&;
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&private&/span& SensorManager mSensorM
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&private&/span& Sensor mS
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&private&/span& &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&int&/span& mX, mY, mZ;
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&private&/span& &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&long&/span& lastStaticStamp = &span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-"&0&/span&;
Calendar mC
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&boolean&/span& isFocusing = &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&false&/span&;
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&boolean&/span& canFocusIn = &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&false&/span&;
&span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-"&//内部是否能够对焦控制机制&/span&
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&boolean&/span& canFocus = &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&false&/span&;
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&public&/span& &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&static&/span& &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&final&/span& &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&int&/span& DELEY_DURATION = &span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-"&500&/span&;
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&public&/span& &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&static&/span& &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&final&/span& &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&int&/span& STATUS_NONE = &span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-"&0&/span&;
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&public&/span& &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&static&/span& &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&final&/span& &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&int&/span& STATUS_STATIC = &span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-"&1&/span&;
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&public&/span& &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&static&/span& &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&final&/span& &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&int&/span& STATUS_MOVE = &span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-"&2&/span&;
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&private&/span& &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&int&/span& STATUE = STATUS_NONE;
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&private&/span& CameraFocusListener mCameraFocusL
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&private&/span& &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&static&/span& SensorControler mI
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&private&/span& &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&int&/span& foucsing = &span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-"&1&/span&;
&span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-"&//1 表示没有被锁定 0表示被锁定&/span&
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&private&/span& &span class="hljs-title" style="box-sizing: border-"&SensorControler&/span&() {
mSensorManager = (SensorManager) SweetApplication.CONTEXT.getSystemService(Activity.SENSOR_SERVICE);
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);&span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-"&// TYPE_GRAVITY&/span&
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&public&/span& &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&static&/span& SensorControler &span class="hljs-title" style="box-sizing: border-"&getInstance&/span&() {
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&if&/span& (mInstance == &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&null&/span&) {
mInstance = &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&new&/span& SensorControler();
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&return&/span& mI
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&public&/span& &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&void&/span& &span class="hljs-title" style="box-sizing: border-"&setCameraFocusListener&/span&(CameraFocusListener mCameraFocusListener) {
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&this&/span&.mCameraFocusListener = mCameraFocusL
&span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-"&@Override&/span&
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&public&/span& &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&void&/span& &span class="hljs-title" style="box-sizing: border-"&onStart&/span&() {
restParams();
canFocus = &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&true&/span&;
mSensorManager.registerListener(&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&this&/span&, mSensor,
SensorManager.SENSOR_DELAY_NORMAL);
&span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-"&@Override&/span&
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&public&/span& &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&void&/span& &span class="hljs-title" style="box-sizing: border-"&onStop&/span&() {
mSensorManager.unregisterListener(&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&this&/span&, mSensor);
canFocus = &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&false&/span&;
&span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-"&@Override&/span&
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&public&/span& &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&void&/span& &span class="hljs-title" style="box-sizing: border-"&onAccuracyChanged&/span&(Sensor sensor, &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&int&/span& accuracy) {
&span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-"&@Override&/span&
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&public&/span& &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&void&/span& &span class="hljs-title" style="box-sizing: border-"&onSensorChanged&/span&(SensorEvent event) {
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&if&/span& (event.sensor == &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&null&/span&) {
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&return&/span&;
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&if&/span& (isFocusing) {
restParams();
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&return&/span&;
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&if&/span& (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&int&/span& x = (&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&int&/span&) event.values[&span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-"&0&/span&];
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&int&/span& y = (&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&int&/span&) event.values[&span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-"&1&/span&];
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&int&/span& z = (&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&int&/span&) event.values[&span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-"&2&/span&];
mCalendar = Calendar.getInstance();
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&long&/span& stamp = mCalendar.getTimeInMillis();&span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-"&// &/span&
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&int&/span& second = mCalendar.get(Calendar.SECOND);&span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-"&// 53&/span&
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&if&/span& (STATUE != STATUS_NONE) {
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&int&/span& px = Math.abs(mX - x);
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&int&/span& py = Math.abs(mY - y);
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&int&/span& pz = Math.abs(mZ - z);
&span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-"&//
Log.d(TAG, "pX:" + px + "
pY:" + py + "
pZ:" + pz + "
stamp:"&/span&
&span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-"&//
+ stamp + "
second:" + second);&/span&
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&double&/span& value = Math.sqrt(px * px + py * py + pz * pz);
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&if&/span& (value & &span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-"&1.4&/span&) {
&span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-"&//
textviewF.setText("检测手机在移动..");&/span&
&span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-"&//
Log.i(TAG,"mobile moving");&/span&
STATUE = STATUS_MOVE;
} &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&else&/span& {
&span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-"&//
textviewF.setText("检测手机静止..");&/span&
&span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-"&//
Log.i(TAG,"mobile static");&/span&
&span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-"&//上一次状态是move,记录静态时间点&/span&
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&if&/span& (STATUE == STATUS_MOVE) {
lastStaticStamp =
canFocusIn = &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&true&/span&;
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&if&/span& (canFocusIn) {
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&if&/span& (stamp - lastStaticStamp & DELEY_DURATION) {
&span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-"&//移动后静止一段时间,可以发生对焦行为&/span&
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&if&/span& (!isFocusing) {
canFocusIn = &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&false&/span&;
&span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-"&//
onCameraFocus();&/span&
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&if&/span& (mCameraFocusListener != &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&null&/span&) {
mCameraFocusListener.onFocus();
&span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-"&//
Log.i(TAG,"mobile focusing");&/span&
STATUE = STATUS_STATIC;
} &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&else&/span& {
lastStaticStamp =
STATUE = STATUS_STATIC;
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&private&/span& &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&void&/span& &span class="hljs-title" style="box-sizing: border-"&restParams&/span&() {
STATUE = STATUS_NONE;
canFocusIn = &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&false&/span&;
mX = &span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-"&0&/span&;
mY = &span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-"&0&/span&;
mZ = &span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-"&0&/span&;
&span class="hljs-javadoc" style="color: rgb(136, 0, 0); box-sizing: border-"&/**
* 对焦是否被锁定
*&span class="hljs-javadoctag" style="color: rgb(102, 0, 102); box-sizing: border-"& @return&/span&
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&public&/span& &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&boolean&/span& &span class="hljs-title" style="box-sizing: border-"&isFocusLocked&/span&() {
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&if&/span&(canFocus) {
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&return&/span& foucsing &= &span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-"&0&/span&;
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&return&/span& &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&false&/span&;
&span class="hljs-javadoc" style="color: rgb(136, 0, 0); box-sizing: border-"&/**
* 锁定对焦
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&public&/span& &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&void&/span& &span class="hljs-title" style="box-sizing: border-"&lockFocus&/span&() {
isFocusing = &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&true&/span&;
foucsing--;
Log.i(TAG, &span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-"&"lockFocus"&/span&);
&span class="hljs-javadoc" style="color: rgb(136, 0, 0); box-sizing: border-"&/**
* 解锁对焦
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&public&/span& &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&void&/span& &span class="hljs-title" style="box-sizing: border-"&unlockFocus&/span&() {
isFocusing = &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&false&/span&;
foucsing++;
Log.i(TAG, &span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-"&"unlockFocus"&/span&);
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&public&/span& &span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&void&/span& &span class="hljs-title" style="box-sizing: border-"&restFoucs&/span&() {
foucsing = &span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-"&1&/span&;
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&public&/span& &span class="hljs-class" style="box-sizing: border-"&&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&interface&/span& &span class="hljs-title" style="box-sizing: border- color: rgb(102, 0, 102);"&CameraFocusListener&/span& {&/span&
&span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-"&void&/span& onFocus();
&/code&&ul class="pre-numbering" style="box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);"&&li style="box-sizing: border- padding: 0px 5"&1&/li&&li style="box-sizing: border- padding: 0px 5"&2&/li&&li style="box-sizing: border- padding: 0px 5"&3&/li&&li style="box-sizing: border- padding: 0px 5"&4&/li&&li style="box-sizing: border- padding: 0px 5"&5&/li&&li style="box-sizing: border- padding: 0px 5"&6&/li&&li style="box-sizing: border- padding: 0px 5"&7&/li&&li style="box-sizing: border- padding: 0px 5"&8&/li&&li style="box-sizing: border- padding: 0px 5"&9&/li&&li style="box-sizing: border- padding: 0px 5"&10&/li&&li style="box-sizing: border- padding: 0px 5"&11&/li&&li style="box-sizing: border- padding: 0px 5"&12&/li&&li style="box-sizing: border- padding: 0px 5"&13&/li&&li style="box-sizing: border- padding: 0px 5"&14&/li&&li style="box-sizing: border- padding: 0px 5"&15&/li&&li style="box-sizing: border- padding: 0px 5"&16&/li&&li style="box-sizing: border- padding: 0px 5"&17&/li&&li style="box-sizing: border- padding: 0px 5"&18&/li&&li style="box-sizing: border- padding: 0px 5"&19&/li&&li style="box-sizing: border- padding: 0px 5"&20&/li&&li style="box-sizing: border- padding: 0px 5"&21&/li&&li style="box-sizing: border- padding: 0px 5"&22&/li&&li style="box-sizing: border- padding: 0px 5"&23&/li&&li style="box-sizing: border- padding: 0px 5"&24&/li&&li style="box-sizing: border- padding: 0px 5"&25&/li&&li style="box-sizing: border- padding: 0px 5"&26&/li&&li style="box-sizing: border- padding: 0px 5"&27&/li&&li style="box-sizing: border- padding: 0px 5"&28&/li&&li style="box-sizing: border- padding: 0px 5"&29&/li&&li style="box-sizing: border- padding: 0px 5"&30&/li&&li style="box-sizing: border- padding: 0px 5"&31&/li&&li style="box-sizing: border- padding: 0px 5"&32&/li&&li style="box-sizing: border- padding: 0px 5"&33&/li&&li style="box-sizing: border- padding: 0px 5"&34&/li&&li style="box-sizing: border- padding: 0px 5"&35&/li&&li style="box-sizing: border- padding: 0px 5"&36&/li&&li style="box-sizing: border- padding: 0px 5"&37&/li&&li style="box-sizing: border- padding: 0px 5"&38&/li&&li style="box-sizing: border- padding: 0px 5"&39&/li&&li style="box-sizing: border- padding: 0px 5"&40&/li&&li style="box-sizing: border- padding: 0px 5"&41&/li&&li style="box-sizing: border- padding: 0px 5"&42&/li&&li style="box-sizing: border- padding: 0px 5"&43&/li&&li style="box-sizing: border- padding: 0px 5"&44&/li&&li style="box-sizing: border- padding: 0px 5"&45&/li&&li style="box-sizing: border- padding: 0px 5"&46&/li&&li style="box-sizing: border- padding: 0px 5"&47&/li&&li style="box-sizing: border- padding: 0px 5"&48&/li&&li style="box-sizing: border- padding: 0px 5"&49&/li&&li style="box-sizing: border- padding: 0px 5"&50&/li&&li style="box-sizing: border- padding: 0px 5"&51&/li&&li style="box-sizing: border- padding: 0px 5"&52&/li&&li style="box-sizing: border- padding: 0px 5"&53&/li&&li style="box-sizing: border- padding: 0px 5"&54&/li&&li style="box-sizing: border- padding: 0px 5"&55&/li&&li style="box-sizing: border- padding: 0px 5"&56&/li&&li style="box-sizing: border- padding: 0px 5"&57&/li&&li style="box-sizing: border- padding: 0px 5"&58&/li&&li style="box-sizing: border- padding: 0px 5"&59&/li&&li style="box-sizing: border- padding: 0px 5"&60&/li&&li style="box-sizing: border- padding: 0px 5"&61&/li&&li style="box-sizing: border- padding: 0px 5"&62&/li&&li style="box-sizing: border- padding: 0px 5"&63&/li&&li style="box-sizing: border- padding: 0px 5"&64&/li&&li style="box-sizing: border- padding: 0px 5"&65&/li&&li style="box-sizing: border- padding: 0px 5"&66&/li&&li style="box-sizing: border- padding: 0px 5"&67&/li&&li style="box-sizing: border- padding: 0px 5"&68&/li&&li style="box-sizing: border- padding: 0px 5"&69&/li&&li style="box-sizing: border- padding: 0px 5"&70&/li&&li style="box-sizing: border- padding: 0px 5"&71&/li&&li style="box-sizing: border- padding: 0px 5"&72&/li&&li style="box-sizing: border- padding: 0px 5"&73&/li&&li style="box-sizing: border- padding: 0px 5"&74&/li&&li style="box-sizing: border- padding: 0px 5"&75&/li&&li style="box-sizing: border- padding: 0px 5"&76&/li&&li style="box-sizing: border- padding: 0px 5"&77&/li&&li style="box-sizing: border- padding: 0px 5"&78&/li&&li style="box-sizing: border- padding: 0px 5"&79&/li&&li style="box-sizing: border- padding: 0px 5"&80&/li&&li style="box-sizing: border- padding: 0px 5"&81&/li&&li style="box-sizing: border- padding: 0px 5"&82&/li&&li style="box-sizing: border- padding: 0px 5"&83&/li&&li style="box-sizing: border- padding: 0px 5"&84&/li&&li style="box-sizing: border- padding: 0px 5"&85&/li&&li style="box-sizing: border- padding: 0px 5"&86&/li&&li style="box-sizing: border- padding: 0px 5"&87&/li&&li style="box-sizing: border- padding: 0px 5"&88&/li&&li style="box-sizing: border- padding: 0px 5"&89&/li&&li style="box-sizing: border- padding: 0px 5"&90&/li&&li style="box-sizing: border- padding: 0px 5"&91&/li&&li style="box-sizing: border- padding: 0px 5"&92&/li&&li style="box-sizing: border- padding: 0px 5"&93&/li&&li style="box-sizing: border- padding: 0px 5"&94&/li&&li style="box-sizing: border- padding: 0px 5"&95&/li&&li style="box-sizing: border-

我要回帖

更多关于 苹果相机添加更多滤镜 的文章

 

随机推荐