From: MRSa Date: Sun, 7 Jun 2020 11:52:56 +0000 (+0900) Subject: ライブビュー画像の遅延表示機能を追加した。 X-Git-Url: http://git.sourceforge.jp/view?a=commitdiff_plain;ds=sidebyside;h=ddf6cf876ab5dfef258aa3abb7f9f1fa89825ea3;p=gokigen%2FA01d.git ライブビュー画像の遅延表示機能を追加した。 --- diff --git a/app/src/main/java/net/osdn/gokigen/a01d/camera/fujix/wrapper/command/FujiXCommandPublisher.java b/app/src/main/java/net/osdn/gokigen/a01d/camera/fujix/wrapper/command/FujiXCommandPublisher.java index 2428ac8..ec6ff01 100644 --- a/app/src/main/java/net/osdn/gokigen/a01d/camera/fujix/wrapper/command/FujiXCommandPublisher.java +++ b/app/src/main/java/net/osdn/gokigen/a01d/camera/fujix/wrapper/command/FujiXCommandPublisher.java @@ -69,7 +69,10 @@ public class FujiXCommandPublisher implements IFujiXCommandPublisher, IFujiXComm // ストリームを全部閉じる try { - dos.close(); + if (dos != null) + { + dos.close(); + } } catch (Exception e) { @@ -79,7 +82,10 @@ public class FujiXCommandPublisher implements IFujiXCommandPublisher, IFujiXComm try { - bufferedReader.close(); + if (bufferedReader != null) + { + bufferedReader.close(); + } } catch (Exception e) { @@ -89,7 +95,10 @@ public class FujiXCommandPublisher implements IFujiXCommandPublisher, IFujiXComm try { - socket.close(); + if (socket != null) + { + socket.close(); + } } catch (Exception e) { @@ -215,6 +224,13 @@ public class FujiXCommandPublisher implements IFujiXCommandPublisher, IFujiXComm { try { + if (socket == null) + { + Log.v(TAG, "SEND: SOCKET NULL "); + dump_bytes("MSG[" + byte_array.length + "] ", byte_array); + return; + } + dos = new DataOutputStream(socket.getOutputStream()); // メッセージボディを加工: 最初に4バイトのレングス長をつける @@ -277,6 +293,11 @@ public class FujiXCommandPublisher implements IFujiXCommandPublisher, IFujiXComm { sleep(delayMs); byte[] byte_array = new byte[BUFFER_SIZE]; + if (socket == null) + { + Log.v(TAG, " RECV: SOCKET NULL (ID: " + id + ")"); + return; + } InputStream is = socket.getInputStream(); if (is != null) { diff --git a/app/src/main/java/net/osdn/gokigen/a01d/liveview/CameraLiveImageView.java b/app/src/main/java/net/osdn/gokigen/a01d/liveview/CameraLiveImageView.java index 2bab4e1..6e68192 100644 --- a/app/src/main/java/net/osdn/gokigen/a01d/liveview/CameraLiveImageView.java +++ b/app/src/main/java/net/osdn/gokigen/a01d/liveview/CameraLiveImageView.java @@ -34,12 +34,16 @@ import net.osdn.gokigen.a01d.preference.IPreferencePropertyAccessor; import java.io.File; import java.io.FileOutputStream; +import java.util.ArrayList; import java.util.Map; import java.util.Timer; import java.util.TimerTask; import androidx.exifinterface.media.ExifInterface; +import static net.osdn.gokigen.a01d.liveview.message.IMessageDrawer.MessageArea.LOWRIGHT; +import static net.osdn.gokigen.a01d.liveview.message.IMessageDrawer.SIZE_STD; + /** * CameraLiveImageView : * (OLYMPUS の ImageCaptureSample そのまま) @@ -51,6 +55,7 @@ public class CameraLiveImageView extends View implements IImageDataReceiver, IAu private static final String EXIF_ORIENTATION = "Orientation"; + private Context context = null; private boolean focusAssistFeature = false; private boolean showGridFeature = false; private ImageView.ScaleType imageScaleType; @@ -64,12 +69,16 @@ public class CameraLiveImageView extends View implements IImageDataReceiver, IAu private IGridFrameDrawer gridFrameDrawer = null; private IPreviewImageConverter bitmapConverter = null; private IMessageHolder messageHolder; + private IMessageDrawer messageDrawer; private IStoreImage storeImage = null; private IFocusLockIndicator focusLockIndicator = null; private FileOutputStream outputStream = null; private static final int LIMIT_SAVE_COUNT = 0; // 0なら、ダミーファイルを作らない - private int saveCount = 10; // LIMIT_SAVE_COUNTより大きければダミーファイルに書かない + private int saveCount = 10; // LIMIT_SAVE_COUNTより大きければダミーファイルに書かない + + private int maxCachePics = 500; + private ArrayList cachePics = null; public CameraLiveImageView(Context context) { @@ -93,18 +102,25 @@ public class CameraLiveImageView extends View implements IImageDataReceiver, IAu { prepareFile(); storeImage = new StoreImage(context); - messageHolder = new ShowMessageHolder(); + ShowMessageHolder messageHolder = new ShowMessageHolder(); + this.messageHolder = messageHolder; + messageDrawer = messageHolder; imageScaleType = ImageView.ScaleType.FIT_CENTER; - SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); + this.context = context; // Gridの表示/非表示 int framingGridStatus = 0; gridFrameDrawer = GridFrameFactory.getGridFrameDrawer(framingGridStatus); + + SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); showGridFeature = preferences.getBoolean(IPreferencePropertyAccessor.SHOW_GRID_STATUS, false); int converterType = 0; bitmapConverter = ImageConvertFactory.getImageConverter(converterType); + // liveview画面の表示遅延 + setupLiveviewCache(); + // ダミーのビットマップデータ読み込み...画面表示のテスト用ロジック try { @@ -117,6 +133,40 @@ public class CameraLiveImageView extends View implements IImageDataReceiver, IAu } } + /** + * ライブビュー表示の遅延機能を有効にするかどうか。 + * + */ + private void setupLiveviewCache() + { + try + { + SharedPreferences preference = androidx.preference.PreferenceManager.getDefaultSharedPreferences(context); + if (preference != null) + { + if (preference.getBoolean(IPreferencePropertyAccessor.CACHE_LIVEVIEW_PICTURES, false)) + { + // 画像のキャッシュをする場合に new する + cachePics = new ArrayList<>(); + String nofCachePics = preference.getString(IPreferencePropertyAccessor.NUMBER_OF_CACHE_PICTURES, IPreferencePropertyAccessor.NUMBER_OF_CACHE_PICTURES_DEFAULT_VALUE); + maxCachePics = Integer.parseInt(nofCachePics); + } + else + { + // cache 機能を無効化する。 + cachePics = null; + System.gc(); + } + } + } + catch (Exception e) + { + e.printStackTrace(); + maxCachePics = 500; + } + } + + @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); @@ -188,19 +238,59 @@ public class CameraLiveImageView extends View implements IImageDataReceiver, IAu * Sets a image to view. * (OlympusCameraLiveViewListenerImpl.IImageDataReceiver の実装) * - * @param data A image of live-view. - * @param metadata A metadata of the image. + * @param receivedData A image of live-view. + * @param metadata A metadata of the image. */ - public void setImageData(byte[] data, Map metadata) + public void setImageData(byte[] receivedData, Map metadata) { Bitmap bitmap; int rotationDegrees; - if (data != null) + if (receivedData != null) { // Create a bitmap. try { + byte[] data = receivedData; + if (cachePics != null) + { + boolean cacheIsFull = false; + try + { + cachePics.add(receivedData); + if (cachePics.size() > maxCachePics) + { + cacheIsFull = true; + } + } + catch (Exception e) + { + e.printStackTrace(); + cacheIsFull = true; + } + messageDrawer.setMessageToShow(LOWRIGHT, Color.LTGRAY, SIZE_STD, "CACHE : " + (cachePics.size() - 1) + " / " + maxCachePics); + if (cacheIsFull) + { + try + { + // リストから一つ取り除く + int index = 0; // cachePics.size() - 1; + data = cachePics.get(index); + cachePics.remove(index); + } + catch (Exception e) + { + e.printStackTrace(); + } + } + else + { + // キャッシュがたまっていない場合は、カウントだけ上げる + refreshCanvas(); + return; + } + } + //ByteArrayInputStream bais = new ByteArrayInputStream(data); //bitmap = BitmapFactory.decodeStream(bais); //bais.close(); @@ -659,12 +749,12 @@ public class CameraLiveImageView extends View implements IImageDataReceiver, IAu } // 画面下部右側に表示する - message = messageHolder.getMessage(ShowMessageHolder.MessageArea.LOWRIGHT); + message = messageHolder.getMessage(LOWRIGHT); if ((message != null)&&(message.length() > 0)) { Paint paint = new Paint(); - paint.setColor(messageHolder.getColor(ShowMessageHolder.MessageArea.LOWRIGHT)); - paint.setTextSize(messageHolder.getSize(ShowMessageHolder.MessageArea.LOWRIGHT)); + paint.setColor(messageHolder.getColor(LOWRIGHT)); + paint.setTextSize(messageHolder.getSize(LOWRIGHT)); paint.setAntiAlias(true); float width = paint.measureText(message); Paint.FontMetrics fontMetrics = paint.getFontMetrics(); diff --git a/app/src/main/java/net/osdn/gokigen/a01d/preference/IPreferencePropertyAccessor.java b/app/src/main/java/net/osdn/gokigen/a01d/preference/IPreferencePropertyAccessor.java index 0084d99..423c200 100644 --- a/app/src/main/java/net/osdn/gokigen/a01d/preference/IPreferencePropertyAccessor.java +++ b/app/src/main/java/net/osdn/gokigen/a01d/preference/IPreferencePropertyAccessor.java @@ -93,6 +93,10 @@ public interface IPreferencePropertyAccessor String PREFERENCE_CANON_SETTINGS = "canon_settings"; String PREFERENCE_NIKON_SETTINGS = "nikon_settings"; + String CACHE_LIVEVIEW_PICTURES = "cache_liveview_pictures"; + String NUMBER_OF_CACHE_PICTURES = "number_of_cache_pictures"; + String NUMBER_OF_CACHE_PICTURES_DEFAULT_VALUE = "500"; + /* int CHOICE_SPLASH_SCREEN = 10; diff --git a/app/src/main/java/net/osdn/gokigen/a01d/preference/summary/PreferenceFragmentSummary.java b/app/src/main/java/net/osdn/gokigen/a01d/preference/summary/PreferenceFragmentSummary.java index 21cbd2e..e1f696d 100644 --- a/app/src/main/java/net/osdn/gokigen/a01d/preference/summary/PreferenceFragmentSummary.java +++ b/app/src/main/java/net/osdn/gokigen/a01d/preference/summary/PreferenceFragmentSummary.java @@ -137,6 +137,14 @@ public class PreferenceFragmentSummary extends PreferenceFragmentCompat implemen { editor.putString(IPreferencePropertyAccessor.CONNECTION_METHOD, IPreferencePropertyAccessor.CONNECTION_METHOD_DEFAULT_VALUE); } + if (!items.containsKey(IPreferencePropertyAccessor.CACHE_LIVEVIEW_PICTURES)) + { + editor.putBoolean(IPreferencePropertyAccessor.CACHE_LIVEVIEW_PICTURES, false); + } + if (!items.containsKey(IPreferencePropertyAccessor.NUMBER_OF_CACHE_PICTURES)) + { + editor.putString(IPreferencePropertyAccessor.NUMBER_OF_CACHE_PICTURES, IPreferencePropertyAccessor.NUMBER_OF_CACHE_PICTURES_DEFAULT_VALUE); + } editor.apply(); } catch (Exception e) @@ -168,6 +176,11 @@ public class PreferenceFragmentSummary extends PreferenceFragmentCompat implemen Log.v(TAG, " " + key + " , " + value); break; + case IPreferencePropertyAccessor.CACHE_LIVEVIEW_PICTURES: + value = preferences.getBoolean(key, true); + Log.v(TAG, " " + key + " , " + value); + break; + default: String strValue = preferences.getString(key, ""); setListPreference(key, key, strValue); @@ -386,6 +399,7 @@ public class PreferenceFragmentSummary extends PreferenceFragmentCompat implemen // Preferenceの画面に反映させる setBooleanPreference(IPreferencePropertyAccessor.AUTO_CONNECT_TO_CAMERA, IPreferencePropertyAccessor.AUTO_CONNECT_TO_CAMERA, defaultValue); setBooleanPreference(IPreferencePropertyAccessor.CAPTURE_BOTH_CAMERA_AND_LIVE_VIEW, IPreferencePropertyAccessor.CAPTURE_BOTH_CAMERA_AND_LIVE_VIEW, defaultValue); + setBooleanPreference(IPreferencePropertyAccessor.CACHE_LIVEVIEW_PICTURES, IPreferencePropertyAccessor.CACHE_LIVEVIEW_PICTURES, false); } catch (Exception e) { diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 2d90372..2f25026 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -294,4 +294,9 @@ アプリ終了 + ライブビュー画像の表示を遅延 + ライブビュー画像を溜めて表示します。(再起動後に有効) + ライブビュー画像の遅延最大数 + ライブビューを遅らせる画像の最大枚数を指定します。(初期値:500、再起動後に有効) + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 21d2854..393f5a0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -299,4 +299,9 @@ Exit Application + Delay liveview picture + This switch effects after restart. + Max number of cache pictures + Set number of cache pictures. (Default:500, enables after restart.) + diff --git a/app/src/main/res/xml/preferences_summary.xml b/app/src/main/res/xml/preferences_summary.xml index f615ba4..3962fe9 100644 --- a/app/src/main/res/xml/preferences_summary.xml +++ b/app/src/main/res/xml/preferences_summary.xml @@ -29,6 +29,19 @@ android:key="capture_both_camera_and_live_view" android:title="@string/pref_capture_both_camera_and_live_view" /> + + + +