博客出自: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. [笔记-图论]Floyd

    用于可带负权的多源最短路 时间复杂度O(n^3) 注意一定不要给Floyd一个带负环的图,不然就没有什么意义了(最短路不存在) 模板 // Floyd // to get minumum distan ...

  2. unity 美术注意事项

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

  3. C#做的CPU内存使用率

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  4. UVa 11849 - CD

    题目:给你两个有序序列(每一个序列中元素不同),求两序列中都出现的元素个数. 分析:简单题. 合并排序合并过程. 设置两个指针.指向两序列当前元素.那个元素小指针向后移动.相同大则计数加一,同一时候后 ...

  5. CSU1608: Particle Collider(后缀数组)

    Description In the deep universe, there is a beautiful planet named as CS on which scientists have d ...

  6. ubuntu12.04更新软件源时出现校验和不符

    在运行update命令之后.出现系统校验和不符.网上找了一些方法,最后在大神的帮助下最终攻克了! ! 1.更改 /etc/apt/apt.conf.d/00aptitude 文件,在最后一行增加: A ...

  7. UITableView去掉最后切割线的一种方法

    UITableView以style:UITableViewStylePlain方式创建时.仅仅要有cell,就会有一条黑线 哪怕至于一个cell也会有,如图 在网上找了集中方法,都不好使,比方http ...

  8. Exception: Operation xx of contract xx specifies multiple request body parameters to be serialized without any wrapper elements.

    Operation 'CreateProductCodeStock' of contract 'IChileService' specifies multiple request body param ...

  9. 11.ng-init

    转自:https://www.cnblogs.com/best/tag/Angular/ 初始化 <p ng-init="test=1" ng-repeat="a ...

  10. POJ 3257 DP

    题意: 思路: 用vector存上本出发点能到的地方&成本&有趣指数(用结构体保存) 然后DP就好了 f[i][j]表示到了i 成本为j的有趣指数最大是多少 f[vec[i][k].e ...