Android中级第九讲--相机调焦

博客出自:http://blog.csdn.net/liuxian13183,转载注明出处!
All Rights Reserved !

相机调焦:原理,使用竖直seekbar,根据用户拖拉来获得距离,然后以Parameter的形式设置到Camera。

实现OnSeekBarChangeListener

/*

* (non-Javadoc)

*

* @see

* android.widget.SeekBar.OnSeekBarChangeListener#onProgressChanged(android

* .widget.SeekBar, int, boolean)

*/

@Override

public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) {

// TODO Auto-generated method stub

if (myCamera == null || arg2) {

arg0.setProgress(0);

return;

}

try {

Parameters p = myCamera.getParameters();

int maxPa = p.getMaxZoom();

int maxCa = arg0.getMax();

p.setZoom(maxPa * arg1 / maxCa);

myCamera.setParameters(p);

} catch (Exception e) {

// TODO: handle exception

arg0.setProgress(0);

}

}

而实现OnSeekBarChangeListener如下

public class CameraSeekBar extends SeekBar {

/**

*

*/

/**

* @param context

*/

public CameraSeekBar(Context context) {

super(context);

// TODO Auto-generated constructor stub

setThumb(getResources().getDrawable(R.drawable.camera_thumb));

setThumbOffset(6);

setProgressDrawable(getResources().getDrawable(R.drawable.color1));

setIndeterminateDrawable(getResources().getDrawable(R.drawable.color1));

}

public CameraSeekBar(Context context, AttributeSet attrs, int defStyle) {

super(context, attrs, defStyle);

}

protected void onSizeChanged(int w, int h, int oldw, int oldh) {

super.onSizeChanged(h, w, oldh, oldw);

}

@Override

protected synchronized void onMeasure(int widthMeasureSpec,

int heightMeasureSpec) {

super.onMeasure(heightMeasureSpec, widthMeasureSpec);

setMeasuredDimension(getMeasuredHeight(), getMeasuredWidth());

}

protected void onDraw(Canvas c) {

c.rotate(-90);

c.translate(-getHeight(), 0);

c.drawColor(0x00000000);

super.onDraw(c);

}

@Override

public boolean onTouchEvent(MotionEvent event) {

if (!isEnabled()) {

return false;

}

switch (event.getAction()) {

case MotionEvent.ACTION_DOWN:

// case MotionEvent.ACTION_MOVE:

case MotionEvent.ACTION_UP:

int i = 0;

i = getMax() - (int) (getMax() * event.getY() / getHeight());

setProgress(i);

onSizeChanged(getWidth(), getHeight(), 0, 0);

break;

case MotionEvent.ACTION_CANCEL:

break;

}

return true;

}

}

设置背景和thumb只能在构造方法里设置,其他地方设置无效,另外seekbar倒立主要采用Canvas的rotate方法;而滚动主要靠获得手触高度,来设置进度。camera_thumb是我找的一张小图片,而color1是一个像素的图片。

最后如何把这个控件添加到屏幕上,本例采用WindowManager操作

public void addSeekBar() {

// TODO Auto-generated method stub

if (cameraSeekBar != null) {

return;

}

wManager = (WindowManager) context

.getSystemService(Context.WINDOW_SERVICE);

cameraSeekBar = new CameraSeekBar(context);

cameraSeekBar.setBackgroundColor(0x00000000);

if (wmParams == null) {

initFloatView();

}

wManager.addView(cameraSeekBar, wmParams);

cameraSeekBar.setOnSeekBarChangeListener(this);

}

// 悬浮菜单

private WindowManager.LayoutParams wmParams = null;

private void initFloatView() {

// 设置LayoutParams(全局变量)相关参数

wmParams = new WindowManager.LayoutParams();

wmParams.type = LayoutParams.TYPE_PHONE; // 设置window type

wmParams.format = PixelFormat.RGBA_8888; // 设置图片格式,效果为背景透明

// 设置Window flag

wmParams.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL

| LayoutParams.FLAG_NOT_FOCUSABLE;

// 以屏幕左上角为原点,设置x、y初始值

wmParams.x = 100;

wmParams.y = 0;

// 设置悬浮窗口长宽数据

wmParams.width = CWWindowManager.getScreenWidth() / 20;

wmParams.height = CWWindowManager.getScreenHeight() - 170;

;

// 调整悬浮窗口

wmParams.gravity = Gravity.LEFT | Gravity.CENTER_VERTICAL;

}

这样就完成项目的初步要求。

另外如果需要tab间的切换,你可以使用发通知的方式来添加和清除SeekBar

public void removeSeekBar() {

// TODO Auto-generated method stub

if (cameraSeekBar == null) {

return;

}

wManager.removeView(cameraSeekBar);

cameraSeekBar = null;

}

Android中级第九讲--相机调焦

时间: 2024-08-11 01:35:55

Android中级第九讲--相机调焦的相关文章

Android增高第九篇之GridView和SQLite实现分页表格

Android提高第九篇之GridView和SQLite实现分页表格http://blog.csdn.net/hellogv/archive/2010/11/18/6019301.aspx上次讲的Android上的SQLite分页读取,只用文本框显示数据而已,这次就讲得更加深入些,实现并封装一个SQL分页表格控件,不仅支持分页还是以表格的形式展示数据.先来看看本文程序运行的动画: 这个SQL分页表格控件主要分为“表格区”和“分页栏”这两部分,这两部分都是基于GridView实现的.网上介绍And

Stanford机器学习---第九讲. 聚类

本栏目(Machine learning)包括单参数的线性回归.多参数的线性回归.Octave Tutorial.Logistic Regression.Regularization.神经网络.机器学习系统设计.SVM(Support Vector Machines 支持向量机).聚类.降维.异常检测.大规模机器学习等章节.内容大多来自Standford公开课machine learning中Andrew老师的讲解和其他书籍的借鉴.(https://class.coursera.org/ml/c

Android中级篇之百度地图SDK v3.5.0-一步一步带你仿各大主流APP地图定位移动选址功能

定位+移动选址 百学须先立志-学前须知: 我们经常在各大主流APP上要求被写上地址,如百度外卖.爱鲜蜂收货地址等等:其中他们大多数是可以让我们在地图上移动选址.就如下面这段GIF演示的一样: 尽信书,不如无书-能学到什么? 1.地图状态MapStatus类及监听setOnMapStatusChangeListener 2.定位LocationClient类 3.反地理编码GeoCoder类 工欲善其事必先利其器-申请Key 百度地图访问应用(AK)申请地址:http://lbsyun.baidu

《上古天真论》第九讲文字版

上古天真论篇第九讲 主讲:徐文兵  主持:梁  冬 播出时间:2009-02-07  23:00—24:00 经文:四八筋骨隆盛,肌肉满壮.五八,肾气衰,发堕齿槁.六八阳气衰竭于上,面焦,发鬃颁白.七八肝气衰,筋不能动.八八天癸渴,精少,肾脏衰,形体皆极,则齿发余.肾者主水,受五脏六腑之精藏之,故五脏盛乃能泻.今五脏皆衰.筋骨解堕,天癸尽矣 梁冬:是的,重新发现,中医太美.大家好,欢迎收听今天晚上的<国学堂>.依然是我们一起来解读<黄帝内经·上古天真论>对面呢仍然是厚扑中医学堂堂主

Android中级教程之----Log图文详解(Log.v,Log.d,Log.i,Log.w,Log.e)

在Android群里,经常会有人问我,Android Log是怎么用的,今天我就把从网上以及SDK里东拼西凑过来,让大家先一睹为快,希望对大家入门Android Log有一定的帮助. android.util.Log常用的方法有以下5个:Log.v() Log.d() Log.i() Log.w() 以及 Log.e() .根据首字母对应VERBOSE,DEBUG,INFO, WARN,ERROR. 1.Log.v 的调试颜色为黑色的,任何消息都会输出,这里的v代表verbose啰嗦的意思,平时

十、Android学习第九天——小结(转)

(转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 十.Android学习第九天——小结 通过这段时间的学习,今晚上来做个小小的总结~~~ 最早之前我们就了解到,Android四个重要的部分: 一.Activity —— 门面,就是我们看到的用户界面 二.Intent —— 在整个应用程序间传送数据 三.Service —— 不可见,为整个应用程序提供一个服务支持 四.Content Provider —— 为应用程序提供

蓝鸥零基础学习HTML5第九讲 兼容性五

蓝鸥零基础学习HTML5第九讲 兼容性五 1.兼容性13 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Document</title> <style> .box { width:400px; } .left { float: left; } .right { float: right; width:400px; } </s

蓝鸥零基础学习HTML5第九讲 兼容性六

蓝鸥零基础学习HTML5第九讲 兼容性六 1.兼容性16 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Document</title> <style> .box { width:200px; height:200px; border:1px solid #000; position: relative; } .box span

蓝鸥零基础学习HTML5第九讲 兼容性一

蓝鸥零基础学习HTML5第九讲 兼容性一 1.兼容性到底是什么玩意 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Document</title> <style> #box { width:400px; } .left { width:200px; background: red; height:300px; float:left