diff --git a/app/src/main/java/com/casic/br/ktd/adapter/AlarmListAdapter.kt b/app/src/main/java/com/casic/br/ktd/adapter/AlarmListAdapter.kt deleted file mode 100644 index 627f972..0000000 --- a/app/src/main/java/com/casic/br/ktd/adapter/AlarmListAdapter.kt +++ /dev/null @@ -1,35 +0,0 @@ -package com.casic.br.ktd.adapter - -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.casic.br.ktd.R -import com.casic.br.ktd.model.AlarmPointModel - -class AlarmListAdapter( - context: Context, private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun getItemCount(): Int = dataRows.size - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( - layoutInflater.inflate(R.layout.item_alarm_rv_l, parent, false) - ) - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - holder.alarmTimeView.text = rowsBean.alarmTime - holder.alarmValueView.text = rowsBean.alarmValue.toString() - } - - inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var alarmTimeView: TextView = view.findViewById(R.id.alarmTimeView) - var alarmValueView: TextView = view.findViewById(R.id.alarmValueView) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ktd/adapter/AlarmListAdapter.kt b/app/src/main/java/com/casic/br/ktd/adapter/AlarmListAdapter.kt deleted file mode 100644 index 627f972..0000000 --- a/app/src/main/java/com/casic/br/ktd/adapter/AlarmListAdapter.kt +++ /dev/null @@ -1,35 +0,0 @@ -package com.casic.br.ktd.adapter - -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.casic.br.ktd.R -import com.casic.br.ktd.model.AlarmPointModel - -class AlarmListAdapter( - context: Context, private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun getItemCount(): Int = dataRows.size - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( - layoutInflater.inflate(R.layout.item_alarm_rv_l, parent, false) - ) - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - holder.alarmTimeView.text = rowsBean.alarmTime - holder.alarmValueView.text = rowsBean.alarmValue.toString() - } - - inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var alarmTimeView: TextView = view.findViewById(R.id.alarmTimeView) - var alarmValueView: TextView = view.findViewById(R.id.alarmValueView) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ktd/model/RouteModel.kt b/app/src/main/java/com/casic/br/ktd/model/RouteModel.kt new file mode 100644 index 0000000..c45d645 --- /dev/null +++ b/app/src/main/java/com/casic/br/ktd/model/RouteModel.kt @@ -0,0 +1,3 @@ +package com.casic.br.ktd.model + +data class RouteModel(var lat: Double, var lng: Double) diff --git a/app/src/main/java/com/casic/br/ktd/adapter/AlarmListAdapter.kt b/app/src/main/java/com/casic/br/ktd/adapter/AlarmListAdapter.kt deleted file mode 100644 index 627f972..0000000 --- a/app/src/main/java/com/casic/br/ktd/adapter/AlarmListAdapter.kt +++ /dev/null @@ -1,35 +0,0 @@ -package com.casic.br.ktd.adapter - -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.casic.br.ktd.R -import com.casic.br.ktd.model.AlarmPointModel - -class AlarmListAdapter( - context: Context, private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun getItemCount(): Int = dataRows.size - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( - layoutInflater.inflate(R.layout.item_alarm_rv_l, parent, false) - ) - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - holder.alarmTimeView.text = rowsBean.alarmTime - holder.alarmValueView.text = rowsBean.alarmValue.toString() - } - - inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var alarmTimeView: TextView = view.findViewById(R.id.alarmTimeView) - var alarmValueView: TextView = view.findViewById(R.id.alarmValueView) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ktd/model/RouteModel.kt b/app/src/main/java/com/casic/br/ktd/model/RouteModel.kt new file mode 100644 index 0000000..c45d645 --- /dev/null +++ b/app/src/main/java/com/casic/br/ktd/model/RouteModel.kt @@ -0,0 +1,3 @@ +package com.casic.br.ktd.model + +data class RouteModel(var lat: Double, var lng: Double) diff --git a/app/src/main/java/com/casic/br/ktd/view/InspectionActivity.kt b/app/src/main/java/com/casic/br/ktd/view/InspectionActivity.kt index 5c92e4a..02c47f8 100644 --- a/app/src/main/java/com/casic/br/ktd/view/InspectionActivity.kt +++ b/app/src/main/java/com/casic/br/ktd/view/InspectionActivity.kt @@ -13,16 +13,16 @@ import android.util.Log import android.view.MotionEvent import android.view.SurfaceHolder -import com.amap.api.maps.AMapUtils -import com.amap.api.maps.CameraUpdateFactory -import com.amap.api.maps.CoordinateConverter +import android.view.View +import android.widget.AdapterView +import com.amap.api.maps.* import com.amap.api.maps.model.CameraPosition import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.PolylineOptions import com.casic.br.ktd.R -import com.casic.br.ktd.adapter.AlarmListAdapter import com.casic.br.ktd.extensions.* -import com.casic.br.ktd.model.AlarmPointModel import com.casic.br.ktd.model.ChartPointModel +import com.casic.br.ktd.model.RouteModel import com.casic.br.ktd.model.SensorDataModel import com.casic.br.ktd.netty.SocketManager import com.casic.br.ktd.utils.LocaleConstant @@ -87,18 +87,21 @@ //车速 private var speed: Float = 0.0f + //云台转动速度 + private var selectedSpeed = 0 + + //趋势线是否初始化成功 + private var initSuccess = false + //趋势线起点X坐标 private var i = 0 private var chartBeans: MutableList = ArrayList() private val xAxisLabels: MutableList = ArrayList() private val strengthEntries: MutableList = ArrayList() private var lineDataSets: MutableList = ArrayList() - - //最新报警列表 - private var dataBeans: MutableList = ArrayList() - private var isLoadMore = false private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var alarmAdapter: AlarmListAdapter + private lateinit var aMap: AMap + private lateinit var uiSettings: UiSettings private fun setDeviceConfig() { Log.d(kTag, "setDeviceConfig => 配置设备IP和端口") @@ -138,6 +141,11 @@ setDataListener() /** + * 地图和定位初始化 + * */ + setMapConfig(savedInstanceState) + + /** * 手机GPS定位 * */ val converter = CoordinateConverter(this) @@ -156,25 +164,19 @@ //移动到指定经纬度 val cameraPosition = CameraPosition(latLng, 13f, 0f, 0f) val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) -// aMap.animateCamera(cameraUpdate, 1500, null) + aMap.animateCamera(cameraUpdate, 1500, null) //绘制线 -// aMap.addPolyline( -// PolylineOptions().addAll(latlngs).width(12f).color(Color.RED) -// ) + aMap.addPolyline( + PolylineOptions().addAll(latlngs).width(12f).color(Color.RED) + ) -// if (isStartInspect) { -// val route = LinkedList() -// latlngs.forEach { -// val routeModel = RouteModel() -// routeModel.lat = it.latitude -// routeModel.lng = it.longitude -// -// route.add(routeModel) -// } -// inspectPointModel?.latlngs = route.toJson() -// dataBaseManager.updateInspectPoint(inspectPointModel) -// } + if (isStartInspect) { + val route = LinkedList() + latlngs.forEach { + route.add(RouteModel(it.latitude, it.longitude)) + } + } } }) @@ -212,10 +214,25 @@ } } }, 3000, LocaleConstant.DATA_TIMER_PERIOD) + + //按钮点击效果 + executeAngleButton.setChangeAlphaWhenPress(true) + resetButton.setChangeAlphaWhenPress(true) + cleanCameraButton.setChangeAlphaWhenPress(true) + downscaleButton.setChangeAlphaWhenPress(true) + upscaleButton.setChangeAlphaWhenPress(true) } @SuppressLint("ClickableViewAccessibility") override fun initEvent() { + reconnectButton.setOnClickListener { + if (!isLoginSuccess) { + setDeviceConfig() + } else { + "设备已连接成功,请勿多次连接".show(this) + } + } + captureButton.setOnClickListener { if (isPreviewSuccess) { val strJpeg = NET_DVR_JPEGPARA() @@ -234,28 +251,36 @@ steeringWheelView.setOnWheelTouchListener(object : SteeringWheelView.OnWheelTouchListener { override fun onLeftTurn() { if (isPreviewSuccess && isActionUp) { - hkSDK.NET_DVR_PTZControl(previewHandle, PTZCommand.PAN_LEFT, 0) + hkSDK.NET_DVR_PTZControlWithSpeed( + previewHandle, PTZCommand.PAN_LEFT, 0, selectedSpeed + ) isActionUp = false } } override fun onTopTurn() { if (isPreviewSuccess && isActionUp) { - hkSDK.NET_DVR_PTZControl(previewHandle, PTZCommand.TILT_UP, 0) + hkSDK.NET_DVR_PTZControlWithSpeed( + previewHandle, PTZCommand.TILT_UP, 0, selectedSpeed + ) isActionUp = false } } override fun onRightTurn() { if (isPreviewSuccess && isActionUp) { - hkSDK.NET_DVR_PTZControl(previewHandle, PTZCommand.PAN_RIGHT, 0) + hkSDK.NET_DVR_PTZControlWithSpeed( + previewHandle, PTZCommand.PAN_RIGHT, 0, selectedSpeed + ) isActionUp = false } } override fun onBottomTurn() { if (isPreviewSuccess && isActionUp) { - hkSDK.NET_DVR_PTZControl(previewHandle, PTZCommand.TILT_DOWN, 0) + hkSDK.NET_DVR_PTZControlWithSpeed( + previewHandle, PTZCommand.TILT_DOWN, 0, selectedSpeed + ) isActionUp = false } } @@ -327,16 +352,16 @@ * 角度执行 * */ executeAngleButton.setOnClickListener { - if (isPreviewSuccess) { - val hDegree = hDegreeView.text.toString().trim() - val vDegree = vDegreeView.text.toString().trim() + val hDegree = hDegreeView.text.toString().trim() + val vDegree = vDegreeView.text.toString().trim() + if (hDegree.isEmpty() && vDegree.isEmpty()) { + executeAngle(0f, 0f) + } else { when { - hDegree.isBlank() -> executeAngle(0f, vDegree.toFloat()) - vDegree.isBlank() -> executeAngle(hDegree.toFloat(), 0f) + hDegree.isEmpty() -> executeAngle(0f, vDegree.toFloat()) + vDegree.isEmpty() -> executeAngle(hDegree.toFloat(), 0f) else -> executeAngle(hDegree.toFloat(), vDegree.toFloat()) } - } else { - "请先开启预览".show(context) } } @@ -407,6 +432,19 @@ } true } + + speedSpinner.setSelection(6) + speedSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected( + parent: AdapterView<*>?, view: View?, position: Int, id: Long + ) { + selectedSpeed = position + 1 + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + + } + } } override fun initLayoutView(): Int = R.layout.activity_inspection @@ -585,7 +623,7 @@ isPreviewSuccess = false isStartInspect = false isLoginSuccess = false - + initSuccess = false //结束巡检,保存数据 } @@ -593,32 +631,13 @@ super.onDestroy() stopPreview() BroadcastManager.obtainInstance(this).destroy(LocaleConstant.ACTION_UPDATE_DATA) + mapView.onDestroy() } override fun handleMessage(msg: Message): Boolean { when (msg.what) { //停止旋转 2023071401 -> hkSDK.NET_DVR_PTZControl(previewHandle, PTZCommand.PAN_AUTO, 1) - 2023071402 -> { - if (isLoadMore) { - alarmAdapter.notifyDataSetChanged() - //每次更新数据都将RecyclerView滑到最底部 - alarmRecyclerView.scrollToPosition(alarmAdapter.itemCount - 1) - } else { - alarmAdapter = AlarmListAdapter(this, dataBeans) - alarmRecyclerView.adapter = alarmAdapter - - /** - * 折线图初始化 - * */ - methaneLineChart.init() - //添加自定义Marker - val markerView = LineChartMarkerView(this) - markerView.chartView = methaneLineChart - markerView.setXAxisDate(xAxisLabels) - methaneLineChart.marker = markerView - } - } } return true } @@ -644,7 +663,18 @@ verticalDegreeView.text = String.format("${dataModel.vertical}$degree") gasConcentrationView.text = String.format("${dataModel.methane}ppm·m") - /***折线图***Start*******************************************************************/ + /***折线图**************************************************************************/ + if (!initSuccess) { + methaneLineChart.init() + //添加自定义Marker + val markerView = LineChartMarkerView(context) + markerView.chartView = methaneLineChart + markerView.setXAxisDate(xAxisLabels) + methaneLineChart.marker = markerView + + initSuccess = true + } + val chartPointModel = ChartPointModel("", 0) chartPointModel.dataTime = System.currentTimeMillis().timestampToCompleteDate() chartPointModel.dataValue = dataModel.methane @@ -673,40 +703,72 @@ } methaneLineChart.data = lineData methaneLineChart.invalidate() - /***折线图***End*******************************************************************/ - //判断浓度阈值 - val threshold = - SaveKeyValues.getValue(LocaleConstant.ALARM_THRESHOLD, "1000") as String - if (dataModel.methane > threshold.toInt()) { - //记录报警 - if (latlngs.isNotEmpty()) { - val model = AlarmPointModel() - model.uuid = UUID.randomUUID().toString() - val time = System.currentTimeMillis() - model.alarmTime = time.timestampToCompleteDate() - model.alarmLat = latlngs.last().latitude - model.alarmLng = latlngs.last().longitude - model.alarmValue = dataModel.methane - model.horizontal = dataModel.horizontal - model.vertical = dataModel.vertical - model.threshold = threshold.toInt() - model.carSpeed = speed - //因为报警时间比较短,ms级别,所以存入报警数据时,视频还未采集完毕,所以,在视频采集完毕之后再去判断在这个时间范围的报警数据 - model.videoPath = "" - - dataBeans.add(model) - //设置列表固定只显示10条数据 - if (dataBeans.size > 10) { - dataBeans.removeAt(0) - } - - isLoadMore = true - weakReferenceHandler.sendEmptyMessage(2023071402) - } else { - Log.d(kTag, "onReceive => 无位置数据,报警数据无效") - } - } } }, LocaleConstant.ACTION_UPDATE_DATA) } + + private fun setMapConfig(savedInstanceState: Bundle?) { + mapView.onCreate(savedInstanceState) + aMap = mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.isZoomControlsEnabled = true + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + +// val locationStyle = MyLocationStyle() +// locationStyle.interval(2000) +// locationStyle.showMyLocation(true) +// locationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE) +// aMap.myLocationStyle = locationStyle +// aMap.isMyLocationEnabled = true +// aMap.animateCamera(CameraUpdateFactory.zoomTo(13f)) +// aMap.setOnMyLocationChangeListener(this) + } + +// override fun onMyLocationChange(aMapLocation: Location?) { +// if (aMapLocation == null) { +// "当前信号弱,无法定位".show(context) +// return +// } +// val latitude = aMapLocation.latitude +// val longitude = aMapLocation.longitude +// latlngs.add(LatLng(latitude, longitude)) +// +// //绘制线 +// aMap.addPolyline( +// PolylineOptions().addAll(latlngs).width(15f).color(Color.RED) +// ) +// +// if (isStartInspect) { +// val route = LinkedList() +// latlngs.forEach { +// route.add(RouteModel(it.latitude, it.longitude)) +// } +// } +// } + + /***以下是地图生命周期管理************************************************************************/ + + override fun onResume() { + super.onResume() + mapView.onResume() + //配置预览SurfaceView + videoSurfaceView.holder.addCallback(this) + videoSurfaceView.setZOrderOnTop(true) + val threshold = SaveKeyValues.getValue(LocaleConstant.ALARM_THRESHOLD, "1000") as String + alarmThresholdView.text = String.format("${threshold}ppm·m") + //折线图初始化阈值线 + methaneLineChart.init() + } + + override fun onPause() { + super.onPause() + mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + mapView.onSaveInstanceState(outState) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ktd/adapter/AlarmListAdapter.kt b/app/src/main/java/com/casic/br/ktd/adapter/AlarmListAdapter.kt deleted file mode 100644 index 627f972..0000000 --- a/app/src/main/java/com/casic/br/ktd/adapter/AlarmListAdapter.kt +++ /dev/null @@ -1,35 +0,0 @@ -package com.casic.br.ktd.adapter - -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.casic.br.ktd.R -import com.casic.br.ktd.model.AlarmPointModel - -class AlarmListAdapter( - context: Context, private val dataRows: MutableList -) : RecyclerView.Adapter() { - - private var layoutInflater: LayoutInflater = LayoutInflater.from(context) - - override fun getItemCount(): Int = dataRows.size - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( - layoutInflater.inflate(R.layout.item_alarm_rv_l, parent, false) - ) - - override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { - //绑定数据 - val rowsBean = dataRows[position] - holder.alarmTimeView.text = rowsBean.alarmTime - holder.alarmValueView.text = rowsBean.alarmValue.toString() - } - - inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var alarmTimeView: TextView = view.findViewById(R.id.alarmTimeView) - var alarmValueView: TextView = view.findViewById(R.id.alarmValueView) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ktd/model/RouteModel.kt b/app/src/main/java/com/casic/br/ktd/model/RouteModel.kt new file mode 100644 index 0000000..c45d645 --- /dev/null +++ b/app/src/main/java/com/casic/br/ktd/model/RouteModel.kt @@ -0,0 +1,3 @@ +package com.casic.br.ktd.model + +data class RouteModel(var lat: Double, var lng: Double) diff --git a/app/src/main/java/com/casic/br/ktd/view/InspectionActivity.kt b/app/src/main/java/com/casic/br/ktd/view/InspectionActivity.kt index 5c92e4a..02c47f8 100644 --- a/app/src/main/java/com/casic/br/ktd/view/InspectionActivity.kt +++ b/app/src/main/java/com/casic/br/ktd/view/InspectionActivity.kt @@ -13,16 +13,16 @@ import android.util.Log import android.view.MotionEvent import android.view.SurfaceHolder -import com.amap.api.maps.AMapUtils -import com.amap.api.maps.CameraUpdateFactory -import com.amap.api.maps.CoordinateConverter +import android.view.View +import android.widget.AdapterView +import com.amap.api.maps.* import com.amap.api.maps.model.CameraPosition import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.PolylineOptions import com.casic.br.ktd.R -import com.casic.br.ktd.adapter.AlarmListAdapter import com.casic.br.ktd.extensions.* -import com.casic.br.ktd.model.AlarmPointModel import com.casic.br.ktd.model.ChartPointModel +import com.casic.br.ktd.model.RouteModel import com.casic.br.ktd.model.SensorDataModel import com.casic.br.ktd.netty.SocketManager import com.casic.br.ktd.utils.LocaleConstant @@ -87,18 +87,21 @@ //车速 private var speed: Float = 0.0f + //云台转动速度 + private var selectedSpeed = 0 + + //趋势线是否初始化成功 + private var initSuccess = false + //趋势线起点X坐标 private var i = 0 private var chartBeans: MutableList = ArrayList() private val xAxisLabels: MutableList = ArrayList() private val strengthEntries: MutableList = ArrayList() private var lineDataSets: MutableList = ArrayList() - - //最新报警列表 - private var dataBeans: MutableList = ArrayList() - private var isLoadMore = false private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var alarmAdapter: AlarmListAdapter + private lateinit var aMap: AMap + private lateinit var uiSettings: UiSettings private fun setDeviceConfig() { Log.d(kTag, "setDeviceConfig => 配置设备IP和端口") @@ -138,6 +141,11 @@ setDataListener() /** + * 地图和定位初始化 + * */ + setMapConfig(savedInstanceState) + + /** * 手机GPS定位 * */ val converter = CoordinateConverter(this) @@ -156,25 +164,19 @@ //移动到指定经纬度 val cameraPosition = CameraPosition(latLng, 13f, 0f, 0f) val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) -// aMap.animateCamera(cameraUpdate, 1500, null) + aMap.animateCamera(cameraUpdate, 1500, null) //绘制线 -// aMap.addPolyline( -// PolylineOptions().addAll(latlngs).width(12f).color(Color.RED) -// ) + aMap.addPolyline( + PolylineOptions().addAll(latlngs).width(12f).color(Color.RED) + ) -// if (isStartInspect) { -// val route = LinkedList() -// latlngs.forEach { -// val routeModel = RouteModel() -// routeModel.lat = it.latitude -// routeModel.lng = it.longitude -// -// route.add(routeModel) -// } -// inspectPointModel?.latlngs = route.toJson() -// dataBaseManager.updateInspectPoint(inspectPointModel) -// } + if (isStartInspect) { + val route = LinkedList() + latlngs.forEach { + route.add(RouteModel(it.latitude, it.longitude)) + } + } } }) @@ -212,10 +214,25 @@ } } }, 3000, LocaleConstant.DATA_TIMER_PERIOD) + + //按钮点击效果 + executeAngleButton.setChangeAlphaWhenPress(true) + resetButton.setChangeAlphaWhenPress(true) + cleanCameraButton.setChangeAlphaWhenPress(true) + downscaleButton.setChangeAlphaWhenPress(true) + upscaleButton.setChangeAlphaWhenPress(true) } @SuppressLint("ClickableViewAccessibility") override fun initEvent() { + reconnectButton.setOnClickListener { + if (!isLoginSuccess) { + setDeviceConfig() + } else { + "设备已连接成功,请勿多次连接".show(this) + } + } + captureButton.setOnClickListener { if (isPreviewSuccess) { val strJpeg = NET_DVR_JPEGPARA() @@ -234,28 +251,36 @@ steeringWheelView.setOnWheelTouchListener(object : SteeringWheelView.OnWheelTouchListener { override fun onLeftTurn() { if (isPreviewSuccess && isActionUp) { - hkSDK.NET_DVR_PTZControl(previewHandle, PTZCommand.PAN_LEFT, 0) + hkSDK.NET_DVR_PTZControlWithSpeed( + previewHandle, PTZCommand.PAN_LEFT, 0, selectedSpeed + ) isActionUp = false } } override fun onTopTurn() { if (isPreviewSuccess && isActionUp) { - hkSDK.NET_DVR_PTZControl(previewHandle, PTZCommand.TILT_UP, 0) + hkSDK.NET_DVR_PTZControlWithSpeed( + previewHandle, PTZCommand.TILT_UP, 0, selectedSpeed + ) isActionUp = false } } override fun onRightTurn() { if (isPreviewSuccess && isActionUp) { - hkSDK.NET_DVR_PTZControl(previewHandle, PTZCommand.PAN_RIGHT, 0) + hkSDK.NET_DVR_PTZControlWithSpeed( + previewHandle, PTZCommand.PAN_RIGHT, 0, selectedSpeed + ) isActionUp = false } } override fun onBottomTurn() { if (isPreviewSuccess && isActionUp) { - hkSDK.NET_DVR_PTZControl(previewHandle, PTZCommand.TILT_DOWN, 0) + hkSDK.NET_DVR_PTZControlWithSpeed( + previewHandle, PTZCommand.TILT_DOWN, 0, selectedSpeed + ) isActionUp = false } } @@ -327,16 +352,16 @@ * 角度执行 * */ executeAngleButton.setOnClickListener { - if (isPreviewSuccess) { - val hDegree = hDegreeView.text.toString().trim() - val vDegree = vDegreeView.text.toString().trim() + val hDegree = hDegreeView.text.toString().trim() + val vDegree = vDegreeView.text.toString().trim() + if (hDegree.isEmpty() && vDegree.isEmpty()) { + executeAngle(0f, 0f) + } else { when { - hDegree.isBlank() -> executeAngle(0f, vDegree.toFloat()) - vDegree.isBlank() -> executeAngle(hDegree.toFloat(), 0f) + hDegree.isEmpty() -> executeAngle(0f, vDegree.toFloat()) + vDegree.isEmpty() -> executeAngle(hDegree.toFloat(), 0f) else -> executeAngle(hDegree.toFloat(), vDegree.toFloat()) } - } else { - "请先开启预览".show(context) } } @@ -407,6 +432,19 @@ } true } + + speedSpinner.setSelection(6) + speedSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected( + parent: AdapterView<*>?, view: View?, position: Int, id: Long + ) { + selectedSpeed = position + 1 + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + + } + } } override fun initLayoutView(): Int = R.layout.activity_inspection @@ -585,7 +623,7 @@ isPreviewSuccess = false isStartInspect = false isLoginSuccess = false - + initSuccess = false //结束巡检,保存数据 } @@ -593,32 +631,13 @@ super.onDestroy() stopPreview() BroadcastManager.obtainInstance(this).destroy(LocaleConstant.ACTION_UPDATE_DATA) + mapView.onDestroy() } override fun handleMessage(msg: Message): Boolean { when (msg.what) { //停止旋转 2023071401 -> hkSDK.NET_DVR_PTZControl(previewHandle, PTZCommand.PAN_AUTO, 1) - 2023071402 -> { - if (isLoadMore) { - alarmAdapter.notifyDataSetChanged() - //每次更新数据都将RecyclerView滑到最底部 - alarmRecyclerView.scrollToPosition(alarmAdapter.itemCount - 1) - } else { - alarmAdapter = AlarmListAdapter(this, dataBeans) - alarmRecyclerView.adapter = alarmAdapter - - /** - * 折线图初始化 - * */ - methaneLineChart.init() - //添加自定义Marker - val markerView = LineChartMarkerView(this) - markerView.chartView = methaneLineChart - markerView.setXAxisDate(xAxisLabels) - methaneLineChart.marker = markerView - } - } } return true } @@ -644,7 +663,18 @@ verticalDegreeView.text = String.format("${dataModel.vertical}$degree") gasConcentrationView.text = String.format("${dataModel.methane}ppm·m") - /***折线图***Start*******************************************************************/ + /***折线图**************************************************************************/ + if (!initSuccess) { + methaneLineChart.init() + //添加自定义Marker + val markerView = LineChartMarkerView(context) + markerView.chartView = methaneLineChart + markerView.setXAxisDate(xAxisLabels) + methaneLineChart.marker = markerView + + initSuccess = true + } + val chartPointModel = ChartPointModel("", 0) chartPointModel.dataTime = System.currentTimeMillis().timestampToCompleteDate() chartPointModel.dataValue = dataModel.methane @@ -673,40 +703,72 @@ } methaneLineChart.data = lineData methaneLineChart.invalidate() - /***折线图***End*******************************************************************/ - //判断浓度阈值 - val threshold = - SaveKeyValues.getValue(LocaleConstant.ALARM_THRESHOLD, "1000") as String - if (dataModel.methane > threshold.toInt()) { - //记录报警 - if (latlngs.isNotEmpty()) { - val model = AlarmPointModel() - model.uuid = UUID.randomUUID().toString() - val time = System.currentTimeMillis() - model.alarmTime = time.timestampToCompleteDate() - model.alarmLat = latlngs.last().latitude - model.alarmLng = latlngs.last().longitude - model.alarmValue = dataModel.methane - model.horizontal = dataModel.horizontal - model.vertical = dataModel.vertical - model.threshold = threshold.toInt() - model.carSpeed = speed - //因为报警时间比较短,ms级别,所以存入报警数据时,视频还未采集完毕,所以,在视频采集完毕之后再去判断在这个时间范围的报警数据 - model.videoPath = "" - - dataBeans.add(model) - //设置列表固定只显示10条数据 - if (dataBeans.size > 10) { - dataBeans.removeAt(0) - } - - isLoadMore = true - weakReferenceHandler.sendEmptyMessage(2023071402) - } else { - Log.d(kTag, "onReceive => 无位置数据,报警数据无效") - } - } } }, LocaleConstant.ACTION_UPDATE_DATA) } + + private fun setMapConfig(savedInstanceState: Bundle?) { + mapView.onCreate(savedInstanceState) + aMap = mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.isZoomControlsEnabled = true + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + +// val locationStyle = MyLocationStyle() +// locationStyle.interval(2000) +// locationStyle.showMyLocation(true) +// locationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE) +// aMap.myLocationStyle = locationStyle +// aMap.isMyLocationEnabled = true +// aMap.animateCamera(CameraUpdateFactory.zoomTo(13f)) +// aMap.setOnMyLocationChangeListener(this) + } + +// override fun onMyLocationChange(aMapLocation: Location?) { +// if (aMapLocation == null) { +// "当前信号弱,无法定位".show(context) +// return +// } +// val latitude = aMapLocation.latitude +// val longitude = aMapLocation.longitude +// latlngs.add(LatLng(latitude, longitude)) +// +// //绘制线 +// aMap.addPolyline( +// PolylineOptions().addAll(latlngs).width(15f).color(Color.RED) +// ) +// +// if (isStartInspect) { +// val route = LinkedList() +// latlngs.forEach { +// route.add(RouteModel(it.latitude, it.longitude)) +// } +// } +// } + + /***以下是地图生命周期管理************************************************************************/ + + override fun onResume() { + super.onResume() + mapView.onResume() + //配置预览SurfaceView + videoSurfaceView.holder.addCallback(this) + videoSurfaceView.setZOrderOnTop(true) + val threshold = SaveKeyValues.getValue(LocaleConstant.ALARM_THRESHOLD, "1000") as String + alarmThresholdView.text = String.format("${threshold}ppm·m") + //折线图初始化阈值线 + methaneLineChart.init() + } + + override fun onPause() { + super.onPause() + mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + mapView.onSaveInstanceState(outState) + } } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_inspection.xml b/app/src/main/res/layout/activity_inspection.xml index 32f528a..8814ed8 100644 --- a/app/src/main/res/layout/activity_inspection.xml +++ b/app/src/main/res/layout/activity_inspection.xml @@ -9,8 +9,8 @@ @@ -30,6 +30,14 @@ android:textSize="@dimen/sp_20" /> + + @@ -138,6 +146,7 @@ android:text="报警阈值" /> + android:paddingVertical="@dimen/dp_5"> @@ -219,45 +228,222 @@ - + android:layout_height="match_parent" /> + android:gravity="center_vertical" + android:orientation="horizontal" + android:paddingVertical="@dimen/dp_5"> - + + + + + + + - + android:orientation="horizontal"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -285,7 +471,7 @@ + android:paddingVertical="@dimen/dp_5"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -