OSDN Git Service

iAutoモード時に、デジタルズームを実装。
authorMRSa <mrsa@myad.jp>
Sun, 13 Aug 2017 14:32:31 +0000 (23:32 +0900)
committerMRSa <mrsa@myad.jp>
Sun, 13 Aug 2017 14:32:31 +0000 (23:32 +0900)
wear/src/main/java/jp/sfjp/gokigen/a01c/liveview/button/PushedButton4.java
wear/src/main/java/jp/sfjp/gokigen/a01c/liveview/button/PushedButton5.java
wear/src/main/java/jp/sfjp/gokigen/a01c/olycamerawrapper/IZoomLensHolder.java
wear/src/main/java/jp/sfjp/gokigen/a01c/olycamerawrapper/ZoomLensHolder.java
wear/src/main/java/jp/sfjp/gokigen/a01c/olycamerawrapper/dispatcher/FeatureDispatcher.java
wear/src/main/java/jp/sfjp/gokigen/a01c/olycamerawrapper/dispatcher/ICameraFeatureDispatcher.java

index 878e18b..0c7534a 100644 (file)
@@ -57,7 +57,7 @@ class PushedButton4 implements IPushedButton
 
             case "iAuto":
                 preference_action_id = preference_action_id + ICameraFeatureDispatcher.MODE_IAUTO;
-                defaultAction = ICameraFeatureDispatcher.FEATURE_ACTION_NONE;
+                defaultAction =  (isLongClick) ? ICameraFeatureDispatcher.FEATURE_DIGITAL_ZOOM_RESET : ICameraFeatureDispatcher.FEATURE_DIGITAL_ZOOMOUT;
                 break;
 
             case "Movie":
index 91c9b16..4a83aaa 100644 (file)
@@ -57,7 +57,7 @@ class PushedButton5 implements IPushedButton
 
             case "iAuto":
                 preference_action_id = preference_action_id + ICameraFeatureDispatcher.MODE_IAUTO;
-                defaultAction = ICameraFeatureDispatcher.FEATURE_ACTION_NONE;
+                defaultAction =  (isLongClick) ? ICameraFeatureDispatcher.FEATURE_DIGITAL_ZOOM_CHANGE : ICameraFeatureDispatcher.FEATURE_DIGITAL_ZOOMIN;
                 break;
 
             case "Movie":
index 4f0d303..2e62f5c 100644 (file)
@@ -15,5 +15,6 @@ public interface IZoomLensHolder
     void driveZoomLens(float targetLength);
     void driveZoomLens(int direction);
     boolean isDrivingZoomLens();
-
+    float getCurrentDigitalZoomScale();
+    void changeDigitalZoomScale(float scale, boolean isCyclic);
 }
index c7ac82b..f009a31 100644 (file)
@@ -2,6 +2,8 @@ package jp.sfjp.gokigen.a01c.olycamerawrapper;
 
 import android.util.Log;
 
+import java.util.Map;
+
 import jp.co.olympus.camerakit.OLYCamera;
 
 /**
@@ -15,6 +17,9 @@ class ZoomLensHolder implements IZoomLensHolder
     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)
@@ -28,7 +33,19 @@ class ZoomLensHolder implements IZoomLensHolder
         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
@@ -36,6 +53,7 @@ class ZoomLensHolder implements IZoomLensHolder
                     minimumLength = camera.getMinimumFocalLength();
                     maximumLength = camera.getMaximumFocalLength();
                     currentLength = camera.getActualFocalLength();
+                    Log.v(TAG, "OPTICAL ZOOM RANGE : " + minimumLength + " - " + maximumLength + " (" + currentLength + ")");
                 }
                 catch (Exception e)
                 {
@@ -125,7 +143,7 @@ class ZoomLensHolder implements IZoomLensHolder
     @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));
     }
 
@@ -140,4 +158,43 @@ class ZoomLensHolder implements IZoomLensHolder
         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();
+        }
+    }
 }
index 2429f3b..e002387 100644 (file)
@@ -272,6 +272,34 @@ public class FeatureDispatcher implements ICameraFeatureDispatcher
                 }
                 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;
@@ -801,6 +829,38 @@ public class FeatureDispatcher implements ICameraFeatureDispatcher
         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);
+    }
+
     /**
      *   設定画面を開く
      *
index ab632b4..9a02838 100644 (file)
@@ -104,6 +104,11 @@ public interface ICameraFeatureDispatcher
     int FEATURE_LENS_ZOOMOUT = 46;
     int FEATURE_LENS_ZOOMIN_2X = 47;
     int FEATURE_LENS_ZOOMOUT_2X = 48;
+    int FEATURE_DIGITAL_ZOOM_RESET = 49;
+    int FEATURE_DIGITAL_ZOOM_CHANGE = 50;
+    int FEATURE_DIGITAL_ZOOMIN = 51;
+    int FEATURE_DIGITAL_ZOOMOUT = 52;
+
 
     // エリアタッチ時の機能(featureNumber)
     int FEATURE_AREA_ACTION_NONE = 100;