1 package jp.sfjp.gokigen.a01c.olycamerawrapper.takepicture;
3 import android.graphics.PointF;
4 import android.graphics.RectF;
6 import jp.co.olympus.camerakit.OLYCamera;
7 import jp.co.olympus.camerakit.OLYCameraAutoFocusResult;
8 import jp.co.olympus.camerakit.OLYCameraKitException;
9 import jp.sfjp.gokigen.a01c.liveview.IAutoFocusFrameDisplay;
10 import jp.sfjp.gokigen.a01c.olycamerawrapper.IIndicatorControl;
15 * 1. setAutoFocusFrameDisplay() で AFフレームの表示クラスを設定
16 * 2. lockAutoFocus() で AF-Lockを実行
17 * 3. unlockAutoFocus() で AF-Unlock を実行
20 public class AutoFocusControl implements OLYCamera.TakePictureCallback
22 private final OLYCamera camera;
23 private final IIndicatorControl indicator;
24 private final IAutoFocusFrameDisplay focusFrameDrawer;
25 private RectF focusFrameRect = null;
31 public AutoFocusControl(OLYCamera camera, IAutoFocusFrameDisplay focusFrameDrawer, IIndicatorControl indicator)
34 this.indicator = indicator;
35 this.focusFrameDrawer = focusFrameDrawer;
41 * @param point ターゲットAF点
44 public boolean lockAutoFocus(PointF point)
46 if (camera.isTakingPicture() || camera.isRecordingVideo())
48 // 撮影中の場合にはフォーカスロックはやらない。
52 RectF preFocusFrameRect = getPreFocusFrameRect(point);
53 showFocusFrame(preFocusFrameRect, IAutoFocusFrameDisplay.FocusFrameStatus.Running, 0.0);
57 // Set auto-focus point.
58 camera.setAutoFocusPoint(point);
61 focusFrameRect = preFocusFrameRect;
62 camera.lockAutoFocus(this);
70 camera.clearAutoFocusPoint();
71 camera.unlockAutoFocus();
72 showFocusFrame(preFocusFrameRect, IAutoFocusFrameDisplay.FocusFrameStatus.Failed, 1.0);
87 public void unlockAutoFocus()
89 if (camera.isTakingPicture() || camera.isRecordingVideo())
91 // 撮影中の場合には、フォーカスロック解除はやらない
98 camera.unlockAutoFocus();
99 camera.clearAutoFocusPoint();
109 public void onProgress(OLYCamera olyCamera, OLYCamera.TakingProgress takingProgress, OLYCameraAutoFocusResult olyCameraAutoFocusResult)
111 if (takingProgress == OLYCamera.TakingProgress.EndFocusing)
113 if (olyCameraAutoFocusResult.getResult().equals("ok") && olyCameraAutoFocusResult.getRect() != null)
116 RectF postFocusFrameRect = olyCameraAutoFocusResult.getRect();
117 showFocusFrame(postFocusFrameRect, IAutoFocusFrameDisplay.FocusFrameStatus.Focused, 0.0);
120 else if (olyCameraAutoFocusResult.getResult().equals("none"))
125 camera.clearAutoFocusPoint();
126 camera.unlockAutoFocus();
128 catch (OLYCameraKitException ee)
130 ee.printStackTrace();
139 camera.clearAutoFocusPoint();
140 camera.unlockAutoFocus();
142 catch (OLYCameraKitException ee)
144 ee.printStackTrace();
146 showFocusFrame(focusFrameRect, IAutoFocusFrameDisplay.FocusFrameStatus.Failed, 1.0);
152 public void onCompleted()
158 public void onErrorOccurred(Exception e)
160 // フォーカスロック失敗 : 通知される
164 camera.clearAutoFocusPoint();
165 camera.unlockAutoFocus();
170 ee.printStackTrace();
172 showFocusFrame(focusFrameRect, IAutoFocusFrameDisplay.FocusFrameStatus.Errored, 1.0);
175 private void showFocusFrame(RectF rect, IAutoFocusFrameDisplay.FocusFrameStatus status, double duration)
177 if (focusFrameDrawer != null)
179 focusFrameDrawer.showFocusFrame(rect, status, duration);
181 indicator.onAfLockUpdate(IAutoFocusFrameDisplay.FocusFrameStatus.Focused == status);
184 private void hideFocusFrame()
186 if (focusFrameDrawer != null)
188 focusFrameDrawer.hideFocusFrame();
190 indicator.onAfLockUpdate(false);
193 private RectF getPreFocusFrameRect(PointF point)
195 float imageWidth = 1.0f;
196 float imageHeight = 1.0f;
197 if (focusFrameDrawer != null)
199 imageWidth = focusFrameDrawer.getContentSizeWidth();
200 imageHeight = focusFrameDrawer.getContentSizeHeight();
202 // Display a provisional focus frame at the touched point.
203 float focusWidth = 0.125f; // 0.125 is rough estimate.
204 float focusHeight = 0.125f;
205 if (imageWidth > imageHeight)
207 focusHeight *= (imageWidth / imageHeight);
211 focusHeight *= (imageHeight / imageWidth);
213 return (new RectF(point.x - focusWidth / 2.0f, point.y - focusHeight / 2.0f,
214 point.x + focusWidth / 2.0f, point.y + focusHeight / 2.0f));