相机手动对焦(带动画效果)
showsf_sv = (SurfaceView)findViewById(R.id.camera_showsf_sv ); // 成像控件
showsf_sv.setOnTouchListener(new TouchListener());
private final class TouchListener implements View.OnTouchListener {
@Override
public boolean onTouch(View v, MotionEvent event) {
/** 通过与运算保留最后八位 MotionEvent.ACTION_MASK = 255 */
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_UP:
//设置聚焦
Point point = new Point((int) event.getX(), (int) event.getY());
onFocus(point, autoFocusCallback);
mFocusImageView.startFocus(point);
break;
}
return true;
}
}
private final Camera.AutoFocusCallback autoFocusCallback=new Camera.AutoFocusCallback() {
@Override
public void onAutoFocus(boolean success, Camera camera) {
//聚焦之后根据结果修改图片
isFocusSuccess =success;
if (success) {
mFocusImageView.onFocusSuccess();
}else {
//聚焦失败显示的图片,由于未找到合适的资源,这里仍显示同一张图片
mFocusImageView.onFocusFailed();
}
}
};
/**
* 手动聚焦
* @param point 触屏坐标
*/
protected void onFocus(Point point,Camera.AutoFocusCallback callback){
if(mCamera!=null) {
Camera.Parameters parameters = mCamera.getParameters();
//不支持设置自定义聚焦,则使用自动聚焦,返回
if (parameters.getMaxNumFocusAreas() <= 0) {
mCamera.autoFocus(callback);
return;
}
List<Camera.Area> areas = new ArrayList<Camera.Area>();
int left = point.x - 300;
int top = point.y - 300;
int right = point.x + 300;
int bottom = point.y + 300;
left = left < -1000 ? -1000 : left;
top = top < -1000 ? -1000 : top;
right = right > 1000 ? 1000 : right;
bottom = bottom > 1000 ? 1000 : bottom;
areas.add(new Camera.Area(new Rect(left, top, right, bottom), 100));
parameters.setFocusAreas(areas);
try {
//本人使用的小米手机在设置聚焦区域的时候经常会出异常,看日志发现是框架层的字符串转int的时候出错了,
//目测是小米修改了框架层代码导致,在此try掉,对实际聚焦效果没影响
mCamera.setParameters(parameters);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
mCamera.autoFocus(callback);
}
}
聚焦动画效果
package cn.maketion.app.camera;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Point;
import android.os.Handler;
import android.util.AttributeSet;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.FrameLayout;
import android.widget.ImageView;
import cn.maketion.activity.R;
/**
* @ClassName: FocusImageView
* @Description:聚焦时显示的ImagView
* @author major
* @date 2016-4-20
*
*/
public class FocusImageView extends ImageView {
public final static String TAG="FocusImageView";
private static final int NO_ID=-1;
private int mFocusImg=NO_ID;
private int mFocusSucceedImg=NO_ID;
private int mFocusFailedImg=NO_ID;
private Animation mAnimation;
private Handler mHandler;
public FocusImageView(Context context) {
super(context);
mAnimation=AnimationUtils.loadAnimation(getContext(), R.anim.focusview_show);
setVisibility(View.GONE);
mHandler=new Handler();
}
public FocusImageView(Context context, AttributeSet attrs) {
super(context, attrs);
mAnimation=AnimationUtils.loadAnimation(getContext(), R.anim.focusview_show);
mHandler=new Handler();
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.FocusImageView);
mFocusImg = a.getResourceId(R.styleable.FocusImageView_focus_focusing_id, NO_ID);
mFocusSucceedImg=a.getResourceId(R.styleable.FocusImageView_focus_success_id, NO_ID);
mFocusFailedImg=a.getResourceId(R.styleable.FocusImageView_focus_fail_id, NO_ID);
a.recycle();
//聚焦图片不能为空
if (mFocusImg==NO_ID||mFocusSucceedImg==NO_ID||mFocusFailedImg==NO_ID)
throw new RuntimeException("Animation is null");
}
/**
* 显示聚焦图案
* @param x 触屏的x坐标
* @param y 触屏的y坐标
*/
public void startFocus(Point point){
if (mFocusImg==NO_ID||mFocusSucceedImg==NO_ID||mFocusFailedImg==NO_ID)
throw new RuntimeException("focus image is null");
//根据触摸的坐标设置聚焦图案的位置
FrameLayout.LayoutParams params=(FrameLayout.LayoutParams) getLayoutParams();
params.topMargin= point.y-getHeight()/2;
params.leftMargin=point.x-getWidth()/2;
setLayoutParams(params);
//设置控件可见,并开始动画
setVisibility(View.VISIBLE);
setImageResource(mFocusImg);
startAnimation(mAnimation);
//3秒后隐藏View。在此处设置是由于可能聚焦事件可能不触发。
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
setVisibility(View.GONE);
}
},3500);
}
/**
* 聚焦成功回调
*/
public void onFocusSuccess(){
setImageResource(mFocusSucceedImg);
//移除在startFocus中设置的callback,1秒后隐藏该控件
mHandler.removeCallbacks(null, null);
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
setVisibility(View.GONE);
}
},1000);
}
/**
* 聚焦失败回调
*/
public void onFocusFailed(){
setImageResource(mFocusFailedImg);
//移除在startFocus中设置的callback,1秒后隐藏该控件
mHandler.removeCallbacks(null, null);
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
setVisibility(View.GONE);
}
},1000);
}
/**
* 设置开始聚焦时的图片
* @param focus
*/
public void setFocusImg(int focus) {
this.mFocusImg = focus;
}
/**
* 设置聚焦成功显示的图片
* @param focusSucceed
*/
public void setFocusSucceedImg(int focusSucceed) {
this.mFocusSucceedImg = focusSucceed;
}
}
相机手动对焦(带动画效果)相关推荐
- css3+jQuery制作导航菜单(带动画效果)
<!DOCTYPE html> <html><head><meta charset="UTF-8"><title>css ...
- (带动画效果)卷积神经网络的讲解.pptx
这学期我上的另一门课是本科生的<深度学习>,主要用的是吴恩达老师的<深度学习>视频课的内容. 使用教材:吴恩达<深度学习>课程笔记 课外参考书:<深度学习&g ...
- 我的Android进阶之旅------Android利用温度传感器实现带动画效果的电子温度计
要想实现带动画效果的电子温度计,需要以下几个知识点: 1.温度传感器相关知识. 2.ScaleAnimation动画相关知识,来进行水印刻度的缩放效果. 3.android:layout_weight ...
- vue伸缩效果_Vue2(三)实现子菜单展开收缩,带动画效果实现方法
以前做这种操作就是简单的display:block,但现在用户的要求也越来越高,需要美观和动画感. 现在介绍用一种简单的方式来实现子菜单从上向下展开子菜单. 看下效果图: 点开效果: 其实原理比较简单 ...
- Android利用温度传感器实现带动画效果的电子温度计
概述 Android利用温度传感器实现带动画效果的电子温度计. 详细 一.准备工作 需要准备一部带有温度传感器的安卓手机,或者使用有温度传感器的模拟器. 二.程序实现 1.需要截图程序结构 2.实现思 ...
- GDI+入门(5、在GDI+中绘制带动画效果的图片)
五.在GDI+中绘制带动画效果的图片 private void Form2_Load(object sender, EventArgs e) { SetStyle(ControlStyles.Doub ...
- Android高效率实现弹出带动画效果的对话框,仿照微信对话框效果
转载请注明出处: http://blog.csdn.net/jakeyangchina/article/details/53423453 看到很多app页面里都有弹出对话框效果,今天使用PopupWi ...
- html5制作天气动画背景,CSS icon图标之纯CSS实现带动画效果的天气图标
CSS3动画属性并不是很多,但重点其实是你怎样去运用它,从简单的hover状态或复杂的小动画,都可以巧妙的用CSS3动画属性来实现. 今天主要是和大家分享一个比较有创意.实用的CSS天气图标动画,静态 ...
- SVG实现带动画效果的购物图标
下载地址 制作网站CSS动画时,不要为了弦的效果而制作,它更虽然有意义.今天将向大家介绍一套使用CSS实现带动画的商城购物类的图标,图标设计漂亮可爱,加上友好的动画效果,这能给用户增加一点有趣的购物体 ...
最新文章
- 你哪来这么多事(一):学生信息插入
- 【每日一题】7月17日题目精讲—BOWL 碗的叠放
- YII2 服务器验证码不显示
- Jackson序列化实例
- VSCode自定义代码片段5——HTML元素结构
- LINQ to SQL 系列 如何使用LINQ to SQL插入、修改、删除数据
- Atitit 计算机的组成与设计 目录 1. 计算机系统是由硬件系统和软件系统两大部分组成。 	1 1.1. Cpu(alu+cu )	1 1.2. 存储内存 外村	1 1.3. Io设备 鼠标
- 5.0在python中是一个整数常量_python学习之路,基础篇-变量和常量
- python源码剖析_Python源码剖析读后感1000字
- [含论文+源码等]基于java+ssh+mysql实现的共享自行车租赁|出租管理系统
- windows下批量创建txt文件
- python学习第二天——编写名片
- 操作系统——进程管理
- 碰撞的小球(100分)
- c语言不报错但输不出正确结果,正则表达式,c++_C语言 正则表达式结果不对?,正则表达式,c++ - phpStudy...
- Mac上绘制流程图的软件
- 做开发遇到35岁瓶颈被裁员,体验了一把“自由职业”,最后入行了软件测试...
- 亚信安全与新华三联手打造“更安全”的云数据中心
- 链表OJ2——倒数第K个结点-分割链表,回文链表,相交链表,环形链表和随机指针链表深拷贝问题
- IEEE引用格式规则及示例
热门文章
- 安装稳定版python 3.9.2
- wwise初始化失败
- 数据库工程师考试自学(7)---函数依赖与多值依赖
- 餐饮界有福了,为海底捞服务的SaaS产品开始推向全行业
- Spark流式计算概念
- jsp里照片放在哪里_看了这个女生“不要脸”的照片后,我再也不好意思发朋友圈了.........
- “我想玩游戏!” 大佬:玩啥游戏,教你做一个智能贪吃蛇游戏!
- 【电气专业知识问答】问:手动操作隔离开关时拉不开怎么办?
- 漏洞payload 靶机_靶机渗透测试--hack the wakanda
- Spring框架总结六---自动装配