Przeglądaj źródła

Merge branch 'fix/android_im_audio_button' into 'develop'

android端聊天语音消息上滑取消发送功能优化

See merge request o2oa/o2oa!1062
楼国栋 5 lat temu
rodzic
commit
9614009e86

+ 65 - 28
o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/app/im/O2ChatActivity.kt

@@ -2,9 +2,14 @@ package net.zoneland.x.bpm.mobile.v1.zoneXBPM.app.im
 
 import android.Manifest
 import android.app.Activity
-import android.app.Instrumentation
-import android.content.*
+import android.app.AlertDialog
+import android.app.Dialog
+import android.content.BroadcastReceiver
+import android.content.Context
+import android.content.Intent
+import android.content.IntentFilter
 import android.graphics.Bitmap
+import android.graphics.drawable.BitmapDrawable
 import android.media.AudioFormat
 import android.media.MediaPlayer
 import android.net.Uri
@@ -20,6 +25,8 @@ import android.text.TextWatcher
 import android.view.*
 import android.view.inputmethod.InputMethodManager
 import android.widget.EditText
+import android.widget.ImageView
+import android.widget.TextView
 import com.wugang.activityresult.library.ActivityResult
 import com.zlw.main.recorderlib.RecordManager
 import com.zlw.main.recorderlib.recorder.RecordConfig
@@ -42,12 +49,9 @@ import net.zoneland.x.bpm.mobile.v1.zoneXBPM.utils.extension.gone
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.utils.extension.o2Subscribe
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.utils.extension.visible
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.utils.permission.PermissionRequester
-import net.zoneland.x.bpm.mobile.v1.zoneXBPM.utils.permission.PermissionResult
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.widgets.dialog.O2DialogSupport
-import org.jetbrains.anko.find
 import java.io.File
 import java.util.*
-import kotlin.math.abs
 
 
 class O2ChatActivity : BaseMVPActivity<O2ChatContract.View, O2ChatContract.Presenter>(), O2ChatContract.View, View.OnTouchListener {
@@ -274,7 +278,8 @@ class O2ChatActivity : BaseMVPActivity<O2ChatContract.View, O2ChatContract.Prese
     }
 
     private var startY: Float = 0f
-    private var mCurPosY: Float = 0f
+    private var isCancelRecord = false
+
 
     /**
      * 录音按钮的touch事件
@@ -283,36 +288,67 @@ class O2ChatActivity : BaseMVPActivity<O2ChatContract.View, O2ChatContract.Prese
      * 上滑取消发送
      */
     override fun onTouch(v: View?, event: MotionEvent?): Boolean {
-        if (v?.id == R.id.image_o2_chat_audio_speak_btn) {
-            when (event?.action) {
-                MotionEvent.ACTION_DOWN -> {
-                    startY = event.y
-                    startRecordAudio()
+        when(event?.action) {
+            MotionEvent.ACTION_DOWN -> {
+                startY = event.y
+                XLog.debug("点击开始............录音")
+                updateRecordingDialogUI(R.mipmap.listener08, "松开发送,上滑取消")
+                recordingDialog?.show()
+                startRecordAudio()
+            }
+            MotionEvent.ACTION_UP -> {
+                XLog.debug("结束了................录音")
+                if (isCancelRecord) {
+                    XLog.debug("取消了录音.....")
+                    cancelRecordAudio()
+                }else {
+                    XLog.debug("完成了录音.....")
+                    endRecordAudio()
                 }
-                MotionEvent.ACTION_UP -> {
-//                    if (mCurPosY - startY > 0 && (abs(mCurPosY - startY) > 100)) {
-//                        XLog.debug("audioButtonDown() 下滑 ")
-//                    } else if (mCurPosY - startY < 0 && (abs(mCurPosY - startY) > 100)) {
-//                        XLog.debug("audioButtonDown() 上滑 ")
-//                    }else {
-//                        XLog.debug("audioButtonDown() 距离不够 ")
-//                    }
-                    if (mCurPosY - startY < 0 && (abs(mCurPosY - startY) > 100)) {
-                        cancelRecordAudio()
-                    } else {
-                        endRecordAudio()
-                    }
+                recordingDialog?.dismiss()
+            }
+            MotionEvent.ACTION_MOVE -> {
+                val moveY = event.y
+                if (startY - moveY > 100) {
+                    isCancelRecord = true
+                    updateRecordingDialogUI(R.mipmap.chat_audio_record_cancel, "松开手指,取消发送")
                 }
-                MotionEvent.ACTION_MOVE -> {
-                    mCurPosY = event.y
+                if (startY - moveY < 20) {
+                    isCancelRecord = false
+                    updateRecordingDialogUI(R.mipmap.listener08, "松开发送,上滑取消")
                 }
             }
-            return true
+            MotionEvent.ACTION_CANCEL -> {
+                XLog.debug("取消了................录音")
+                cancelRecordAudio()
+                recordingDialog?.dismiss()
+            }
+        }
+        return true
+    }
 
+    private var tvPrompt: TextView? = null
+    private var ivLoad:ImageView? = null
+    private var recordingDialog: AlertDialog? = null
+    private fun recordingDialog() : AlertDialog {
+        val dialogBuilder = AlertDialog.Builder(this, R.style.DialogManage)
+        dialogBuilder.setCancelable(false)
+        val view: View = LayoutInflater.from(this).inflate(R.layout.dialog_voice_speak, null)
+        tvPrompt = view.findViewById<TextView>(R.id.tv_prompt)
+        ivLoad = view.findViewById<ImageView>(R.id.iv_load)
+        dialogBuilder.setView(view)
+        val dialog = dialogBuilder.create()
+        dialog.window.setBackgroundDrawable(BitmapDrawable())
+        return dialog
+    }
+    private fun updateRecordingDialogUI(resId: Int, prompt: String?) {
+        if (null != tvPrompt && null != ivLoad) {
+            tvPrompt?.text = prompt
+            ivLoad?.setImageResource(resId)
         }
-        return false
     }
 
+
     override fun updateSuccess(info: IMConversationInfo) {
         hideLoadingDialog()
         this.conversationInfo?.title = info.title
@@ -589,6 +625,7 @@ class O2ChatActivity : BaseMVPActivity<O2ChatContract.View, O2ChatContract.Prese
                 }
             }
         }
+        recordingDialog = recordingDialog()
     }
 
     /**

+ 28 - 0
o2android/app/src/main/res/layout/dialog_voice_speak.xml

@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:background="@color/z_color_black_alpha"
+    android:gravity="center"
+    android:orientation="vertical"
+    android:paddingLeft="@dimen/spacing_tiny"
+    android:paddingRight="@dimen/spacing_tiny">
+
+    <ImageView
+        android:id="@+id/iv_load"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="@dimen/spacing_huge"
+        android:layout_marginStart="@dimen/spacing_normal"
+        android:layout_marginEnd="@dimen/spacing_normal"
+        android:src="@mipmap/listener08" />
+
+    <TextView
+        android:id="@+id/tv_prompt"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginBottom="@dimen/spacing_normal"
+        android:layout_marginTop="@dimen/spacing_twenty"
+        android:textColor="@color/white"
+        android:textSize="@dimen/font_mini" />
+</LinearLayout>

BIN
o2android/app/src/main/res/mipmap-mdpi/listener08.png


BIN
o2android/app/src/main/res/mipmap-xhdpi/chat_audio_record_cancel.png


+ 1 - 0
o2android/app/src/main/res/values/colors.xml

@@ -19,6 +19,7 @@
     <color name="z_color_gray">#888888</color>
     <color name="z_color_gray_600">#999999</color>
     <color name="z_color_gray_light">#82a3a3a3</color>
+    <color name="z_color_black_alpha">#61000000</color>
 
 
     <!-- refresh layout loading color -->

+ 17 - 0
o2android/app/src/main/res/values/styles.xml

@@ -153,6 +153,23 @@
         <item name="android:backgroundDimEnabled">true</item>
     </style>
 
+    <style name="DialogManage">
+        <!--Dialog的windowFrame为空-->
+        <item name="android:windowFrame">@null</item>
+        <!--是否悬浮在activity之上-->
+        <item name="android:windowIsFloating">true</item>
+        <!--是否半透明-->
+        <item name="android:windowIsTranslucent">true</item>
+        <!--是否显示title-->
+        <item name="android:windowNoTitle">true</item>
+        <!--是否有遮盖-->
+        <item name="android:windowContentOverlay">@null</item>
+        <!--半透明背景是否可用-->
+        <item name="android:backgroundDimEnabled">false</item>
+        <item name="android:background">@android:color/transparent</item>
+        <item name="android:windowBackground">@android:color/black</item>
+    </style>
+
 
     <style name="shareDialogTheme" parent="android:Theme.Dialog">
         <item name="android:windowFrame">@null</item>