Android中级第九讲--相机调焦
博客出自: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中级第九讲--相机调焦的更多相关文章
- Android实现自定义的相机
使用系统相机 android中使用系统相机是很方便的,单这仅仅是简单的使用而已,并不能获得什么特殊的效果. 要想让应用有相机的action,咱们就必须在清单文件中做一些声明,好让系统知道,如下 < ...
- 十、Android学习第九天——小结(转)
(转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 十.Android学习第九天——小结 通过这段时间的学习,今晚上来做个小小 ...
- Stanford机器学习---第九讲. 聚类
原文:http://blog.csdn.net/abcjennifer/article/details/7914952 本栏目(Machine learning)包括单参数的线性回归.多参数的线性回归 ...
- PE格式第九讲,资源表解析
PE格式第九讲,资源表解析 一丶熟悉Windows管理文件的方法 首先,为什么标题是这个,主要是为了下边讲解资源方便,因为资源结构体很乱.如果直接拿出来讲解,那么就会很晕. 1.windows管理文件 ...
- Linux第九讲随笔 -进程管理 、ps aux 、
Linux第九讲1,进程管理 Linux在执行每一个程序时,就会在内存中为这个程序建立一个进程,以便让内核可以管理这个运行中的进程,进程是系统分配各种资源,进程调度的基本单位. 怎么查看进程 一.ps ...
- python学习第九讲,python中的数据类型,字符串的使用与介绍
目录 python学习第九讲,python中的数据类型,字符串的使用与介绍 一丶字符串 1.字符串的定义 2.字符串的常见操作 3.字符串操作 len count index操作 4.判断空白字符,判 ...
- Linux基础知识第九讲,linux中的解压缩,以及软件安装命令
目录 Linux基础知识第九讲,linux中的解压缩,以及软件安装命令 一丶Linux Mac Windows下的压缩格式简介 2.压缩以及解压缩 3.linux中的软件安装以及卸载 1.apt进行安 ...
- C语言第九讲,结构体
C语言第九讲,结构体 一丶结构体的定义 在C语言中,可以使用结构体(Struct)来存放一组不同类型的数据.结构体的定义形式为: struct 结构体名{ 结构体所包含的变量或数组 }; 结构体是一种 ...
- 第九讲_图像生成 Image Captioning
第九讲_图像生成 Image Captioning 生成式对抗网络 Generative Adversarial network 学习数据分布:概率密度函数估计+数据样本生成 生成式模型是共生关系,判 ...
随机推荐
- nginx的gizp压缩
好处: 页面另存为大小比浏览器传输大小大很多.好处是加快传输.节省带宽. 原理: 浏览器 -> 请求 -> 声明可以接受的压缩方式[http 协议请 ...
- P3514 [POI2011]LIZ-Lollipop(规律+瞎搞)
题意 给一个只有1和2的序列,每次询问有没有一个子串的和为x ( 1≤n,m≤1 000 000 )kkk ( 1≤k≤2 000 000 ) 题解 我觉得是道好题. 主要是证明一个性质:假如有一个字 ...
- linux一个网卡添加多个虚IP
[root@localhost ~]# ifconfig bond0:0 10.0.0.202 netmask 255.255.255.255 broadcast 10.0.0.255 up 摘自:h ...
- Haproxy实现web的页面的动静分离
一.Haproxy概述: 概述:Haproxy是一个开源的高性能的反向代理或者说是负载均衡服务软件之一,由C语言编写而成,支持会话保持.七层处理.健康检查.故障修复后自动加载.动静分离.HAProxy ...
- python在leecode刷题-第一题和第七题
class Solution(object): def twoSum(self, nums, target): """ :type nums: List[int] num ...
- 【VK Cup 2015 - Finals D】Restructuring Company
[题目链接]:http://codeforces.com/problemset/problem/566/D [题意] 给你n个人; 一开始每个人都隶属于一个部门; 之后给你q个操作; 3种操作类型; ...
- MySQL auttoReconnect
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from ...
- modSecurity规则学习(八)——防止CC攻击
modSecurity日志收集:在phase 5阶段处理. 由于CC攻击主要考虑对动态请求的防护,所以要排除静态资源的请求,或者自定义动态请求的后缀或者关键字做接口针对性的防护. 定义需要排除的请求u ...
- .Net商品管理(注释,百度,提问,对比,总结)
管理控制器 using System; using System.Collections.Generic; using System.Linq; using System.Web; using Sys ...
- MVP模式入门(结合Rxjava,Retrofit)
本文MVP的sample实现效果: github地址:https://github.com/xurui1995/MvpSample 老规矩,在说对MVP模式的理解之前还是要再谈谈MVC模式,了解了MV ...