From: MRSa Date: Sat, 12 Aug 2017 14:34:56 +0000 (+0900) Subject: 撮影モードがiAuto時に、パワーズームのズームイン・ズームアウトを実行できるようにした。 X-Git-Tag: V130~14 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=4764ecde8eea4278721bc6bd734ade0828031afb;hp=ad59ac04d973cb125f3376bcf1d778c7b091fee4;p=gokigen%2FA01c.git 撮影モードがiAuto時に、パワーズームのズームイン・ズームアウトを実行できるようにした。 --- diff --git a/wear/src/main/java/jp/sfjp/gokigen/a01c/liveview/button/PushedButton2.java b/wear/src/main/java/jp/sfjp/gokigen/a01c/liveview/button/PushedButton2.java index f10a014..b769a0f 100644 --- a/wear/src/main/java/jp/sfjp/gokigen/a01c/liveview/button/PushedButton2.java +++ b/wear/src/main/java/jp/sfjp/gokigen/a01c/liveview/button/PushedButton2.java @@ -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": diff --git a/wear/src/main/java/jp/sfjp/gokigen/a01c/liveview/button/PushedButton3.java b/wear/src/main/java/jp/sfjp/gokigen/a01c/liveview/button/PushedButton3.java index dabeb1a..2639104 100644 --- a/wear/src/main/java/jp/sfjp/gokigen/a01c/liveview/button/PushedButton3.java +++ b/wear/src/main/java/jp/sfjp/gokigen/a01c/liveview/button/PushedButton3.java @@ -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": diff --git a/wear/src/main/java/jp/sfjp/gokigen/a01c/olycamerawrapper/IOlyCameraCoordinator.java b/wear/src/main/java/jp/sfjp/gokigen/a01c/olycamerawrapper/IOlyCameraCoordinator.java index e47db18..0b3011a 100644 --- a/wear/src/main/java/jp/sfjp/gokigen/a01c/olycamerawrapper/IOlyCameraCoordinator.java +++ b/wear/src/main/java/jp/sfjp/gokigen/a01c/olycamerawrapper/IOlyCameraCoordinator.java @@ -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 index 0000000..4f0d303 --- /dev/null +++ b/wear/src/main/java/jp/sfjp/gokigen/a01c/olycamerawrapper/IZoomLensHolder.java @@ -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(); + +} diff --git a/wear/src/main/java/jp/sfjp/gokigen/a01c/olycamerawrapper/OlyCameraCoordinator.java b/wear/src/main/java/jp/sfjp/gokigen/a01c/olycamerawrapper/OlyCameraCoordinator.java index 7fb0440..7d2a35f 100644 --- a/wear/src/main/java/jp/sfjp/gokigen/a01c/olycamerawrapper/OlyCameraCoordinator.java +++ b/wear/src/main/java/jp/sfjp/gokigen/a01c/olycamerawrapper/OlyCameraCoordinator.java @@ -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 index 0000000..c7ac82b --- /dev/null +++ b/wear/src/main/java/jp/sfjp/gokigen/a01c/olycamerawrapper/ZoomLensHolder.java @@ -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())); + } + +} diff --git a/wear/src/main/java/jp/sfjp/gokigen/a01c/olycamerawrapper/dispatcher/FeatureDispatcher.java b/wear/src/main/java/jp/sfjp/gokigen/a01c/olycamerawrapper/dispatcher/FeatureDispatcher.java index a1d4001..2429f3b 100644 --- a/wear/src/main/java/jp/sfjp/gokigen/a01c/olycamerawrapper/dispatcher/FeatureDispatcher.java +++ b/wear/src/main/java/jp/sfjp/gokigen/a01c/olycamerawrapper/dispatcher/FeatureDispatcher.java @@ -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); + } + + /** * 設定画面を開く * */ diff --git a/wear/src/main/java/jp/sfjp/gokigen/a01c/olycamerawrapper/dispatcher/ICameraFeatureDispatcher.java b/wear/src/main/java/jp/sfjp/gokigen/a01c/olycamerawrapper/dispatcher/ICameraFeatureDispatcher.java index 2e8ad4b..ab632b4 100644 --- a/wear/src/main/java/jp/sfjp/gokigen/a01c/olycamerawrapper/dispatcher/ICameraFeatureDispatcher.java +++ b/wear/src/main/java/jp/sfjp/gokigen/a01c/olycamerawrapper/dispatcher/ICameraFeatureDispatcher.java @@ -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; diff --git a/wear/src/main/java/jp/sfjp/gokigen/a01c/olycamerawrapper/indicator/CameraStatusDisplay.java b/wear/src/main/java/jp/sfjp/gokigen/a01c/olycamerawrapper/indicator/CameraStatusDisplay.java index 954cbee..64a473c 100644 --- a/wear/src/main/java/jp/sfjp/gokigen/a01c/olycamerawrapper/indicator/CameraStatusDisplay.java +++ b/wear/src/main/java/jp/sfjp/gokigen/a01c/olycamerawrapper/indicator/CameraStatusDisplay.java @@ -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); + } } }