博客出自: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实现自定义的相机

    使用系统相机 android中使用系统相机是很方便的,单这仅仅是简单的使用而已,并不能获得什么特殊的效果. 要想让应用有相机的action,咱们就必须在清单文件中做一些声明,好让系统知道,如下 < ...

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

    (转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 十.Android学习第九天——小结 通过这段时间的学习,今晚上来做个小小 ...

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

    原文:http://blog.csdn.net/abcjennifer/article/details/7914952 本栏目(Machine learning)包括单参数的线性回归.多参数的线性回归 ...

  4. PE格式第九讲,资源表解析

    PE格式第九讲,资源表解析 一丶熟悉Windows管理文件的方法 首先,为什么标题是这个,主要是为了下边讲解资源方便,因为资源结构体很乱.如果直接拿出来讲解,那么就会很晕. 1.windows管理文件 ...

  5. Linux第九讲随笔 -进程管理 、ps aux 、

    Linux第九讲1,进程管理 Linux在执行每一个程序时,就会在内存中为这个程序建立一个进程,以便让内核可以管理这个运行中的进程,进程是系统分配各种资源,进程调度的基本单位. 怎么查看进程 一.ps ...

  6. python学习第九讲,python中的数据类型,字符串的使用与介绍

    目录 python学习第九讲,python中的数据类型,字符串的使用与介绍 一丶字符串 1.字符串的定义 2.字符串的常见操作 3.字符串操作 len count index操作 4.判断空白字符,判 ...

  7. Linux基础知识第九讲,linux中的解压缩,以及软件安装命令

    目录 Linux基础知识第九讲,linux中的解压缩,以及软件安装命令 一丶Linux Mac Windows下的压缩格式简介 2.压缩以及解压缩 3.linux中的软件安装以及卸载 1.apt进行安 ...

  8. C语言第九讲,结构体

    C语言第九讲,结构体 一丶结构体的定义 在C语言中,可以使用结构体(Struct)来存放一组不同类型的数据.结构体的定义形式为: struct 结构体名{ 结构体所包含的变量或数组 }; 结构体是一种 ...

  9. 第九讲_图像生成 Image Captioning

    第九讲_图像生成 Image Captioning 生成式对抗网络 Generative Adversarial network 学习数据分布:概率密度函数估计+数据样本生成 生成式模型是共生关系,判 ...

随机推荐

  1. C#中Dictionary排序方式

    转载自:https://www.cnblogs.com/5696-an/p/5625142.html 自定义类: https://files.cnblogs.com/files/xunhanliu/d ...

  2. iotop---监控磁盘I/O 使用状况

    iotop命令是一个用来监视磁盘I/O使用状况的top类工具.iotop具有与top相似的UI,其中包括PID.用户.I/O.进程等相关信息.Linux下的IO统计工具如iostat,nmon等大多数 ...

  3. Nutch1.6学习笔记

    回 到 目 录 暑假每天傍晚或晚上更新 伪恋赛高 这里提供nutch1.6的src下载: apache-nutch-1.6-src.zip 115网盘礼包码:5lbcymlo6u76http://11 ...

  4. resin后台输出中文乱码的解决的方法!

    近期从tomcat移植到resin,发现这东西不错啊! 仅仅是后台输出时有时候中文会乱码. 如今找到resin后台输出中文乱码的解决的方法: 编辑conf/resin.con文件: <!--ja ...

  5. vim 插件之 surround.vim

    surround.vim-这个插件主要是用来插入一些特殊符号的(成对出现) 下载地址 http://www.vim.org/scripts/script.php?script_id=1697 http ...

  6. poj--2391--Ombrophobic Bovines(floyd+二分+最大流拆点)

    Ombrophobic Bovines Time Limit: 1000MS   Memory Limit: 65536KB   64bit IO Format: %I64d & %I64u ...

  7. 打开文件对话框在xp和win7上的实现文件任意多选

    作者:朱金灿 来源:http://blog.csdn.net/clever101 在xp系统上进行文件多选,实际上其文件字符串数组的缓冲区是有限,并不能支持选择任意多个文件,为此以前我还写过一篇文章: ...

  8. org.w3c.dom.Document 与org.dom4j.Document互转

    public static Document parse(org.w3c.dom.Document doc) throws Exception { if (doc == null) { return ...

  9. SQL try catch处理

    ALTER PROC usp_AccountTransaction @AccountNum INT, @Amount DECIMAL AS BEGIN BEGIN TRY --Start the Tr ...

  10. element-ui表格控件前端分页方法

    <div id="app"> <el-table :data="tableData.slice((currentPage-1)*pageSize,cur ...