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 入门第九讲01-音频(本地音乐播放,暂停,继续播放,获取播放时间,快进到指定位置,变速播放,播放data/data/目录下的音频文件,播放网络歌曲)
Android 入门第九讲01-音频(本地音乐播放,暂停,继续播放,获取播放时间,快进到指定位置,变速播放,播放data/data/目录下的音频文件,播放网络歌曲) 准备 1.储存在raw文件夹 2. ...
- Android高级第九讲--JVM 与Android Dalvik之间的异同
博客出自:http://blog.csdn.net/liuxian13183,转载注明出处! All Rights Reserved ! 有些东西不是不知道,是还没用到,所以才没去仔细了解,昨天被问及 ...
- 【android编程】第九讲-用户资源
第九讲 用户资源 文章目录 第九讲 用户资源 0.学习指导 1.字符串(string)资源 2.颜色(color)资源 颜色值定义 定义颜色资源文件 使用颜色资源 3.尺寸(dimen)资源 Andr ...
- 智能机那些事儿――第九讲 硬件
智能机那些事儿――第九讲 硬件 2011年08月25日 第九讲 硬件 这又是一节很长的了,将会涉及手机的CPU&GPU.内存(RAM).手机内存(ROM).内置存储空间(有些手机有).SD卡. ...
- C#发现之旅第九讲 ASP.NET验证码技术
C#发现之旅第九讲 ASP.NET验证码技术 袁永福 2008-5-15 系列课程说明 为了让大家更深入的了解和使用C#,我们将开始这一系列的主题为"C#发现之旅"的技术讲 ...
- 【slam十四讲第二版】【课本例题代码向】【第九讲~后端Ⅰ】【安装Meshlab】【BAL数据集格式】【ceres求解BA】【g2o求解BA】
[slam十四讲第二版][课本例题代码向][第九讲~后端Ⅰ][安装Meshlab][BAL数据集格式][ceres求解BA][g2o求解BA] 0 前言 1 安装Meshlab: 三维几何网格处理 2 ...
- Android通知怎么实现?Android开发如何操作相机和相册?
Android通知怎么实现?Android开发如何操作相机和相册? 前言 八.Android通知怎么实现?Android开发如何操作相机和相册? 8.1 通知介绍 8.2 通知的基本用法 8.3 An ...
- Android中级篇之百度地图SDK v3.5.0-一步一步带你仿各大主流APP地图定位移动选址功能
from: http://blog.csdn.net/y1scp/article/details/49095729 定位+移动选址 百学须先立志-学前须知: 我们经常在各大主流APP上要求被写上地址, ...
- 内核知识第九讲,32位下的分页管理,36位下的分页管理.以及64位下的分页管理
内核知识第九讲,32位下的分页管理,36位下的分页管理.以及64位下的分页管理 一丶熟悉WinDbg的常见命令. dd 虚拟地址 显示内存. !dd 加上!, ! dd 物理地 ...
最新文章
- 在VC6.0中创建工程并输入源代码
- 错误	2	error C2059: 语法错误:“::”
- asp.net 后台任务作业框架收集
- ABAP 动态 SQL
- Java进阶:Semaphore信号量基本使用
- 程序员面试金典 - 面试题 08.10. 颜色填充(BFS/DFS)
- 【clickhouse】clickhouse Uint64 不是64位 超限不报错
- 华为手机连电脑_移动办公利器华为MatePad Pro:能写会画有键盘,能当电脑连手机...
- 测试对等网络的连通性
- 保存Drawable资源为Bitmap文件
- qt 调用qpainter_QT 利用QPainter绘图的坐标系转换
- xXx时间屏保+背景图片
- python课堂教学_初中生初学python课堂教学感悟
- 传感器的应用/SurfaceView/制作简单的指南针
- 一块链习公开课:从 0 到 1 构建去中心化应用 | ArcBlock 预告
- hive窗口函数必备宝典
- 微信小程序:各种Tab栏
- 悬垂指针(Dangling pointer)和野指针(Wild pointer)
- 25、基于原型的切比雪夫低通滤波器匹配设计理论
- GET日志服务如何使用让你获得建立DT时代海量日志处理能力