OSDN Git Service

ステータス表示の準備
authorMRSa <mrsa@myad.jp>
Fri, 12 Feb 2021 15:05:16 +0000 (00:05 +0900)
committerMRSa <mrsa@myad.jp>
Fri, 12 Feb 2021 15:05:16 +0000 (00:05 +0900)
app/src/main/java/jp/osdn/gokigen/thetaview/liveview/CanvasView.kt [new file with mode: 0644]
app/src/main/java/jp/osdn/gokigen/thetaview/liveview/LiveImageViewFragment.kt
app/src/main/java/jp/osdn/gokigen/thetaview/preference/IPreferencePropertyAccessor.kt
app/src/main/java/jp/osdn/gokigen/thetaview/preference/MainPreferenceFragment.kt
app/src/main/java/jp/osdn/gokigen/thetaview/preference/PreferenceValueInitializer.kt
app/src/main/res/layout/glsurface_view.xml
app/src/main/res/values/strings.xml
app/src/main/res/xml/preference_main.xml

diff --git a/app/src/main/java/jp/osdn/gokigen/thetaview/liveview/CanvasView.kt b/app/src/main/java/jp/osdn/gokigen/thetaview/liveview/CanvasView.kt
new file mode 100644 (file)
index 0000000..8fda88a
--- /dev/null
@@ -0,0 +1,220 @@
+package jp.osdn.gokigen.thetaview.liveview
+
+import android.content.Context
+import android.graphics.Canvas
+import android.graphics.Color
+import android.graphics.Paint
+import android.graphics.RectF
+import android.os.Looper
+import android.util.AttributeSet
+import android.util.Log
+import android.view.View
+
+
+class CanvasView : View
+{
+    private var showCameraStatus = false
+
+
+    constructor(context: Context): super(context)
+    {
+        initComponent(context)
+    }
+
+    constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
+    {
+        initComponent(context)
+    }
+
+    constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int): super(context, attrs, defStyleAttr)
+    {
+        initComponent(context)
+    }
+
+    constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int): super(context, attrs, defStyleAttr, defStyleRes)
+    {
+        initComponent(context)
+    }
+
+    private fun initComponent(context: Context)
+    {
+        Log.v(TAG, "initComponent")
+
+
+    }
+
+    override fun onDraw(canvas: Canvas?)
+    {
+        super.onDraw(canvas)
+        if (canvas == null)
+        {
+            Log.v(TAG, " ===== onDraw : canvas is not ready. ==== ")
+            return
+        }
+        //Log.v(TAG, " ----- onDraw() ----- ")
+        //canvas.drawARGB(255, 0, 0, 0)
+
+        if (showCameraStatus)
+        {
+            drawInformationMessages(canvas)
+        }
+    }
+
+    fun refresh()
+    {
+        //Log.v(TAG, " refreshCanvas()")
+        if (Looper.getMainLooper().thread === Thread.currentThread())
+        {
+            invalidate()
+        }
+        else
+        {
+            postInvalidate()
+        }
+    }
+
+    /**
+     *   画面にメッセージを表示する
+     */
+    private fun drawInformationMessages(canvas: Canvas)
+    {
+        var message: String
+        val viewRect =  RectF(5.0f, 0.0f, canvas.width - 5.0f, canvas.height - 55.0f)
+
+        message = " HELLO "
+        val paint = Paint()
+        paint.color = Color.GREEN
+        paint.textSize = 16.0f
+        paint.isAntiAlias = true
+        paint.setShadowLayer(5.0f, 3.0f, 3.0f, Color.BLACK)
+        val fontMetrics = paint.fontMetrics
+        //val cx = canvas.width / 2.0f - paint.measureText(message) / 2.0f
+        //val cy = canvas.height / 2.0f - (fontMetrics.ascent + fontMetrics.descent) / 2.0f
+        val cx = 10.0f
+        val cy = 20.0f
+        canvas.drawText(message, cx, cy, paint)
+
+
+/*
+        // 画面の中心に表示する
+        message = messageHolder.getMessage(ShowMessageHolder.MessageArea.CENTER)
+        if (message != null && message.length > 0) {
+            val paint = Paint()
+            paint.color = messageHolder.getColor(ShowMessageHolder.MessageArea.CENTER)
+            paint.textSize = messageHolder.getSize(ShowMessageHolder.MessageArea.CENTER)
+            paint.isAntiAlias = true
+            val fontMetrics = paint.fontMetrics
+            val cx = canvas.width / 2.0f - paint.measureText(message) / 2.0f
+            val cy = canvas.height / 2.0f - (fontMetrics.ascent + fontMetrics.descent) / 2.0f
+            canvas.drawText(message, cx, cy, paint)
+        }
+
+        // 画面上部左側に表示する
+        message = messageHolder.getMessage(ShowMessageHolder.MessageArea.UPLEFT)
+        if (message != null && message.length > 0) {
+            val paintUp = Paint()
+            paintUp.color = messageHolder.getColor(ShowMessageHolder.MessageArea.UPLEFT)
+            paintUp.textSize = messageHolder.getSize(ShowMessageHolder.MessageArea.UPLEFT)
+            paintUp.isAntiAlias = true
+            val fontMetrics = paintUp.fontMetrics
+            canvas.drawText(message, viewRect.left + 3.0f, viewRect.top + (fontMetrics.descent - fontMetrics.ascent), paintUp)
+        }
+
+        // 画面上部右側に表示する
+        message = messageHolder.getMessage(ShowMessageHolder.MessageArea.UPRIGHT)
+        if (message != null && message.length > 0) {
+            val paintUp = Paint()
+            paintUp.color = messageHolder.getColor(ShowMessageHolder.MessageArea.UPRIGHT)
+            paintUp.textSize = messageHolder.getSize(ShowMessageHolder.MessageArea.UPRIGHT)
+            paintUp.isAntiAlias = true
+            val width = paintUp.measureText(message)
+            val fontMetrics = paintUp.fontMetrics
+            canvas.drawText(message, viewRect.right - 3.0f - width, viewRect.top + (fontMetrics.descent - fontMetrics.ascent), paintUp)
+        }
+
+        // 画面下部左側に表示する
+        message = messageHolder.getMessage(ShowMessageHolder.MessageArea.LOWLEFT)
+        if (message != null && message.length > 0) {
+            val paint = Paint()
+            paint.color = messageHolder.getColor(ShowMessageHolder.MessageArea.LOWLEFT)
+            paint.textSize = messageHolder.getSize(ShowMessageHolder.MessageArea.LOWLEFT)
+            paint.isAntiAlias = true
+            val fontMetrics = paint.fontMetrics
+            canvas.drawText(message, viewRect.left + 3.0f, viewRect.bottom - fontMetrics.bottom, paint)
+        }
+
+        // 画面下部右側に表示する
+        message = messageHolder.getMessage(LOWRIGHT)
+        if (message != null && message.length > 0) {
+            val paint = Paint()
+            paint.color = messageHolder.getColor(LOWRIGHT)
+            paint.textSize = messageHolder.getSize(LOWRIGHT)
+            paint.isAntiAlias = true
+            val width = paint.measureText(message)
+            val fontMetrics = paint.fontMetrics
+            canvas.drawText(message, viewRect.right - 3.0f - width, viewRect.bottom - fontMetrics.bottom, paint)
+        }
+
+        // 画面上部中央に表示する
+        message = messageHolder.getMessage(ShowMessageHolder.MessageArea.UPCENTER)
+        if (message != null && message.length > 0) {
+            val paintUp = Paint()
+            paintUp.color = messageHolder.getColor(ShowMessageHolder.MessageArea.UPCENTER)
+            paintUp.textSize = messageHolder.getSize(ShowMessageHolder.MessageArea.UPCENTER)
+            paintUp.isAntiAlias = true
+            val width = paintUp.measureText(message) / 2.0f
+            val fontMetrics = paintUp.fontMetrics
+            canvas.drawText(message, viewRect.centerX() - width, viewRect.top + (fontMetrics.descent - fontMetrics.ascent), paintUp)
+        }
+
+        // 画面下部中央に表示する
+        message = messageHolder.getMessage(ShowMessageHolder.MessageArea.LOWCENTER)
+        if (message != null && message.length > 0) {
+            val paint = Paint()
+            paint.color = messageHolder.getColor(ShowMessageHolder.MessageArea.LOWCENTER)
+            paint.textSize = messageHolder.getSize(ShowMessageHolder.MessageArea.LOWCENTER)
+            paint.isAntiAlias = true
+            val width = paint.measureText(message) / 2.0f
+            val fontMetrics = paint.fontMetrics
+            canvas.drawText(message, viewRect.centerX() - width, viewRect.bottom - fontMetrics.bottom, paint)
+        }
+
+        // 画面中央左に表示する
+        message = messageHolder.getMessage(ShowMessageHolder.MessageArea.LEFTCENTER)
+        if (message != null && message.length > 0) {
+            val paint = Paint()
+            paint.color = messageHolder.getColor(ShowMessageHolder.MessageArea.LEFTCENTER)
+            paint.textSize = messageHolder.getSize(ShowMessageHolder.MessageArea.LEFTCENTER)
+            paint.isAntiAlias = true
+            paint.setShadowLayer(5.0f, 3.0f, 3.0f, Color.BLACK) // これで文字に影をつけたい
+            val fontMetrics = paint.fontMetrics
+            val cy = canvas.height / 2.0f - (fontMetrics.ascent + fontMetrics.descent) / 2.0f
+            canvas.drawText(message, viewRect.left + 3.0f, cy, paint)
+        }
+
+        // 画面中央右に表示する
+        message = messageHolder.getMessage(ShowMessageHolder.MessageArea.RIGHTCENTER)
+        if (message != null && message.length > 0) {
+            val paint = Paint()
+            paint.color = messageHolder.getColor(ShowMessageHolder.MessageArea.RIGHTCENTER)
+            paint.textSize = messageHolder.getSize(ShowMessageHolder.MessageArea.RIGHTCENTER)
+            paint.isAntiAlias = true
+            paint.setShadowLayer(5.0f, 3.0f, 3.0f, Color.BLACK) // これで文字に影をつけたい
+            val width = paint.measureText(message)
+            val fontMetrics = paint.fontMetrics
+            val cy = canvas.height / 2.0f - (fontMetrics.ascent + fontMetrics.descent) / 2.0f
+            canvas.drawText(message, viewRect.right - 3.0f - width, cy, paint)
+        }
+*/
+    }
+
+    fun setShowCameraStatus(isEnable : Boolean)
+    {
+        showCameraStatus = isEnable
+    }
+
+    companion object
+    {
+        private val TAG = CanvasView::class.java.simpleName
+    }
+}
\ No newline at end of file
index 3e221a5..eba8fc6 100644 (file)
@@ -1,5 +1,6 @@
 package jp.osdn.gokigen.thetaview.liveview
 
+import android.content.Context
 import android.os.Bundle
 import android.util.Log
 import android.view.*
@@ -7,6 +8,8 @@ import android.widget.ImageButton
 import androidx.fragment.app.Fragment
 import jp.osdn.gokigen.thetaview.R
 import jp.osdn.gokigen.thetaview.operation.ICameraControl
+import jp.osdn.gokigen.thetaview.preference.IPreferencePropertyAccessor
+import jp.osdn.gokigen.thetaview.preference.PreferenceAccessWrapper
 
 //class LiveImageViewFragment(private val contentLayoutId: Int = R.layout.liveimage_view) : Fragment(contentLayoutId)
 class LiveImageViewFragment(private val contentLayoutId: Int = R.layout.glsurface_view) : Fragment(contentLayoutId), View.OnTouchListener, GestureDetector.OnGestureListener, ScaleGestureDetector.OnScaleGestureListener
@@ -16,6 +19,8 @@ class LiveImageViewFragment(private val contentLayoutId: Int = R.layout.glsurfac
     private lateinit var gestureDetector : GestureDetector
     private lateinit var scaleGestureDetector : ScaleGestureDetector
     private lateinit var imageView : GokigenGLView
+    private lateinit var informationView : CanvasView
+
 
     companion object
     {
@@ -48,14 +53,17 @@ class LiveImageViewFragment(private val contentLayoutId: Int = R.layout.glsurfac
         liveViewView.setOnTouchListener(this)
 
         //val imageView = liveviewView.findViewById<LiveImageView>(R.id.liveViewFinder0)
-        imageView = liveViewView.findViewById<GokigenGLView>(R.id.liveViewFinder0)
+        imageView = liveViewView.findViewById(R.id.liveViewFinder0)
+        informationView = liveViewView.findViewById(R.id.canvasView)
         if (::cameraControl.isInitialized)
         {
             liveViewView.findViewById<ImageButton>(R.id.button_camera)?.setOnClickListener(cameraControl.captureButtonReceiver())
-        }
-        //cameraControl.setRefresher(imageView, imageView)
-        cameraControl.setRefresher(imageView, imageView)
 
+            //cameraControl.setRefresher(imageView, imageView)
+            cameraControl.setRefresher(imageView, imageView)
+
+            informationView.setShowCameraStatus(PreferenceAccessWrapper(requireContext()).getBoolean(IPreferencePropertyAccessor.SHOW_CAMERA_STATUS, IPreferencePropertyAccessor.SHOW_CAMERA_STATUS_DEFAULT_VALUE))
+        }
         return (liveViewView)
     }
 
@@ -63,6 +71,10 @@ class LiveImageViewFragment(private val contentLayoutId: Int = R.layout.glsurfac
     {
         super.onResume()
         Log.v(TAG, " onResume() : ")
+        if (::informationView.isInitialized)
+        {
+            informationView.setShowCameraStatus(PreferenceAccessWrapper(requireContext()).getBoolean(IPreferencePropertyAccessor.SHOW_CAMERA_STATUS, IPreferencePropertyAccessor.SHOW_CAMERA_STATUS_DEFAULT_VALUE))
+        }
     }
 
     override fun onPause()
index 6a52edb..1945ce6 100644 (file)
@@ -26,6 +26,9 @@ interface IPreferencePropertyAccessor
         const val CAPTURE_ONLY_LIVE_VIEW = "capture_only_live_view"
         const val CAPTURE_ONLY_LIVE_VIEW_DEFAULT_VALUE = false
 
+        const val SHOW_CAMERA_STATUS = "show_camera_status"
+        const val SHOW_CAMERA_STATUS_DEFAULT_VALUE = false
+
         // --- SCREEN TRANSACTION LABEL ---
         const val LABEL_EXIT_APPLICATION = "exit_application"
         const val LABEL_WIFI_SETTINGS = "wifi_settings"
index e477b9a..a3eb97a 100644 (file)
@@ -60,6 +60,7 @@ class MainPreferenceFragment : PreferenceFragmentCompat(), OnSharedPreferenceCha
             IPreferencePropertyAccessor.CAPTURE_BOTH_CAMERA_AND_LIVE_VIEW -> value = preferences.getBoolean(key, IPreferencePropertyAccessor.CAPTURE_BOTH_CAMERA_AND_LIVE_VIEW_DEFAULT_VALUE)
             IPreferencePropertyAccessor.CACHE_LIVE_VIEW_PICTURES -> value = preferences.getBoolean(key, IPreferencePropertyAccessor.CACHE_LIVE_VIEW_PICTURES_DEFAULT_VALUE)
             IPreferencePropertyAccessor.CAPTURE_ONLY_LIVE_VIEW -> value = preferences.getBoolean(key, IPreferencePropertyAccessor.CAPTURE_ONLY_LIVE_VIEW_DEFAULT_VALUE)
+            IPreferencePropertyAccessor.SHOW_CAMERA_STATUS -> value = preferences.getBoolean(key, IPreferencePropertyAccessor.SHOW_CAMERA_STATUS_DEFAULT_VALUE)
             // else -> Log.v(TAG, " onSharedPreferenceChanged() : + $key ")
         }
         Log.v(TAG, " onSharedPreferenceChanged() : + $key, $value")
index 2415373..c03cb0e 100644 (file)
@@ -90,6 +90,13 @@ class PreferenceValueInitializer() : IPreferenceValueInitializer
                     IPreferencePropertyAccessor.CAPTURE_ONLY_LIVE_VIEW_DEFAULT_VALUE
                 )
             }
+            if (!items.containsKey(IPreferencePropertyAccessor.SHOW_CAMERA_STATUS))
+            {
+                editor.putBoolean(
+                        IPreferencePropertyAccessor.SHOW_CAMERA_STATUS,
+                        IPreferencePropertyAccessor.SHOW_CAMERA_STATUS_DEFAULT_VALUE
+                )
+            }
             if (!items.containsKey(IPreferencePropertyAccessor.EXTERNAL_STORAGE_LOCATION))
             {
                 editor.putString(IPreferencePropertyAccessor.EXTERNAL_STORAGE_LOCATION, IPreferencePropertyAccessor.EXTERNAL_STORAGE_LOCATION_DEFAULT_VALUE)
index a0a3464..9c74896 100644 (file)
         android:scaleType="fitCenter"
         android:visibility="visible" />
 
+    <view
+        class="jp.osdn.gokigen.thetaview.liveview.CanvasView"
+        android:id="@+id/canvasView"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:gravity="center"
+        android:scaleType="fitCenter"
+        android:visibility="visible" />
+
 </androidx.constraintlayout.widget.ConstraintLayout>
index cc5bfe3..2e5f67f 100644 (file)
@@ -39,6 +39,9 @@
 
     <string name="pref_use_camerax_preview">Use Camera preview(need restart)</string>
 
+    <string name="pref_show_camera_status">Show camera statuses</string>
+    <string name="pref_summary_show_camera_status"> </string>
+
     <string name="shoot_camera">Captured!</string>
 
     <string name="connect_start">start</string>
index 2f62ab9..b7eda24 100644 (file)
             android:title="@string/pref_capture_both_camera_and_live_view"
             android:summary="@string/pref_summary_capture_both_live_view"/>
 
+        <SwitchPreferenceCompat
+            android:key="show_camera_status"
+            android:title="@string/pref_show_camera_status"
+            android:summary="@string/pref_summary_show_camera_status"/>
+
     </PreferenceCategory>
 
     <PreferenceCategory