博客出自: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. MySQL 大数据量文本插入

    导入几万条数据需要等好几分钟的朋友来围观一下! 百万条数据插入,只在一瞬间.呵呵夸张,夸张!! 不到半分钟是真的! 插入指令: load data infile 'c:/wamp/tmp/Data_O ...

  2. UVA-11134 Fabled Rooks 贪心问题(区间贪心)

    题目链接:https://cn.vjudge.net/problem/UVA-11134 题意 在 n*n 的棋盘上,放上 n 个车(ju).使得这 n 个车互相不攻击,即任意两个车不在同一行.同一列 ...

  3. unity 美术注意事项

    有时候美术的一个不小心,就会给程序徒增极大的工作量,所以在项目开始之前是有必要和美术沟通一下,来规范一些东西, 1.将单体模型的轴心置中. 2.模型有父物体时,子物体应相对于父物体的(0,0,0)位置 ...

  4. jquery快速清除复选框、单选框的选中

    $(":checked").attr("checked", "");

  5. 炜煌E30 E31微型热敏打印机 STM32 串口驱动

    设置为汉字模式 十六进制 命令:1C    26 USART_SendData(USART2,0x1C); while(USART_GetFlagStatus(USART2,USART_FLAG_TC ...

  6. Oracle TIMESTAMP的处理

    public class Test { private static final SimpleDateFormat FORMAT = new SimpleDateFormat("yyyy-M ...

  7. 解决Visual Studio-IIS Express 支持局域网访问

  8. Redis的安装与启动(doc和本地客户端)

    官网 安装都是老生长谈了(这个也不错),这里推荐俩个文章看看把.:打开一个cmd窗口 使用cd命令切换目录到 C:\redis 运行 redis-server.exe redis.conf(安装的关键 ...

  9. LeetCode 0、《两数相加》

    一.给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 示例: 输入:(2 ...

  10. Hexo 添加自定义的内置标签

    灵感 想设计一个记录自已骑行的页面,显示时间.地点.路线图等信息.方便以后做一些留念.定位想实现下面类似的效果.参考:<特效>      实现方案也比较简单,反键查看源码.直接Copy,在 ...