博客出自: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. mongodb 的索引

                索引加快了查询速度,但是降低了写入速度.所以不要在没必要的属性上加索引.             在 mongodb 中索引可以按倒序/正序创建,便于排序.           ...

  2. [POI2010]KLO-Blocks(单调栈)

    题意 给出N个正整数a[1..N],再给出一个正整数k,现在可以进行如下操作:每次选择一个大于k的正整数a[i],将a[i]减去1,选择a[i-1]或a[i+1]中的一个加上1.经过一定次数的操作后, ...

  3. opencv3.4.1和vs2017配置

    官网下载opencv,双击之后会将文件提取出来,提取出来的文件放在一个合适的位置(选个好地方,不要乱改,环境的配置依赖于这个目录),我放在了D:\program下 配置环境变量: 右键此电脑--> ...

  4. 使用 swoole_process 实现 PHP 进程池

    swoole_process 主要是用来代替 PHP 的 pcntl 扩展.我们知道 pcntl 是用来进行多进程编程的,而 pcntl 只提供了 fork 这样原始的接口,容易使用错误,并且没有提供 ...

  5. thymeleaf 教程

    html页面 添加  <html xmlns:th="http://www.thymeleaf.org" > html原有标签都可以用thymeleaf标签替换 1.t ...

  6. HDU 5373(2015多校7)-The shortest problem(模拟%11)

    题目地址:pid=5373">HDU 5373 题意:给你一个数n和操作次数t,每次操作将n的各位数之和求出来放在n的末尾形成新的n,问t次操作后得到的n能否够被11整除. 思路:就是 ...

  7. Use Uncertainty As a Driver

     Use Uncertainty As a Driver Kevlin Henney ConFRonTEd WiTH TWo opTionS, most people think that the ...

  8. js实现小时钟,js中Date对象的使用?

    介绍一下js中Date对象的使用 dateObj = new Date() dateObj = new Date(dateValue) dateObj = new Date(year,month,da ...

  9. Codeforces 344A Magnets

    Description Mad scientist Mike entertains himself by arranging rows of dominoes. He doesn't need dom ...

  10. c#(asp.net) 如何计算两个日期之间相隔天数

    1.DateTime t1 = Convert.ToDateTime("2006-1-6"); DateTime t2 = Convert.ToDateTime("200 ...