diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/AccelerationFloatWindow.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/AccelerationFloatWindow.kt new file mode 100644 index 0000000000..7632315dcb --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/AccelerationFloatWindow.kt @@ -0,0 +1,133 @@ +package com.mogo.eagle.core.function.hmi.ui.setting + +import android.app.Activity +import android.graphics.PixelFormat +import android.util.DisplayMetrics +import android.view.* +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.mogo.eagle.core.data.gnss.AccelerationEntity +import com.mogo.eagle.core.function.hmi.R +import java.lang.reflect.Field + +/** + * @author XuXinChao + * @description 可拖拽实时加速度面板 + * @since: 2022/4/21 + */ +class AccelerationFloatWindow constructor(activity: Activity) : View.OnTouchListener{ + + private var mActivity: Activity = activity + private var mWindowParams: WindowManager.LayoutParams? = null + private var mWindowManager: WindowManager? = null + private lateinit var rvAccelerationList: RecyclerView + private var accelerationListAdapter: AccelerationListAdapter?=null + + private lateinit var mFloatLayout: View + private var mInViewX = 0f + private var mInViewY = 0f + private var mDownInScreenX = 0f + private var mDownInScreenY = 0f + private var mInScreenX = 0f + private var mInScreenY = 0f + + init { + initFloatWindow(); + } + + private fun initFloatWindow() { + mFloatLayout = LayoutInflater.from(mActivity).inflate(R.layout.view_acceleration_float, null) as View + mFloatLayout.setOnTouchListener(this) + rvAccelerationList= mFloatLayout.findViewById(R.id.rvAccelerationList) + mWindowParams = WindowManager.LayoutParams() +// mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE); +// if (Build.VERSION.SDK_INT >= 26) {//8.0新特性 +// mWindowParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; +// }else{ +// mWindowParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT; +// } + mWindowManager = mActivity.windowManager + mWindowParams?.let { + it.format = PixelFormat.RGBA_8888 + it.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE + it.gravity = Gravity.START or Gravity.TOP + it.width = 600 + it.height = WindowManager.LayoutParams.WRAP_CONTENT + it.alpha = 0.8f + } + accelerationListAdapter= AccelerationListAdapter(mActivity) + rvAccelerationList.layoutManager = LinearLayoutManager(mActivity, + LinearLayoutManager.VERTICAL,false) + rvAccelerationList.adapter = accelerationListAdapter + rvAccelerationList.isNestedScrollingEnabled = false + } + + fun refreshData(data:List){ + accelerationListAdapter?.setDada(data) + accelerationListAdapter?.notifyDataSetChanged() + } + + + override fun onTouch(v: View?, motionEvent: MotionEvent?): Boolean { + when (motionEvent?.action) { + MotionEvent.ACTION_DOWN -> { + // 获取相对View的坐标,即以此View左上角为原点 + mInViewX = motionEvent.x + mInViewY = motionEvent.y + // 获取相对屏幕的坐标,即以屏幕左上角为原点 + mDownInScreenX = motionEvent.rawX + mDownInScreenY = motionEvent.rawY - getSysBarHeight(mActivity) + mInScreenX = motionEvent.rawX + mInScreenY = motionEvent.rawY - getSysBarHeight(mActivity) + } + MotionEvent.ACTION_MOVE -> { + // 更新浮动窗口位置参数 + mInScreenX = motionEvent.rawX + mInScreenY = motionEvent.rawY - getSysBarHeight(mActivity) + mWindowParams!!.x = (mInScreenX - mInViewX).toInt() + mWindowParams!!.y = (mInScreenY - mInViewY).toInt() + // 手指移动的时候更新小悬浮窗的位置 + mWindowManager!!.updateViewLayout(mFloatLayout, mWindowParams) + } +// MotionEvent.ACTION_UP -> // 如果手指离开屏幕时,xDownInScreen和xInScreen相等,且yDownInScreen和yInScreen相等,则视为触发了单击事件。 +// if (mDownInScreenX === mInScreenX && mDownInScreenY === mInScreenY) { +// } + } + return true + } + + fun showFloatWindow() { + if (mFloatLayout.parent == null) { + val metrics = DisplayMetrics() + // 默认固定位置,靠屏幕右边缘的中间 + mWindowManager!!.defaultDisplay.getMetrics(metrics) + mWindowParams!!.x = metrics.widthPixels + mWindowParams!!.y = metrics.heightPixels / 2 - getSysBarHeight(mActivity) + mWindowManager!!.addView(mFloatLayout, mWindowParams) + } + } + + fun hideFloatWindow() { + if (mFloatLayout.parent != null) mWindowManager!!.removeView(mFloatLayout) + } + + // 获取系统状态栏高度 + private fun getSysBarHeight(activity: Activity): Int { + val c: Class<*> + val obj: Any + val field: Field + val x: Int + var sbar = 0 + try { + c = Class.forName("com.android.internal.R\$dimen") + obj = c.newInstance() + field = c.getField("status_bar_height") + x = field.get(obj).toString().toInt() + sbar = activity.resources.getDimensionPixelSize(x) + } catch (e1: Exception) { + e1.printStackTrace() + } + return sbar + } + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/AccelerationListAdapter.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/AccelerationListAdapter.kt new file mode 100644 index 0000000000..3b7bb5c873 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/AccelerationListAdapter.kt @@ -0,0 +1,48 @@ +package com.mogo.eagle.core.function.hmi.ui.setting + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.mogo.eagle.core.data.gnss.AccelerationEntity +import com.mogo.eagle.core.function.hmi.R + +/** + * @author XuXinChao + * @description 实时加速度列表适配器 + * @since: 2022/4/20 + */ +class AccelerationListAdapter(context: Context) : + RecyclerView.Adapter() { + + private var context: Context? = context + private var data:List? = null + + fun setDada( data: List?){ + this.data = data + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AccelerationListHolder { + val view = LayoutInflater.from(parent.context) + .inflate(R.layout.item_acceleration_detail, parent, false) + return AccelerationListHolder(view) + } + + override fun onBindViewHolder(holder: AccelerationListHolder, position: Int) { + data?.let { it -> + val accelerationEntity = it[position] + holder.tvMoment.text = accelerationEntity.moment + holder.tvAcceleration.text = accelerationEntity.acceleration + } + } + + override fun getItemCount() = data?.size ?: 0 + + class AccelerationListHolder(itemView: View) : RecyclerView.ViewHolder(itemView){ + var tvMoment: TextView = itemView.findViewById(R.id.tvMoment) + var tvAcceleration: TextView = itemView.findViewById(R.id.tvAcceleration) + } + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt index db6786db65..2a13769282 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt @@ -1,6 +1,7 @@ package com.mogo.eagle.core.function.hmi.ui.setting import android.annotation.SuppressLint +import android.app.Activity import android.content.Context import android.graphics.Color import android.os.Build @@ -24,6 +25,7 @@ import com.mogo.eagle.core.data.constants.MoGoConfig import com.mogo.eagle.core.data.deva.chain.ChainConstant import com.mogo.eagle.core.data.deva.scene.SceneModule import com.mogo.eagle.core.data.enums.TrafficTypeEnum +import com.mogo.eagle.core.data.gnss.AccelerationEntity import com.mogo.eagle.core.data.map.MogoLocation import com.mogo.eagle.core.data.obu.ObuStatusInfo import com.mogo.eagle.core.data.upgrade.UpgradeVersionEntity @@ -66,6 +68,7 @@ import mogo.telematics.pad.MessagePad import mogo_msg.MogoReportMsg import java.util.* import kotlin.collections.ArrayList +import kotlin.math.abs /** * @author xiaoyuzhou @@ -91,6 +94,11 @@ class DebugSettingView @JvmOverloads constructor( private var mAutoPilotStatusInfo: AutopilotStatusInfo? = null private var mGnssInfo: MessagePad.GnssInfo? = null + private var accelerationFloatWindow: AccelerationFloatWindow?=null + private var accelerationList = arrayListOf() + private var accelerationIsShow: Boolean = false //实时加速度面板是否展示 + private var accelerationThresholdNum: Double = 0.0 + // 感知识别「已知类型」数据个数 private var mIdentifyDataSize = 0 @@ -973,6 +981,33 @@ class DebugSettingView @JvmOverloads constructor( } } + /** + * 实时加速度面板控制 + */ + tbOpenAcceleration.setOnCheckedChangeListener { _, isChecked -> + if(isChecked){ + //打开实时加速度面板 + accelerationFloatWindow = context?.let { AccelerationFloatWindow(it as Activity) } + accelerationFloatWindow?.showFloatWindow() + etThreshold.visibility = View.VISIBLE + btnThresholdDefine.visibility = View.VISIBLE + }else{ + //关闭实时加速度面板 + accelerationFloatWindow?.hideFloatWindow() + etThreshold.visibility = View.GONE + btnThresholdDefine.visibility = View.GONE + } + accelerationIsShow = isChecked + } + + btnThresholdDefine.setOnClickListener { + try{ + accelerationThresholdNum = etThreshold.text.toString().toDouble() + }catch(e:java.lang.Exception){ + ToastUtils.showShort("请输入正确的阈值") + } + } + } /** @@ -1606,6 +1641,26 @@ class DebugSettingView @JvmOverloads constructor( override fun onAutopilotCarStateData(gnssInfo: MessagePad.GnssInfo?) { mGnssInfo = gnssInfo + //实时加速度列表 + ThreadUtils.runOnUiThread{ + if(accelerationIsShow){ + if(accelerationList.size > 9){ + accelerationList.removeLast() + } + gnssInfo?.acceleration?.let { + if(accelerationList.isEmpty()){ + accelerationList.add(AccelerationEntity(TimeUtils.millis2String(System.currentTimeMillis(),TimeUtils.getHourMinSecondFormat()),it.toString())) + } + if(abs(it.minus(accelerationList.first().acceleration.toDouble())) > abs(accelerationThresholdNum)){ + accelerationList.add(0, AccelerationEntity(TimeUtils.millis2String(System.currentTimeMillis(),TimeUtils.getHourMinSecondFormat()),it.toString())) + } + + accelerationFloatWindow?.refreshData(accelerationList) + } + + } + } + } @RequiresApi(Build.VERSION_CODES.N) diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_acceleration_detail.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_acceleration_detail.xml new file mode 100644 index 0000000000..cc2a41a71f --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_acceleration_detail.xml @@ -0,0 +1,25 @@ + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_acceleration_float.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_acceleration_float.xml new file mode 100644 index 0000000000..8629837b9f --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_acceleration_float.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml index 37747bf293..1a2c79a96c 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml @@ -1105,6 +1105,46 @@ android:textOff="关闭「SN绑定控制」" android:textOn="打开「SN绑定控制」" android:textSize="@dimen/dp_24" /> + + + + + +