OSDN Git Service

撮影モードがiAuto時に、パワーズームのズームイン・ズームアウトを実行できるようにした。
authorMRSa <mrsa@myad.jp>
Sat, 12 Aug 2017 14:34:56 +0000 (23:34 +0900)
committerMRSa <mrsa@myad.jp>
Sat, 12 Aug 2017 14:34:56 +0000 (23:34 +0900)
wear/src/main/java/jp/sfjp/gokigen/a01c/liveview/button/PushedButton2.java
wear/src/main/java/jp/sfjp/gokigen/a01c/liveview/button/PushedButton3.java
wear/src/main/java/jp/sfjp/gokigen/a01c/olycamerawrapper/IOlyCameraCoordinator.java
wear/src/main/java/jp/sfjp/gokigen/a01c/olycamerawrapper/IZoomLensHolder.java [new file with mode: 0644]
wear/src/main/java/jp/sfjp/gokigen/a01c/olycamerawrapper/OlyCameraCoordinator.java
wear/src/main/java/jp/sfjp/gokigen/a01c/olycamerawrapper/ZoomLensHolder.java [new file with mode: 0644]
wear/src/main/java/jp/sfjp/gokigen/a01c/olycamerawrapper/dispatcher/FeatureDispatcher.java
wear/src/main/java/jp/sfjp/gokigen/a01c/olycamerawrapper/dispatcher/ICameraFeatureDispatcher.java
wear/src/main/java/jp/sfjp/gokigen/a01c/olycamerawrapper/indicator/CameraStatusDisplay.java

index f10a014..b769a0f 100644 (file)
@@ -58,6 +58,7 @@ class PushedButton2 implements IPushedButton
 
             case "iAuto":
                 preference_action_id = preference_action_id + ICameraFeatureDispatcher.MODE_IAUTO;
+                defaultAction = (isLongClick) ?  ICameraFeatureDispatcher.FEATURE_LENS_ZOOMOUT_2X : ICameraFeatureDispatcher.FEATURE_LENS_ZOOMOUT;
                 break;
 
             case "Movie":
index dabeb1a..2639104 100644 (file)
@@ -55,6 +55,7 @@ class PushedButton3 implements IPushedButton
 
             case "iAuto":
                 preference_action_id = preference_action_id + ICameraFeatureDispatcher.MODE_IAUTO;
+                defaultAction = (isLongClick) ? ICameraFeatureDispatcher.FEATURE_LENS_ZOOMIN_2X : ICameraFeatureDispatcher.FEATURE_LENS_ZOOMIN;
                 break;
 
             case "Movie":
index e47db18..0b3011a 100644 (file)
@@ -72,6 +72,9 @@ public interface IOlyCameraCoordinator
 
     IOlyCameraConnection getConnectionInterface();
 
+    /** ズームレンズの状態ホルダを応答 **/
+    IZoomLensHolder getZoomLensHolder();
+
     // デジタル水準器のホルダーを取得する
     ILevelGauge getLevelGauge();
 }
diff --git a/wear/src/main/java/jp/sfjp/gokigen/a01c/olycamerawrapper/IZoomLensHolder.java b/wear/src/main/java/jp/sfjp/gokigen/a01c/olycamerawrapper/IZoomLensHolder.java
new file mode 100644 (file)
index 0000000..4f0d303
--- /dev/null
@@ -0,0 +1,19 @@
+package jp.sfjp.gokigen.a01c.olycamerawrapper;
+
+/**
+ *  ズームレンズの状態
+ *
+ */
+
+public interface IZoomLensHolder
+{
+    boolean canZoom();
+    void updateStatus();
+    float getMaximumFocalLength();
+    float getMinimumFocalLength();
+    float getCurrentFocalLength();
+    void driveZoomLens(float targetLength);
+    void driveZoomLens(int direction);
+    boolean isDrivingZoomLens();
+
+}
index 7fb0440..7d2a35f 100644 (file)
@@ -62,6 +62,7 @@ public class OlyCameraCoordinator implements IOlyCameraCoordinator, IIndicatorCo
     private final OlyCameraConnection cameraConnection;
     private final ICameraStatusDisplay cameraStatusDisplay;
     private final LevelMeterHolder levelMeter;
+    private final ZoomLensHolder zoomLensHolder;
 
     private boolean isManualFocus = false;
     private boolean isAutoFocusLocked = false;
@@ -96,6 +97,7 @@ public class OlyCameraCoordinator implements IOlyCameraCoordinator, IIndicatorCo
         camera.setRecordingListener(new CameraRecordingListenerImpl(context, showInformation));
         loadSaveCameraProperties = new LoadSaveCameraProperties(context, propertyProxy, this);
         loadSaveOperations = new CameraPropertyLoadSaveOperations(context, loadSaveCameraProperties, cameraStatusDisplay);
+        zoomLensHolder = new ZoomLensHolder(camera);
     }
 
     /**
@@ -441,6 +443,12 @@ public class OlyCameraCoordinator implements IOlyCameraCoordinator, IIndicatorCo
     }
 
     @Override
+    public IZoomLensHolder getZoomLensHolder()
+    {
+        return (zoomLensHolder);
+    }
+
+    @Override
     public ILevelGauge getLevelGauge()
     {
         return (levelMeter);
diff --git a/wear/src/main/java/jp/sfjp/gokigen/a01c/olycamerawrapper/ZoomLensHolder.java b/wear/src/main/java/jp/sfjp/gokigen/a01c/olycamerawrapper/ZoomLensHolder.java
new file mode 100644 (file)
index 0000000..c7ac82b
--- /dev/null
@@ -0,0 +1,143 @@
+package jp.sfjp.gokigen.a01c.olycamerawrapper;
+
+import android.util.Log;
+
+import jp.co.olympus.camerakit.OLYCamera;
+
+/**
+ *   ズームレンズの情報を保持する
+ *
+ */
+class ZoomLensHolder implements IZoomLensHolder
+{
+    private final String TAG = toString();
+    private boolean canZoom = false;
+    private float minimumLength = 0.0f;
+    private float maximumLength = 0.0f;
+    private float currentLength = 0.0f;
+    private final OLYCamera camera;
+
+    ZoomLensHolder(OLYCamera camera)
+    {
+        this.camera = camera;
+        //initialize();
+    }
+
+    private void initialize()
+    {
+        canZoom = false;
+        try
+        {
+            canZoom = ((camera != null) && (camera.getLensMountStatus()).contains("electriczoom"));
+            if (canZoom)
+            {
+                try
+                {
+                    minimumLength = camera.getMinimumFocalLength();
+                    maximumLength = camera.getMaximumFocalLength();
+                    currentLength = camera.getActualFocalLength();
+                }
+                catch (Exception e)
+                {
+                    e.printStackTrace();
+                }
+            }
+        }
+        catch (Exception ee)
+        {
+            ee.printStackTrace();
+        }
+    }
+
+    @Override
+    public boolean canZoom()
+    {
+        return (canZoom);
+    }
+
+    @Override
+    public void updateStatus()
+    {
+        initialize();
+    }
+
+    @Override
+    public float getMaximumFocalLength()
+    {
+        return (maximumLength);
+    }
+
+    @Override
+    public float getMinimumFocalLength()
+    {
+        return (minimumLength);
+    }
+
+    @Override
+    public float getCurrentFocalLength()
+    {
+        return (currentLength);
+    }
+
+    /**
+     * ズームレンズを動作させる
+     *
+     * @param targetLength  焦点距離
+     */
+    @Override
+    public void driveZoomLens(float targetLength)
+    {
+        try
+        {
+            // レンズがサポートする焦点距離と、現在の焦点距離を取得する
+            float targetFocalLength = targetLength;
+
+            // 焦点距離が最大値・最小値を超えないようにする
+            if (targetFocalLength > maximumLength)
+            {
+                targetFocalLength = maximumLength;
+            }
+            if (targetFocalLength < minimumLength)
+            {
+                targetFocalLength = minimumLength;
+            }
+
+            // レンズのスーム操作
+            Log.v(TAG, "ZOOM from " + currentLength + "mm to " + targetFocalLength + "mm");
+
+            // ズーム動作中でない時には、レンズをズームさせる
+            if (!camera.isDrivingZoomLens())
+            {
+                camera.startDrivingZoomLensToFocalLength(targetFocalLength);
+            }
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * ズームレンズを動作させる
+     *
+     * @param direction  (方向)
+     */
+    @Override
+    public void driveZoomLens(int direction)
+    {
+        float mag = Math.abs(direction);
+        driveZoomLens((direction < 0) ? (currentLength * (0.88f / mag)) : (currentLength * 1.15f * mag));
+    }
+
+    /**
+     * 現在ズーム中か確認する
+     *
+     * @return true : ズーム中  / false : ズーム中でない
+     */
+    @Override
+    public boolean isDrivingZoomLens()
+    {
+        return  ((camera != null)&&(camera.isDrivingZoomLens()));
+    }
+
+}
index a1d4001..2429f3b 100644 (file)
@@ -7,6 +7,7 @@ import jp.sfjp.gokigen.a01c.IShowInformation;
 import jp.sfjp.gokigen.a01c.R;
 import jp.sfjp.gokigen.a01c.liveview.ILiveImageStatusNotify;
 import jp.sfjp.gokigen.a01c.olycamerawrapper.IOlyCameraCoordinator;
+import jp.sfjp.gokigen.a01c.olycamerawrapper.IZoomLensHolder;
 import jp.sfjp.gokigen.a01c.olycamerawrapper.property.IOlyCameraProperty;
 import jp.sfjp.gokigen.a01c.olycamerawrapper.property.IOlyCameraPropertyProvider;
 import jp.sfjp.gokigen.a01c.olycamerawrapper.takepicture.IBracketingShotStyle;
@@ -239,6 +240,38 @@ public class FeatureDispatcher implements ICameraFeatureDispatcher
                 showFavoriteDialog();
                 break;
 
+            case FEATURE_LENS_ZOOMIN:
+                // ズームイン(パワーズームレンズ装着時)
+                if (!driveZoomLens(1))
+                {
+                    duration =IShowInformation.VIBRATE_PATTERN_NONE;
+                }
+                break;
+
+            case FEATURE_LENS_ZOOMOUT:
+                // ズームアウト(パワーズームレンズ装着時)
+                if (!driveZoomLens(-1))
+                {
+                    duration =IShowInformation.VIBRATE_PATTERN_NONE;
+                }
+                break;
+
+            case FEATURE_LENS_ZOOMIN_2X:
+                // ズームイン(パワーズームレンズ装着時)
+                if (!driveZoomLens(2))
+                {
+                    duration =IShowInformation.VIBRATE_PATTERN_NONE;
+                }
+                break;
+
+            case FEATURE_LENS_ZOOMOUT_2X:
+                // ズームアウト(パワーズームレンズ装着時)
+                if (!driveZoomLens(-2))
+                {
+                    duration =IShowInformation.VIBRATE_PATTERN_NONE;
+                }
+                break;
+
             default:
                 // 上記以外...なにもしない
                 duration =IShowInformation.VIBRATE_PATTERN_NONE;
@@ -739,6 +772,36 @@ public class FeatureDispatcher implements ICameraFeatureDispatcher
     }
 
     /**
+     *    ズームイン・ズームアウト操作を行う
+     *
+     * @param direction ズーム操作の方向
+     *
+     */
+    private boolean driveZoomLens(int direction)
+    {
+        boolean isExecute = false;
+        IZoomLensHolder zoom = camera.getZoomLensHolder();
+        if (zoom != null)
+        {
+            zoom.updateStatus();
+            if (zoom.canZoom())
+            {
+                // ズーム操作を行う
+                try
+                {
+                    zoom.driveZoomLens(direction);
+                    isExecute = true;
+                }
+                catch (Exception e)
+                {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return (isExecute);
+    }
+
+    /**
      *   設定画面を開く
      *
      */
index 2e8ad4b..ab632b4 100644 (file)
@@ -100,6 +100,10 @@ public interface ICameraFeatureDispatcher
     int FEATURE_SHOT_BRACKET_ART_FILTER = 42;
     int FEATURE_SHOT_BRACKET_ISO = 43;
     int FEATURE_SHOW_FAVORITE_DIALOG = 44;
+    int FEATURE_LENS_ZOOMIN = 45;
+    int FEATURE_LENS_ZOOMOUT = 46;
+    int FEATURE_LENS_ZOOMIN_2X = 47;
+    int FEATURE_LENS_ZOOMOUT_2X = 48;
 
     // エリアタッチ時の機能(featureNumber)
     int FEATURE_AREA_ACTION_NONE = 100;
index 954cbee..64a473c 100644 (file)
@@ -472,18 +472,21 @@ public class CameraStatusDisplay implements  ICameraStatusDisplay
      */
     private void updateButtonIcon(String takeMode)
     {
-        int btnResId;
-        if (takeMode.equals("Movie"))
+        if (takeMode != null)
         {
-            btnResId = R.drawable.btn_videocam;
-        }
-        else
-        {
-            btnResId = R.drawable.btn_ic_camera_alt;
-        }
-        if (shutterButtonId != 0)
-        {
-            informationObject.setButtonDrawable(shutterButtonId, btnResId);
+            int btnResId;
+            if (takeMode.equals("Movie"))
+            {
+                btnResId = R.drawable.btn_videocam;
+            }
+            else
+            {
+                btnResId = R.drawable.btn_ic_camera_alt;
+            }
+            if (shutterButtonId != 0)
+            {
+                informationObject.setButtonDrawable(shutterButtonId, btnResId);
+            }
         }
     }