OSDN Git Service

オートフォーカス対応中。
authorMRSa <mrsa@myad.jp>
Wed, 16 Jun 2021 14:50:15 +0000 (23:50 +0900)
committerMRSa <mrsa@myad.jp>
Wed, 16 Jun 2021 14:50:15 +0000 (23:50 +0900)
app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/DummyCameraControl.kt
app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/camerax/operation/CameraControl.kt
app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/interfaces/ICameraControl.kt
app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/ricohpentax/RicohPentaxCameraControl.kt
app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/ricohpentax/operation/RicohGr2CameraFocusControl.kt
app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/ricohpentax/operation/takepicture/RicohGr2AutoFocusControl.kt
app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/theta/ThetaCameraControl.kt
app/src/main/java/jp/osdn/gokigen/gokigenassets/liveview/LiveImageView.kt
app/src/main/java/jp/osdn/gokigen/gokigenassets/liveview/LiveImageViewFragment.kt
app/src/main/java/jp/osdn/gokigen/gokigenassets/liveview/LiveViewOnTouchListener.kt [new file with mode: 0644]

index e4b6ae8..d2ddca5 100644 (file)
@@ -5,6 +5,7 @@ import android.view.View
 import androidx.camera.core.CameraSelector
 import jp.osdn.gokigen.gokigenassets.camera.interfaces.ICameraControl
 import jp.osdn.gokigen.gokigenassets.camera.interfaces.IDisplayInjector
+import jp.osdn.gokigen.gokigenassets.camera.interfaces.IFocusingControl
 import jp.osdn.gokigen.gokigenassets.camera.interfaces.IKeyDown
 import jp.osdn.gokigen.gokigenassets.liveview.ILiveView
 import jp.osdn.gokigen.gokigenassets.liveview.ILiveViewRefresher
@@ -20,6 +21,7 @@ class DummyCameraControl() : ICameraControl, View.OnClickListener, IKeyDown
     override fun setRefresher(refresher: ILiveViewRefresher, imageView: ILiveView) { }
     override fun captureButtonReceiver(id: Int): View.OnClickListener { return (this) }
     override fun keyDownReceiver(id: Int): IKeyDown { return (this) }
+    override fun getFocusingControl(id: Int): IFocusingControl? { return (null) }
     override fun getDisplayInjector(): IDisplayInjector? { return (null) }
     override fun onClick(v: View?) { }
     override fun handleKeyDown(keyCode: Int, event: KeyEvent): Boolean { return (false) }
index eb462d8..81ac3ed 100644 (file)
@@ -18,6 +18,7 @@ import jp.osdn.gokigen.gokigenassets.liveview.storeimage.StoreImage
 import jp.osdn.gokigen.gokigenassets.utils.imagefile.FileControl
 import jp.osdn.gokigen.gokigenassets.camera.interfaces.ICameraControl
 import jp.osdn.gokigen.gokigenassets.camera.interfaces.IDisplayInjector
+import jp.osdn.gokigen.gokigenassets.camera.interfaces.IFocusingControl
 import jp.osdn.gokigen.gokigenassets.camera.interfaces.IKeyDown
 import java.util.concurrent.ExecutorService
 import java.util.concurrent.Executors
@@ -211,6 +212,10 @@ class CameraControl(private val activity : AppCompatActivity, private val prefer
         return (fileControl)
     }
 
+    override fun getFocusingControl(id: Int): IFocusingControl?
+    {
+        return (null)
+    }
 
     override fun getDisplayInjector(): IDisplayInjector?
     {
index 7df2f33..105a1ec 100644 (file)
@@ -20,5 +20,7 @@ interface ICameraControl
     fun captureButtonReceiver(id : Int = 0) : View.OnClickListener
     fun keyDownReceiver(id : Int = 0) : IKeyDown
 
+    fun getFocusingControl(id : Int = 0) : IFocusingControl?
+
     fun getDisplayInjector() : IDisplayInjector?
 }
index e02a631..d4437a5 100644 (file)
@@ -177,6 +177,12 @@ class RicohPentaxCameraControl(private val context: AppCompatActivity, private v
         return (this)
     }
 
+    override fun getFocusingControl(id: Int): IFocusingControl?
+    {
+        cameraPositionId = id
+        return (focusControl)
+    }
+
     override fun getDisplayInjector(): IDisplayInjector
     {
         return (this)
@@ -258,7 +264,7 @@ class RicohPentaxCameraControl(private val context: AppCompatActivity, private v
             if ((captureBothCamera)&&(liveViewListener.isImageReceived()))
             {
                 // ライブビュー画像を保管する場合...
-                val thread = Thread { storeImage.doStore(cameraPositionId, true) }
+                val thread = Thread { storeImage.doStore(cameraPositionId, false) }
                 try
                 {
                     thread.start()
index fc881ea..15425fe 100644 (file)
@@ -31,7 +31,7 @@ class RicohGr2CameraFocusControl(private val frameDisplay: IAutoFocusFrameDispla
      *
      */
     override fun driveAutoFocus(motionEvent: MotionEvent?): Boolean {
-        Log.v(TAG, "driveAutoFocus()")
+        //Log.v(TAG, "driveAutoFocus()")
         if ((motionEvent == null)||(motionEvent.action != MotionEvent.ACTION_DOWN))
         {
             return false
@@ -41,6 +41,7 @@ class RicohGr2CameraFocusControl(private val frameDisplay: IAutoFocusFrameDispla
             val point: PointF? = frameDisplay.getPointWithEvent(motionEvent)
             if ((point != null)&&(frameDisplay.isContainsPoint(point)))
             {
+                //Log.v(TAG, "driveAutoFocus() : [$point.x, $point.y]")
                 afControl.lockAutoFocus(point)
             }
         }
index 993d4f8..647cf25 100644 (file)
@@ -7,6 +7,7 @@ import jp.osdn.gokigen.gokigenassets.liveview.focusframe.IAutoFocusFrameDisplay
 import jp.osdn.gokigen.gokigenassets.liveview.IIndicatorControl
 import jp.osdn.gokigen.gokigenassets.utils.communication.SimpleHttpClient
 import org.json.JSONObject
+import kotlin.math.roundToInt
 
 /**
  *
@@ -39,38 +40,24 @@ class RicohGr2AutoFocusControl(private val frameDisplayer: IAutoFocusFrameDispla
                 val preFocusFrameRect = getPreFocusFrameRect(point)
                 try
                 {
-                    showFocusFrame(
-                        preFocusFrameRect,
-                        IAutoFocusFrameDisplay.FocusFrameStatus.Running,
-                        0.0f
-                    )
+                    showFocusFrame(preFocusFrameRect, IAutoFocusFrameDisplay.FocusFrameStatus.Running, 0.0f)
 
                     //int posX = (int) (Math.round(point.x * 100.0));
                     //int posY = (int) (Math.round(point.y * 100.0));
                     val focusUrl = if (useGR2command) lockAutoFocusUrl else autoFocusUrl
                     val postData =
-                        "pos=" + Math.round(point.x * 100.0).toInt() + "," + Math.round(
-                            point.y * 100.0
-                        ).toInt()
+                        "pos=" + (point.x * 100.0).roundToInt() + "," + (point.y * 100.0).roundToInt()
                     Log.v(TAG, "AF ($postData)")
-                    val result: String? =
-                        httpClient.httpPost(focusUrl, postData, timeoutMs)
-                    if (result == null || result.isEmpty()) {
-                        Log.v(
-                            TAG,
-                            "setTouchAFPosition() reply is null."
-                        )
-                    } else if (findTouchAFPositionResult(result)) {
+                    val result: String? = httpClient.httpPost(focusUrl, postData, timeoutMs)
+                    if (result == null || result.isEmpty())
+                    {
+                        Log.v(TAG, "setTouchAFPosition() reply is null.")
+                    }
+                    else if (findTouchAFPositionResult(result))
+                    {
                         // AF FOCUSED
-                        Log.v(
-                            TAG,
-                            "lockAutoFocus() : FOCUSED"
-                        )
-                        showFocusFrame(
-                            preFocusFrameRect,
-                            IAutoFocusFrameDisplay.FocusFrameStatus.Focused,
-                            1.0f
-                        ) // いったん1秒だけ表示
+                        Log.v(TAG, "lockAutoFocus() : FOCUSED")
+                        showFocusFrame(preFocusFrameRect, IAutoFocusFrameDisplay.FocusFrameStatus.Focused, 1.0f) // いったん1秒だけ表示
                     } else {
                         // AF ERROR
                         Log.v(
@@ -174,11 +161,15 @@ class RicohGr2AutoFocusControl(private val frameDisplayer: IAutoFocusFrameDispla
         // Display a provisional focus frame at the touched point.
         val focusWidth = 0.125f // 0.125 is rough estimate.
         var focusHeight = 0.125f
-        focusHeight *= if (imageWidth > imageHeight) {
+        focusHeight *= if (imageWidth > imageHeight)
+        {
             imageWidth / imageHeight
-        } else {
+        }
+        else
+        {
             imageHeight / imageWidth
         }
+        //Log.v(TAG, " getPreFocusFrameRect ($point) --> [$focusWidth | $focusHeight] ($imageWidth,$imageHeight)")
         return RectF(
             point.x - focusWidth / 2.0f, point.y - focusHeight / 2.0f,
             point.x + focusWidth / 2.0f, point.y + focusHeight / 2.0f
@@ -197,6 +188,7 @@ class RicohGr2AutoFocusControl(private val frameDisplayer: IAutoFocusFrameDispla
             var afResult = false
             try
             {
+                Log.v(TAG, " findTouchAFPositionResult() : $replyString")
                 val resultObject = JSONObject(replyString)
                 val result = resultObject.getString("errMsg")
                 val focused = resultObject.getBoolean("focused")
index 0d8e3c1..cd25128 100644 (file)
@@ -315,6 +315,11 @@ class ThetaCameraControl(private val context: AppCompatActivity, private val vib
         return (null)
     }
 
+    override fun getFocusingControl(id: Int): IFocusingControl?
+    {
+        return (null)
+    }
+
     override fun handleKeyDown(keyCode: Int, event: KeyEvent): Boolean
     {
         if ((event.action == KeyEvent.ACTION_DOWN)&&((keyCode == KeyEvent.KEYCODE_VOLUME_UP)||(keyCode == KeyEvent.KEYCODE_CAMERA)))
index 88a6b00..893d1cc 100644 (file)
@@ -269,18 +269,15 @@ class LiveImageView : View, ILiveView, ILiveViewRefresher, IShowGridFrame, OnSee
     override fun drawFocusFrame(canvas: Canvas, imageWidth : Float, imageHeight : Float)
     {
 
-        val focusRectOnImage: RectF = convertRectOnViewfinderIntoLiveImage(
-            focusFrameRect,
-            imageWidth,
-            imageHeight,
-            imageRotationDegrees
-        )
+        val focusRectOnImage: RectF = convertRectOnViewfinderIntoLiveImage(focusFrameRect, imageWidth, imageHeight, imageRotationDegrees)
         val focusRectOnView: RectF = convertRectFromImageArea(focusRectOnImage)
+
         // Draw a rectangle to the canvas.
         // Draw a rectangle to the canvas.
         val focusFramePaint = Paint()
         focusFramePaint.style = Paint.Style.STROKE
-        when (focusFrameStatus) {
+        when (focusFrameStatus)
+        {
             IAutoFocusFrameDisplay.FocusFrameStatus.Running -> focusFramePaint.color = Color.WHITE
             IAutoFocusFrameDisplay.FocusFrameStatus.Focused -> focusFramePaint.color = Color.GREEN
             IAutoFocusFrameDisplay.FocusFrameStatus.Failed -> focusFramePaint.color = Color.RED
@@ -289,9 +286,9 @@ class LiveImageView : View, ILiveView, ILiveViewRefresher, IShowGridFrame, OnSee
         }
         val focusFrameStrokeWidth = 2.0f
         val dm: DisplayMetrics = context.resources.displayMetrics
-        val strokeWidth =
-            TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, focusFrameStrokeWidth, dm)
+        val strokeWidth = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, focusFrameStrokeWidth, dm)
         focusFramePaint.strokeWidth = strokeWidth
+
         canvas.drawRect(focusRectOnView, focusFramePaint)
     }
 
@@ -417,6 +414,7 @@ class LiveImageView : View, ILiveView, ILiveViewRefresher, IShowGridFrame, OnSee
         {
             e.printStackTrace()
         }
+        //Log.v(TAG, " [$left,$top]-[$right,$bottom]")
         return RectF(left, top, right, bottom)
     }
 
@@ -458,9 +456,9 @@ class LiveImageView : View, ILiveView, ILiveViewRefresher, IShowGridFrame, OnSee
             }
             ImageView.ScaleType.FIT_CENTER, ImageView.ScaleType.CENTER_INSIDE -> {
                 scale = ratioX.coerceAtMost(ratioY)
-                viewPointX *= scale
-                viewPointY *= scale
-                viewPointX += (viewSizeWidth - imageSizeWidth * scale) / 2.0f
+                //viewPointX *= scale
+                //viewPointY *= scale
+                viewPointX += (viewSizeWidth - imageSizeWidth * scale)  / 2.0f
                 viewPointY += (viewSizeHeight - imageSizeHeight * scale) / 2.0f
             }
             ImageView.ScaleType.CENTER_CROP -> {
@@ -477,6 +475,7 @@ class LiveImageView : View, ILiveView, ILiveViewRefresher, IShowGridFrame, OnSee
             else -> {
             }
         }
+        // Log.v(TAG, "(viewPointX : $viewPointX, viewPointY : $viewPointY) : $imageSizeWidth x $imageSizeHeight")
         return PointF(viewPointX, viewPointY)
     }
 
@@ -557,6 +556,4 @@ class LiveImageView : View, ILiveView, ILiveViewRefresher, IShowGridFrame, OnSee
         }
         return PointF(imagePointX, imagePointY)
     }
-
-
 }
index d348d83..a4bd42d 100644 (file)
@@ -1,5 +1,6 @@
 package jp.osdn.gokigen.gokigenassets.liveview
 
+import android.annotation.SuppressLint
 import android.content.SharedPreferences
 import android.os.Bundle
 import android.util.Log
@@ -70,6 +71,7 @@ class LiveImageViewFragment(private val contentLayoutId: Int = ID_LIVE_VIEW_LAYO
         updateCameraLayout()
     }
 
+    @SuppressLint("ClickableViewAccessibility")
     private fun updateCameraLayout()
     {
         if (!::liveviewView.isInitialized)
@@ -91,6 +93,7 @@ class LiveImageViewFragment(private val contentLayoutId: Int = ID_LIVE_VIEW_LAYO
                 {
                     cameraControl0.setRefresher(imageView0, imageView0)
                     imageView0.injectDisplay(cameraControl0)
+                    imageView0.setOnTouchListener(LiveViewOnTouchListener(cameraControl0, 0))
                     if (isCacheImage)
                     {
                         imageCache0.visibility = View.VISIBLE
@@ -115,6 +118,7 @@ class LiveImageViewFragment(private val contentLayoutId: Int = ID_LIVE_VIEW_LAYO
                 {
                     cameraControl1.setRefresher(imageView1, imageView1)
                     imageView1.injectDisplay(cameraControl1)
+                    imageView1.setOnTouchListener(LiveViewOnTouchListener(cameraControl1, 1))
                     if (isCacheImage)
                     {
                         imageCache1.visibility = View.VISIBLE
@@ -139,6 +143,7 @@ class LiveImageViewFragment(private val contentLayoutId: Int = ID_LIVE_VIEW_LAYO
                 {
                     cameraControl2.setRefresher(imageView2, imageView2)
                     imageView2.injectDisplay(cameraControl2)
+                    imageView2.setOnTouchListener(LiveViewOnTouchListener(cameraControl2, 2))
                     if (isCacheImage)
                     {
                         imageCache2.visibility = View.VISIBLE
@@ -163,6 +168,7 @@ class LiveImageViewFragment(private val contentLayoutId: Int = ID_LIVE_VIEW_LAYO
                 {
                     cameraControl3.setRefresher(imageView3, imageView3)
                     imageView3.injectDisplay(cameraControl3)
+                    imageView3.setOnTouchListener(LiveViewOnTouchListener(cameraControl3, 3))
                     if (isCacheImage)
                     {
                         imageCache3.visibility = View.VISIBLE
diff --git a/app/src/main/java/jp/osdn/gokigen/gokigenassets/liveview/LiveViewOnTouchListener.kt b/app/src/main/java/jp/osdn/gokigen/gokigenassets/liveview/LiveViewOnTouchListener.kt
new file mode 100644 (file)
index 0000000..87d2a86
--- /dev/null
@@ -0,0 +1,34 @@
+package jp.osdn.gokigen.gokigenassets.liveview
+
+import android.annotation.SuppressLint
+import android.util.Log
+import android.view.MotionEvent
+import android.view.View
+import jp.osdn.gokigen.gokigenassets.camera.interfaces.ICameraControl
+
+class LiveViewOnTouchListener(private val cameraControl : ICameraControl, private val id : Int = 0) :  View.OnTouchListener
+{
+    companion object
+    {
+        private val TAG = LiveViewOnTouchListener::class.java.simpleName
+    }
+
+    @SuppressLint("ClickableViewAccessibility")
+    override fun onTouch(v: View?, event: MotionEvent?): Boolean
+    {
+        try
+        {
+            val focusControl = cameraControl.getFocusingControl(id)
+            if (focusControl != null)
+            {
+                return (focusControl.driveAutoFocus(event))
+            }
+            Log.v(TAG, " onTouch() : focusControl is NULL...")
+        }
+        catch (e : Exception)
+        {
+            e.printStackTrace()
+        }
+        return (false)
+    }
+}