我正在构建一个具有自动对焦功能的自定义相机,只是想知道是否有办法调用与本机相机相同的自动对焦矩形指示器,或者我是否必须从头开始构建它......任何示例或教程链接都会不胜感激。
2 回答
查看最新的 Jelly Bean 4.2 相机处理此问题的方式可能会有所帮助。您可以通过以下方式下载相机源:
git clone https://android.googlesource.com/platform/packages/apps/Camera.git
获得代码后,导航到FocusOverlayManager
类和PieRenderer
类。如果您之前没有尝试过这个最新版本,那么对焦计是一个饼状圆圈,在对焦完成后会旋转。您可以在 photoshop 中制作自己的正方形或使用我过去使用过的这两个中的一个(一个是我制作的 iPhone ripoff,另一个是在某些版本的 android 相机中使用的九个补丁):
Jelly Bean 示例对于您要查找的内容可能有点复杂,因此以下是我为自动对焦实现视觉反馈的方式的一些指南。该过程可能有些复杂。我不会假装我的方式是做到这一点的最佳方式,但这里有一些示例代码可以为您提供总体思路...
在我的相机预览布局 xml 文件中:
<!-- Autofocus crosshairs -->
<RelativeLayout
android:id="@+id/af_casing"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerInParent="true"
android:clipChildren="false" >
<com.package.AutofocusCrosshair
android:id="@+id/af_crosshair"
android:layout_width="65dp"
android:layout_height="65dp"
android:clipChildren="false" >
</com.package.AutofocusCrosshair>
</RelativeLayout>
这个 AutofocusCrosshair 类如下:
public class AutofocusCrosshair extends View {
private Point mLocationPoint;
public AutofocusCrosshair(Context context, AttributeSet attrs) {
super(context, attrs);
}
private void setDrawable(int resid) {
this.setBackgroundResource(resid);
}
public void showStart() {
setDrawable(R.drawable.focus_crosshair_image);
}
public void clear() {
setBackgroundDrawable(null);
}
}
在我的活动中,当我想开始自动对焦时,我会执行以下操作:
mAutofocusCrosshair = (AutofocusCrosshair) findViewById(R.id.af_crosshair);
//Now add your own code to position this within the view however you choose
mAutofocusCrosshair.showStart();
//I'm assuming you'll want to animate this... so start an animation here
findViewById(R.id.af_casing).startAnimation(mAutofocusAnimation);
并确保在动画结束时清除图像:
mAutofocusAnimation.setAnimationListener(new AnimationListener() {
@Override public void onAnimationEnd(Animation arg0) {
mAutofocusCrosshair.clear();
}
@Override public void onAnimationRepeat(Animation arg0) {}
@Override public void onAnimationStart(Animation arg0) {}
});
如果您的意思是在相机应用程序的预览屏幕中改变颜色的小矩形,我很确定您必须自己绘制它。抱歉,如果这不是您想要的答案!
但是,您可以调用autoFocus()
它,它稍后会提供一个结果,告诉您相机是否在焦点上。从 API 14 开始,即使相机在FOCUS_MODE_CONTINUOUS_PICTURE
.
我也很抱歉,我不知道描述使用焦点机制的好教程。我在过去一周学到的一件事:在开始预览图像之前不要打电话autoFocus()
,因为它会使 HTC Nexus One 崩溃。
我从http://marakana.com/forums/android/examples/39.html的示例代码构建了我的第一个 Android 相机应用程序, 但请注意,那里编写的代码将每个预览帧写入 SD 卡并快速填充!里面没有关于自动对焦的代码。
编辑:当然,最终的示例代码,包括焦点指示器,在相机应用程序源代码中。本题:哪里可以得到Android相机应用源码?告诉如何获得它。我只是按照那里的说明获得了大约 35MB 的源代码,恐怕我还没有找到那个小的聚焦矩形!