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;
}
}

												

相机手动对焦(带动画效果)相关推荐

  1. css3+jQuery制作导航菜单(带动画效果)

    <!DOCTYPE html> <html><head><meta charset="UTF-8"><title>css ...

  2. (带动画效果)卷积神经网络的讲解.pptx

    这学期我上的另一门课是本科生的<深度学习>,主要用的是吴恩达老师的<深度学习>视频课的内容. 使用教材:吴恩达<深度学习>课程笔记 课外参考书:<深度学习&g ...

  3. 我的Android进阶之旅------Android利用温度传感器实现带动画效果的电子温度计

    要想实现带动画效果的电子温度计,需要以下几个知识点: 1.温度传感器相关知识. 2.ScaleAnimation动画相关知识,来进行水印刻度的缩放效果. 3.android:layout_weight ...

  4. vue伸缩效果_Vue2(三)实现子菜单展开收缩,带动画效果实现方法

    以前做这种操作就是简单的display:block,但现在用户的要求也越来越高,需要美观和动画感. 现在介绍用一种简单的方式来实现子菜单从上向下展开子菜单. 看下效果图: 点开效果: 其实原理比较简单 ...

  5. Android利用温度传感器实现带动画效果的电子温度计

    概述 Android利用温度传感器实现带动画效果的电子温度计. 详细 一.准备工作 需要准备一部带有温度传感器的安卓手机,或者使用有温度传感器的模拟器. 二.程序实现 1.需要截图程序结构 2.实现思 ...

  6. GDI+入门(5、在GDI+中绘制带动画效果的图片)

    五.在GDI+中绘制带动画效果的图片 private void Form2_Load(object sender, EventArgs e) { SetStyle(ControlStyles.Doub ...

  7. Android高效率实现弹出带动画效果的对话框,仿照微信对话框效果

    转载请注明出处: http://blog.csdn.net/jakeyangchina/article/details/53423453 看到很多app页面里都有弹出对话框效果,今天使用PopupWi ...

  8. html5制作天气动画背景,CSS icon图标之纯CSS实现带动画效果的天气图标

    CSS3动画属性并不是很多,但重点其实是你怎样去运用它,从简单的hover状态或复杂的小动画,都可以巧妙的用CSS3动画属性来实现. 今天主要是和大家分享一个比较有创意.实用的CSS天气图标动画,静态 ...

  9. SVG实现带动画效果的购物图标

    下载地址 制作网站CSS动画时,不要为了弦的效果而制作,它更虽然有意义.今天将向大家介绍一套使用CSS实现带动画的商城购物类的图标,图标设计漂亮可爱,加上友好的动画效果,这能给用户增加一点有趣的购物体 ...

最新文章

  1. 你哪来这么多事(一):学生信息插入
  2. 【每日一题】7月17日题目精讲—BOWL 碗的叠放
  3. YII2 服务器验证码不显示
  4. Jackson序列化实例
  5. VSCode自定义代码片段5——HTML元素结构
  6. LINQ to SQL 系列 如何使用LINQ to SQL插入、修改、删除数据
  7. Atitit 计算机的组成与设计 目录 1. 计算机系统是由硬件系统和软件系统两大部分组成。  1 1.1. Cpu(alu+cu ) 1 1.2. 存储内存 外村 1 1.3. Io设备 鼠标
  8. 5.0在python中是一个整数常量_python学习之路,基础篇-变量和常量
  9. python源码剖析_Python源码剖析读后感1000字
  10. [含论文+源码等]基于java+ssh+mysql实现的共享自行车租赁|出租管理系统
  11. windows下批量创建txt文件
  12. python学习第二天——编写名片
  13. 操作系统——进程管理
  14. 碰撞的小球(100分)
  15. c语言不报错但输不出正确结果,正则表达式,c++_C语言 正则表达式结果不对?,正则表达式,c++ - phpStudy...
  16. Mac上绘制流程图的软件
  17. 做开发遇到35岁瓶颈被裁员,体验了一把“自由职业”,最后入行了软件测试...
  18. 亚信安全与新华三联手打造“更安全”的云数据中心
  19. 链表OJ2——倒数第K个结点-分割链表,回文链表,相交链表,环形链表和随机指针链表深拷贝问题
  20. IEEE引用格式规则及示例

热门文章

  1. 安装稳定版python 3.9.2
  2. wwise初始化失败
  3. 数据库工程师考试自学(7)---函数依赖与多值依赖
  4. 餐饮界有福了,为海底捞服务的SaaS产品开始推向全行业
  5. Spark流式计算概念
  6. jsp里照片放在哪里_看了这个女生“不要脸”的照片后,我再也不好意思发朋友圈了.........
  7. “我想玩游戏!” 大佬:玩啥游戏,教你做一个智能贪吃蛇游戏!
  8. 【电气专业知识问答】问:手动操作隔离开关时拉不开怎么办?
  9. 漏洞payload 靶机_靶机渗透测试--hack the wakanda
  10. Spring框架总结六---自动装配