博客出自: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中级第九讲--相机调焦相关推荐

  1. Android 入门第九讲01-音频(本地音乐播放,暂停,继续播放,获取播放时间,快进到指定位置,变速播放,播放data/data/目录下的音频文件,播放网络歌曲)

    Android 入门第九讲01-音频(本地音乐播放,暂停,继续播放,获取播放时间,快进到指定位置,变速播放,播放data/data/目录下的音频文件,播放网络歌曲) 准备 1.储存在raw文件夹 2. ...

  2. Android高级第九讲--JVM 与Android Dalvik之间的异同

    博客出自:http://blog.csdn.net/liuxian13183,转载注明出处! All Rights Reserved ! 有些东西不是不知道,是还没用到,所以才没去仔细了解,昨天被问及 ...

  3. 【android编程】第九讲-用户资源

    第九讲 用户资源 文章目录 第九讲 用户资源 0.学习指导 1.字符串(string)资源 2.颜色(color)资源 颜色值定义 定义颜色资源文件 使用颜色资源 3.尺寸(dimen)资源 Andr ...

  4. 智能机那些事儿――第九讲 硬件

    智能机那些事儿――第九讲 硬件 2011年08月25日 第九讲 硬件 这又是一节很长的了,将会涉及手机的CPU&GPU.内存(RAM).手机内存(ROM).内置存储空间(有些手机有).SD卡. ...

  5. C#发现之旅第九讲 ASP.NET验证码技术

    C#发现之旅第九讲 ASP.NET验证码技术 袁永福 2008-5-15 系列课程说明     为了让大家更深入的了解和使用C#,我们将开始这一系列的主题为"C#发现之旅"的技术讲 ...

  6. 【slam十四讲第二版】【课本例题代码向】【第九讲~后端Ⅰ】【安装Meshlab】【BAL数据集格式】【ceres求解BA】【g2o求解BA】

    [slam十四讲第二版][课本例题代码向][第九讲~后端Ⅰ][安装Meshlab][BAL数据集格式][ceres求解BA][g2o求解BA] 0 前言 1 安装Meshlab: 三维几何网格处理 2 ...

  7. Android通知怎么实现?Android开发如何操作相机和相册?

    Android通知怎么实现?Android开发如何操作相机和相册? 前言 八.Android通知怎么实现?Android开发如何操作相机和相册? 8.1 通知介绍 8.2 通知的基本用法 8.3 An ...

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

    from: http://blog.csdn.net/y1scp/article/details/49095729 定位+移动选址 百学须先立志-学前须知: 我们经常在各大主流APP上要求被写上地址, ...

  9. 内核知识第九讲,32位下的分页管理,36位下的分页管理.以及64位下的分页管理

    内核知识第九讲,32位下的分页管理,36位下的分页管理.以及64位下的分页管理 一丶熟悉WinDbg的常见命令. dd 虚拟地址      显示内存. !dd 加上!,        ! dd 物理地 ...

最新文章

  1. 在VC6.0中创建工程并输入源代码
  2. 错误 2 error C2059: 语法错误:“::”
  3. asp.net 后台任务作业框架收集
  4. ABAP 动态 SQL
  5. Java进阶:Semaphore信号量基本使用
  6. 程序员面试金典 - 面试题 08.10. 颜色填充(BFS/DFS)
  7. 【clickhouse】clickhouse Uint64 不是64位 超限不报错
  8. 华为手机连电脑_移动办公利器华为MatePad Pro:能写会画有键盘,能当电脑连手机...
  9. 测试对等网络的连通性
  10. 保存Drawable资源为Bitmap文件
  11. qt 调用qpainter_QT 利用QPainter绘图的坐标系转换
  12. xXx时间屏保+背景图片
  13. python课堂教学_初中生初学python课堂教学感悟
  14. 传感器的应用/SurfaceView/制作简单的指南针
  15. 一块链习公开课:从 0 到 1 构建去中心化应用 | ArcBlock 预告
  16. hive窗口函数必备宝典
  17. 微信小程序:各种Tab栏
  18. 悬垂指针(Dangling pointer)和野指针(Wild pointer)
  19. 25、基于原型的切比雪夫低通滤波器匹配设计理论
  20. GET日志服务如何使用让你获得建立DT时代海量日志处理能力

热门文章

  1. prototype 是什么东西,原型链的理解,什么时候用 prototype
  2. 数据库概念总结(期末考试)
  3. js 年月日时间转换
  4. STATA描述性统计
  5. 深入理解23种设计模式(6) -- 桥接模式
  6. 阴阳对优化算法Yin YangPairOptimizationYYPO 2016
  7. 第三季度财报有游戏高管电话解读
  8. C++---二叉搜索树
  9. PWA系列 - Cache API 的设计与实现
  10. POJ 7834:分成互质组