import android.util.Log;
+import java.util.Map;
+
import jp.co.olympus.camerakit.OLYCamera;
/**
private float minimumLength = 0.0f;
private float maximumLength = 0.0f;
private float currentLength = 0.0f;
+ private float minimumDigitalScale = 1.0f;
+ private float maximumDigitalScale = 1.0f;
+ private float currentDigitalScale = 1.0f;
private final OLYCamera camera;
ZoomLensHolder(OLYCamera camera)
canZoom = false;
try
{
- canZoom = ((camera != null) && (camera.getLensMountStatus()).contains("electriczoom"));
+ if (camera == null)
+ {
+ return;
+ }
+
+ // デジタルズームの情報
+ Map<String, Float> value = camera.getDigitalZoomScaleRange();
+ maximumDigitalScale = value.get(OLYCamera.DIGITAL_ZOOM_SCALE_RANGE_MAXIMUM_KEY);
+ minimumDigitalScale = value.get(OLYCamera.DIGITAL_ZOOM_SCALE_RANGE_MINIMUM_KEY);
+ Log.v(TAG, "DIGITAL ZOOM SCALE : " + minimumDigitalScale + " - " + maximumDigitalScale);
+
+ // 光学ズームの情報
+ canZoom = (camera.getLensMountStatus()).contains("electriczoom");
if (canZoom)
{
try
minimumLength = camera.getMinimumFocalLength();
maximumLength = camera.getMaximumFocalLength();
currentLength = camera.getActualFocalLength();
+ Log.v(TAG, "OPTICAL ZOOM RANGE : " + minimumLength + " - " + maximumLength + " (" + currentLength + ")");
}
catch (Exception e)
{
@Override
public void driveZoomLens(int direction)
{
- float mag = Math.abs(direction);
+ float mag = Math.abs(direction) * 1.5f;
driveZoomLens((direction < 0) ? (currentLength * (0.88f / mag)) : (currentLength * 1.15f * mag));
}
return ((camera != null)&&(camera.isDrivingZoomLens()));
}
+
+ /**
+ * 現在のデジタルズーム倍率を応答する
+ *
+ * @return 現在のデジタルズーム倍率
+ */
+ @Override
+ public float getCurrentDigitalZoomScale()
+ {
+ return (currentDigitalScale);
+ }
+
+ /**
+ * デジタルズームを実行する
+ *
+ * @param scale ズーム倍率
+ */
+ @Override
+ public void changeDigitalZoomScale(float scale, boolean isCyclic)
+ {
+ float zoomScale = scale;
+ try
+ {
+ if (zoomScale <= minimumDigitalScale)
+ {
+ zoomScale = (isCyclic) ? maximumDigitalScale : minimumDigitalScale;
+ }
+ if (zoomScale >= maximumDigitalScale)
+ {
+ zoomScale = (isCyclic) ? minimumDigitalScale : maximumDigitalScale;
+ }
+ camera.changeDigitalZoomScale(zoomScale);
+ currentDigitalScale = zoomScale;
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
}
}
break;
+ case FEATURE_DIGITAL_ZOOM_RESET:
+ // デジタルズームのリセット
+ resetDigitalZoom();
+ break;
+
+ case FEATURE_DIGITAL_ZOOM_CHANGE:
+ // デジタルズームの設定 (繰り返し)
+ if (!driveDigitalZoom(0))
+ {
+ duration =IShowInformation.VIBRATE_PATTERN_NONE;
+ }
+ break;
+ case FEATURE_DIGITAL_ZOOMIN:
+ // デジタルズーム ズームイン
+ if (!driveDigitalZoom(1))
+ {
+ duration =IShowInformation.VIBRATE_PATTERN_NONE;
+ }
+ break;
+
+ case FEATURE_DIGITAL_ZOOMOUT:
+ // デジタルズーム ズームアウト
+ if (!driveDigitalZoom(-1))
+ {
+ duration =IShowInformation.VIBRATE_PATTERN_NONE;
+ }
+ break;
+
default:
// 上記以外...なにもしない
duration =IShowInformation.VIBRATE_PATTERN_NONE;
return (isExecute);
}
+ private void resetDigitalZoom()
+ {
+ IZoomLensHolder zoom = camera.getZoomLensHolder();
+ if (zoom != null)
+ {
+ zoom.updateStatus();
+ zoom.changeDigitalZoomScale(1.0f, false);
+ }
+ }
+
+ private boolean driveDigitalZoom(int zoomType)
+ {
+ boolean isExecute = false;
+ IZoomLensHolder zoom = camera.getZoomLensHolder();
+ if (zoom != null)
+ {
+ zoom.updateStatus();
+
+ float magnify = zoomType;
+ if (zoomType == 0)
+ {
+ magnify = 1.0f;
+ }
+
+ float currentScale = zoom.getCurrentDigitalZoomScale();
+ float targetScale = currentScale + magnify * 0.5f;
+ zoom.changeDigitalZoomScale(targetScale, (zoomType == 0));
+ isExecute = true;
+ }
+ return (isExecute);
+ }
+
/**
* 設定画面を開く
*