diff --git a/app/src/main/java/com/casic/endoscope/view/MainActivity.kt b/app/src/main/java/com/casic/endoscope/view/MainActivity.kt index c4509b0..209f1fc 100644 --- a/app/src/main/java/com/casic/endoscope/view/MainActivity.kt +++ b/app/src/main/java/com/casic/endoscope/view/MainActivity.kt @@ -15,6 +15,7 @@ import android.view.SurfaceHolder import android.view.View import androidx.lifecycle.lifecycleScope +import com.casic.endoscope.R import com.casic.endoscope.databinding.ActivityMainBinding import com.casic.endoscope.extensions.check import com.casic.endoscope.extensions.convertValue @@ -32,6 +33,7 @@ import com.casic.endoscope.utils.ble.OnDeviceDiscoveredListener import com.casic.endoscope.utils.hk.MessageCodeHub import com.casic.endoscope.utils.hk.SDKGuider +import com.casic.endoscope.widgets.AlertControlDialog import com.casic.endoscope.widgets.BluetoothDeviceDialog import com.casic.endoscope.widgets.LineChartMarkerView import com.github.mikephil.charting.data.Entry @@ -44,7 +46,11 @@ import com.hikvision.netsdk.NET_DVR_PREVIEWINFO import com.hikvision.netsdk.NET_DVR_SERIALSTART_V40 import com.hikvision.netsdk.PTZCommand +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets +import com.pengxh.kt.lite.extensions.dp2px import com.pengxh.kt.lite.extensions.getStatusBarHeight import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -53,6 +59,7 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +import java.io.File import java.text.SimpleDateFormat import java.util.Date import java.util.Locale @@ -69,12 +76,14 @@ private val hkSDK by lazy { HCNetSDK.getInstance() } private val bleDeviceManager by lazy { BleDeviceManager(this) } private val timeFormat by lazy { SimpleDateFormat("yyyyMMddHHmmss", Locale.CHINA) } + private val marginOffset by lazy { 10.dp2px(this) } private val selectedSpeed = 7 private val messageCode = 2024021901 private val bluetoothDevices = ArrayList() private val xAxisLabels = ArrayList() private val densityEntries = ArrayList() private val lineDataSets = ArrayList() + private val recyclerViewImages = ArrayList() //趋势线起点X坐标 private var i = 0 @@ -103,15 +112,26 @@ private lateinit var serviceIntent: Intent private lateinit var dataSet: LineDataSet private lateinit var lineData: LineData + private lateinit var imageAdapter: NormalRecyclerAdapter override fun initViewBinding(): ActivityMainBinding { return ActivityMainBinding.inflate(layoutInflater) } - override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(this) + init { +// recyclerViewImages.add("/storage/emulated/0/Android/data/com.casic.endoscope/files/Pictures/2024-04-11/20240411170908.png") +// recyclerViewImages.add("/storage/emulated/0/Android/data/com.casic.endoscope/files/Pictures/2024-04-11/20240411170908.png") +// recyclerViewImages.add("/storage/emulated/0/Android/data/com.casic.endoscope/files/Pictures/2024-04-11/20240411170908.png") +// recyclerViewImages.add("/storage/emulated/0/Android/data/com.casic.endoscope/files/Pictures/2024-04-11/20240411170908.png") +// recyclerViewImages.add("/storage/emulated/0/Android/data/com.casic.endoscope/files/Pictures/2024-04-11/20240411170908.png") +// recyclerViewImages.add("/storage/emulated/0/Android/data/com.casic.endoscope/files/Pictures/2024-04-11/20240411170908.png") +// recyclerViewImages.add("/storage/emulated/0/Android/data/com.casic.endoscope/files/Pictures/2024-04-11/20240411170908.png") +// recyclerViewImages.add("/storage/emulated/0/Android/data/com.casic.endoscope/files/Pictures/2024-04-11/20240411170908.png") + } + override fun initOnCreate(savedInstanceState: Bundle?) { //显示数据 + weakReferenceHandler = WeakReferenceHandler(this) weakReferenceHandler.sendEmptyMessage(messageCode) serviceIntent = Intent(this, VideoTranscodeService::class.java) @@ -130,14 +150,6 @@ startService(serviceIntent) } - override fun handleMessage(msg: Message): Boolean { - if (msg.what == messageCode) { - //绑定数据 - - } - return true - } - override fun initEvent() { binding.openAlbumButton.setOnClickListener { if (isPreviewSuccess) { @@ -380,6 +392,9 @@ if (MessageCodeHub.getErrorCode() == 0) { "画面抓取成功".show(this) binding.imageButton.isEnabled = true + //刷新右侧预览界面 + recyclerViewImages.add(imagePath) + imageAdapter.notifyDataSetChanged() } } else { "摄像头预览未打开,无法拍照".show(this) @@ -411,6 +426,50 @@ } } + override fun handleMessage(msg: Message): Boolean { + if (msg.what == messageCode) { + //绑定数据 + imageAdapter = object : NormalRecyclerAdapter( + R.layout.item_image_rv_g, recyclerViewImages + ) { + override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { + viewHolder.setImageResource(R.id.imageView, item) + viewHolder.setOnLongClickListener(R.id.imageView) { + AlertControlDialog.Builder() + .setContext(context) + .setTitle("温馨提示") + .setMessage("是否保存此图片?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + + } + + override fun onCancelClick() { + //删除图片 + recyclerViewImages.remove(item) + File(item).delete() + imageAdapter.notifyDataSetChanged() + } + }).build().show() + true + } + + viewHolder.setOnClickListener(R.id.imageView) { + //查看大图Dialog + } + } + } + binding.recyclerView.addItemDecoration( + RecyclerViewItemOffsets(marginOffset, marginOffset, marginOffset, marginOffset) + ) + binding.recyclerView.adapter = imageAdapter + } + return true + } + private fun showScanResult() { BluetoothDeviceDialog.Builder().setContext(this).setDeviceArray(bluetoothDevices) .setNegativeButton("取消").setOnDialogButtonClickListener(object : diff --git a/app/src/main/java/com/casic/endoscope/view/MainActivity.kt b/app/src/main/java/com/casic/endoscope/view/MainActivity.kt index c4509b0..209f1fc 100644 --- a/app/src/main/java/com/casic/endoscope/view/MainActivity.kt +++ b/app/src/main/java/com/casic/endoscope/view/MainActivity.kt @@ -15,6 +15,7 @@ import android.view.SurfaceHolder import android.view.View import androidx.lifecycle.lifecycleScope +import com.casic.endoscope.R import com.casic.endoscope.databinding.ActivityMainBinding import com.casic.endoscope.extensions.check import com.casic.endoscope.extensions.convertValue @@ -32,6 +33,7 @@ import com.casic.endoscope.utils.ble.OnDeviceDiscoveredListener import com.casic.endoscope.utils.hk.MessageCodeHub import com.casic.endoscope.utils.hk.SDKGuider +import com.casic.endoscope.widgets.AlertControlDialog import com.casic.endoscope.widgets.BluetoothDeviceDialog import com.casic.endoscope.widgets.LineChartMarkerView import com.github.mikephil.charting.data.Entry @@ -44,7 +46,11 @@ import com.hikvision.netsdk.NET_DVR_PREVIEWINFO import com.hikvision.netsdk.NET_DVR_SERIALSTART_V40 import com.hikvision.netsdk.PTZCommand +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets +import com.pengxh.kt.lite.extensions.dp2px import com.pengxh.kt.lite.extensions.getStatusBarHeight import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -53,6 +59,7 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +import java.io.File import java.text.SimpleDateFormat import java.util.Date import java.util.Locale @@ -69,12 +76,14 @@ private val hkSDK by lazy { HCNetSDK.getInstance() } private val bleDeviceManager by lazy { BleDeviceManager(this) } private val timeFormat by lazy { SimpleDateFormat("yyyyMMddHHmmss", Locale.CHINA) } + private val marginOffset by lazy { 10.dp2px(this) } private val selectedSpeed = 7 private val messageCode = 2024021901 private val bluetoothDevices = ArrayList() private val xAxisLabels = ArrayList() private val densityEntries = ArrayList() private val lineDataSets = ArrayList() + private val recyclerViewImages = ArrayList() //趋势线起点X坐标 private var i = 0 @@ -103,15 +112,26 @@ private lateinit var serviceIntent: Intent private lateinit var dataSet: LineDataSet private lateinit var lineData: LineData + private lateinit var imageAdapter: NormalRecyclerAdapter override fun initViewBinding(): ActivityMainBinding { return ActivityMainBinding.inflate(layoutInflater) } - override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(this) + init { +// recyclerViewImages.add("/storage/emulated/0/Android/data/com.casic.endoscope/files/Pictures/2024-04-11/20240411170908.png") +// recyclerViewImages.add("/storage/emulated/0/Android/data/com.casic.endoscope/files/Pictures/2024-04-11/20240411170908.png") +// recyclerViewImages.add("/storage/emulated/0/Android/data/com.casic.endoscope/files/Pictures/2024-04-11/20240411170908.png") +// recyclerViewImages.add("/storage/emulated/0/Android/data/com.casic.endoscope/files/Pictures/2024-04-11/20240411170908.png") +// recyclerViewImages.add("/storage/emulated/0/Android/data/com.casic.endoscope/files/Pictures/2024-04-11/20240411170908.png") +// recyclerViewImages.add("/storage/emulated/0/Android/data/com.casic.endoscope/files/Pictures/2024-04-11/20240411170908.png") +// recyclerViewImages.add("/storage/emulated/0/Android/data/com.casic.endoscope/files/Pictures/2024-04-11/20240411170908.png") +// recyclerViewImages.add("/storage/emulated/0/Android/data/com.casic.endoscope/files/Pictures/2024-04-11/20240411170908.png") + } + override fun initOnCreate(savedInstanceState: Bundle?) { //显示数据 + weakReferenceHandler = WeakReferenceHandler(this) weakReferenceHandler.sendEmptyMessage(messageCode) serviceIntent = Intent(this, VideoTranscodeService::class.java) @@ -130,14 +150,6 @@ startService(serviceIntent) } - override fun handleMessage(msg: Message): Boolean { - if (msg.what == messageCode) { - //绑定数据 - - } - return true - } - override fun initEvent() { binding.openAlbumButton.setOnClickListener { if (isPreviewSuccess) { @@ -380,6 +392,9 @@ if (MessageCodeHub.getErrorCode() == 0) { "画面抓取成功".show(this) binding.imageButton.isEnabled = true + //刷新右侧预览界面 + recyclerViewImages.add(imagePath) + imageAdapter.notifyDataSetChanged() } } else { "摄像头预览未打开,无法拍照".show(this) @@ -411,6 +426,50 @@ } } + override fun handleMessage(msg: Message): Boolean { + if (msg.what == messageCode) { + //绑定数据 + imageAdapter = object : NormalRecyclerAdapter( + R.layout.item_image_rv_g, recyclerViewImages + ) { + override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { + viewHolder.setImageResource(R.id.imageView, item) + viewHolder.setOnLongClickListener(R.id.imageView) { + AlertControlDialog.Builder() + .setContext(context) + .setTitle("温馨提示") + .setMessage("是否保存此图片?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + + } + + override fun onCancelClick() { + //删除图片 + recyclerViewImages.remove(item) + File(item).delete() + imageAdapter.notifyDataSetChanged() + } + }).build().show() + true + } + + viewHolder.setOnClickListener(R.id.imageView) { + //查看大图Dialog + } + } + } + binding.recyclerView.addItemDecoration( + RecyclerViewItemOffsets(marginOffset, marginOffset, marginOffset, marginOffset) + ) + binding.recyclerView.adapter = imageAdapter + } + return true + } + private fun showScanResult() { BluetoothDeviceDialog.Builder().setContext(this).setDeviceArray(bluetoothDevices) .setNegativeButton("取消").setOnDialogButtonClickListener(object : diff --git a/app/src/main/java/com/casic/endoscope/widgets/AddCameraPointDialog.kt b/app/src/main/java/com/casic/endoscope/widgets/AddCameraPointDialog.kt deleted file mode 100644 index 9401648..0000000 --- a/app/src/main/java/com/casic/endoscope/widgets/AddCameraPointDialog.kt +++ /dev/null @@ -1,107 +0,0 @@ -package com.casic.endoscope.widgets - -import android.app.Dialog -import android.content.Context -import android.os.Bundle -import android.view.View -import com.casic.endoscope.R -import com.casic.endoscope.databinding.DialogAddCameraPointBinding -import com.pengxh.kt.lite.extensions.binding -import com.pengxh.kt.lite.extensions.initDialogLayoutParams -import com.pengxh.kt.lite.extensions.show - -class AddCameraPointDialog private constructor(builder: Builder) : Dialog( - builder.context, R.style.UserDefinedDialogStyle -) { - private val kTag = "AddCameraPointDialog" - private val ctx = builder.context - private var step = builder.step - private val positiveBtn = builder.positiveBtn - private val negativeBtn = builder.negativeBtn - private val listener = builder.listener - - class Builder { - lateinit var context: Context - var step = 1 - lateinit var positiveBtn: String - lateinit var negativeBtn: String - lateinit var listener: OnDialogButtonClickListener - - fun setContext(context: Context): Builder { - this.context = context - return this - } - - fun setLastStep(step: Int): Builder { - this.step = step - return this - } - - fun setPositiveButton(name: String): Builder { - positiveBtn = name - return this - } - - fun setNegativeButton(name: String): Builder { - negativeBtn = name - return this - } - - fun setOnDialogButtonClickListener(listener: OnDialogButtonClickListener): Builder { - this.listener = listener - return this - } - - fun build(): AddCameraPointDialog { - return AddCameraPointDialog(this) - } - } - - private val binding: DialogAddCameraPointBinding by binding() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - this.initDialogLayoutParams(0.3f) - setContentView(R.layout.dialog_add_camera_point) - setCanceledOnTouchOutside(false) - initView() - } - - private fun initView() { - //默认继续排序 - binding.continueStepView.isChecked = true - - binding.cancelButton.text = negativeBtn - binding.cancelButton.setOnClickListener { - listener.onCancelClick() - dismiss() - } - - binding.confirmButton.text = positiveBtn - binding.confirmButton.setOnClickListener(View.OnClickListener { - val hAngle: String = binding.hAngleView.text.toString().trim() - if (hAngle.isBlank()) { - "水平角度输入错误,请检查!".show(ctx) - return@OnClickListener - } - - val vAngle: String = binding.vAngleView.text.toString().trim() - if (vAngle.isBlank()) { - "垂直角度输入错误,请检查!".show(ctx) - return@OnClickListener - } - if (binding.continueStepView.isChecked) { - listener.onConfirmClick(++step, hAngle.toInt(), vAngle.toInt()) - } else { - listener.onConfirmClick(1, hAngle.toInt(), vAngle.toInt()) - } - dismiss() - }) - } - - interface OnDialogButtonClickListener { - fun onConfirmClick(step: Int, hAngle: Int, vAngle: Int) - - fun onCancelClick() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/endoscope/view/MainActivity.kt b/app/src/main/java/com/casic/endoscope/view/MainActivity.kt index c4509b0..209f1fc 100644 --- a/app/src/main/java/com/casic/endoscope/view/MainActivity.kt +++ b/app/src/main/java/com/casic/endoscope/view/MainActivity.kt @@ -15,6 +15,7 @@ import android.view.SurfaceHolder import android.view.View import androidx.lifecycle.lifecycleScope +import com.casic.endoscope.R import com.casic.endoscope.databinding.ActivityMainBinding import com.casic.endoscope.extensions.check import com.casic.endoscope.extensions.convertValue @@ -32,6 +33,7 @@ import com.casic.endoscope.utils.ble.OnDeviceDiscoveredListener import com.casic.endoscope.utils.hk.MessageCodeHub import com.casic.endoscope.utils.hk.SDKGuider +import com.casic.endoscope.widgets.AlertControlDialog import com.casic.endoscope.widgets.BluetoothDeviceDialog import com.casic.endoscope.widgets.LineChartMarkerView import com.github.mikephil.charting.data.Entry @@ -44,7 +46,11 @@ import com.hikvision.netsdk.NET_DVR_PREVIEWINFO import com.hikvision.netsdk.NET_DVR_SERIALSTART_V40 import com.hikvision.netsdk.PTZCommand +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets +import com.pengxh.kt.lite.extensions.dp2px import com.pengxh.kt.lite.extensions.getStatusBarHeight import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -53,6 +59,7 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +import java.io.File import java.text.SimpleDateFormat import java.util.Date import java.util.Locale @@ -69,12 +76,14 @@ private val hkSDK by lazy { HCNetSDK.getInstance() } private val bleDeviceManager by lazy { BleDeviceManager(this) } private val timeFormat by lazy { SimpleDateFormat("yyyyMMddHHmmss", Locale.CHINA) } + private val marginOffset by lazy { 10.dp2px(this) } private val selectedSpeed = 7 private val messageCode = 2024021901 private val bluetoothDevices = ArrayList() private val xAxisLabels = ArrayList() private val densityEntries = ArrayList() private val lineDataSets = ArrayList() + private val recyclerViewImages = ArrayList() //趋势线起点X坐标 private var i = 0 @@ -103,15 +112,26 @@ private lateinit var serviceIntent: Intent private lateinit var dataSet: LineDataSet private lateinit var lineData: LineData + private lateinit var imageAdapter: NormalRecyclerAdapter override fun initViewBinding(): ActivityMainBinding { return ActivityMainBinding.inflate(layoutInflater) } - override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(this) + init { +// recyclerViewImages.add("/storage/emulated/0/Android/data/com.casic.endoscope/files/Pictures/2024-04-11/20240411170908.png") +// recyclerViewImages.add("/storage/emulated/0/Android/data/com.casic.endoscope/files/Pictures/2024-04-11/20240411170908.png") +// recyclerViewImages.add("/storage/emulated/0/Android/data/com.casic.endoscope/files/Pictures/2024-04-11/20240411170908.png") +// recyclerViewImages.add("/storage/emulated/0/Android/data/com.casic.endoscope/files/Pictures/2024-04-11/20240411170908.png") +// recyclerViewImages.add("/storage/emulated/0/Android/data/com.casic.endoscope/files/Pictures/2024-04-11/20240411170908.png") +// recyclerViewImages.add("/storage/emulated/0/Android/data/com.casic.endoscope/files/Pictures/2024-04-11/20240411170908.png") +// recyclerViewImages.add("/storage/emulated/0/Android/data/com.casic.endoscope/files/Pictures/2024-04-11/20240411170908.png") +// recyclerViewImages.add("/storage/emulated/0/Android/data/com.casic.endoscope/files/Pictures/2024-04-11/20240411170908.png") + } + override fun initOnCreate(savedInstanceState: Bundle?) { //显示数据 + weakReferenceHandler = WeakReferenceHandler(this) weakReferenceHandler.sendEmptyMessage(messageCode) serviceIntent = Intent(this, VideoTranscodeService::class.java) @@ -130,14 +150,6 @@ startService(serviceIntent) } - override fun handleMessage(msg: Message): Boolean { - if (msg.what == messageCode) { - //绑定数据 - - } - return true - } - override fun initEvent() { binding.openAlbumButton.setOnClickListener { if (isPreviewSuccess) { @@ -380,6 +392,9 @@ if (MessageCodeHub.getErrorCode() == 0) { "画面抓取成功".show(this) binding.imageButton.isEnabled = true + //刷新右侧预览界面 + recyclerViewImages.add(imagePath) + imageAdapter.notifyDataSetChanged() } } else { "摄像头预览未打开,无法拍照".show(this) @@ -411,6 +426,50 @@ } } + override fun handleMessage(msg: Message): Boolean { + if (msg.what == messageCode) { + //绑定数据 + imageAdapter = object : NormalRecyclerAdapter( + R.layout.item_image_rv_g, recyclerViewImages + ) { + override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { + viewHolder.setImageResource(R.id.imageView, item) + viewHolder.setOnLongClickListener(R.id.imageView) { + AlertControlDialog.Builder() + .setContext(context) + .setTitle("温馨提示") + .setMessage("是否保存此图片?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + + } + + override fun onCancelClick() { + //删除图片 + recyclerViewImages.remove(item) + File(item).delete() + imageAdapter.notifyDataSetChanged() + } + }).build().show() + true + } + + viewHolder.setOnClickListener(R.id.imageView) { + //查看大图Dialog + } + } + } + binding.recyclerView.addItemDecoration( + RecyclerViewItemOffsets(marginOffset, marginOffset, marginOffset, marginOffset) + ) + binding.recyclerView.adapter = imageAdapter + } + return true + } + private fun showScanResult() { BluetoothDeviceDialog.Builder().setContext(this).setDeviceArray(bluetoothDevices) .setNegativeButton("取消").setOnDialogButtonClickListener(object : diff --git a/app/src/main/java/com/casic/endoscope/widgets/AddCameraPointDialog.kt b/app/src/main/java/com/casic/endoscope/widgets/AddCameraPointDialog.kt deleted file mode 100644 index 9401648..0000000 --- a/app/src/main/java/com/casic/endoscope/widgets/AddCameraPointDialog.kt +++ /dev/null @@ -1,107 +0,0 @@ -package com.casic.endoscope.widgets - -import android.app.Dialog -import android.content.Context -import android.os.Bundle -import android.view.View -import com.casic.endoscope.R -import com.casic.endoscope.databinding.DialogAddCameraPointBinding -import com.pengxh.kt.lite.extensions.binding -import com.pengxh.kt.lite.extensions.initDialogLayoutParams -import com.pengxh.kt.lite.extensions.show - -class AddCameraPointDialog private constructor(builder: Builder) : Dialog( - builder.context, R.style.UserDefinedDialogStyle -) { - private val kTag = "AddCameraPointDialog" - private val ctx = builder.context - private var step = builder.step - private val positiveBtn = builder.positiveBtn - private val negativeBtn = builder.negativeBtn - private val listener = builder.listener - - class Builder { - lateinit var context: Context - var step = 1 - lateinit var positiveBtn: String - lateinit var negativeBtn: String - lateinit var listener: OnDialogButtonClickListener - - fun setContext(context: Context): Builder { - this.context = context - return this - } - - fun setLastStep(step: Int): Builder { - this.step = step - return this - } - - fun setPositiveButton(name: String): Builder { - positiveBtn = name - return this - } - - fun setNegativeButton(name: String): Builder { - negativeBtn = name - return this - } - - fun setOnDialogButtonClickListener(listener: OnDialogButtonClickListener): Builder { - this.listener = listener - return this - } - - fun build(): AddCameraPointDialog { - return AddCameraPointDialog(this) - } - } - - private val binding: DialogAddCameraPointBinding by binding() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - this.initDialogLayoutParams(0.3f) - setContentView(R.layout.dialog_add_camera_point) - setCanceledOnTouchOutside(false) - initView() - } - - private fun initView() { - //默认继续排序 - binding.continueStepView.isChecked = true - - binding.cancelButton.text = negativeBtn - binding.cancelButton.setOnClickListener { - listener.onCancelClick() - dismiss() - } - - binding.confirmButton.text = positiveBtn - binding.confirmButton.setOnClickListener(View.OnClickListener { - val hAngle: String = binding.hAngleView.text.toString().trim() - if (hAngle.isBlank()) { - "水平角度输入错误,请检查!".show(ctx) - return@OnClickListener - } - - val vAngle: String = binding.vAngleView.text.toString().trim() - if (vAngle.isBlank()) { - "垂直角度输入错误,请检查!".show(ctx) - return@OnClickListener - } - if (binding.continueStepView.isChecked) { - listener.onConfirmClick(++step, hAngle.toInt(), vAngle.toInt()) - } else { - listener.onConfirmClick(1, hAngle.toInt(), vAngle.toInt()) - } - dismiss() - }) - } - - interface OnDialogButtonClickListener { - fun onConfirmClick(step: Int, hAngle: Int, vAngle: Int) - - fun onCancelClick() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/endoscope/widgets/AlertControlDialog.kt b/app/src/main/java/com/casic/endoscope/widgets/AlertControlDialog.kt new file mode 100644 index 0000000..bffbb3c --- /dev/null +++ b/app/src/main/java/com/casic/endoscope/widgets/AlertControlDialog.kt @@ -0,0 +1,102 @@ +package com.casic.endoscope.widgets + +import android.app.Dialog +import android.content.Context +import android.os.Bundle +import com.casic.endoscope.R +import com.casic.endoscope.databinding.DialogAlertBinding +import com.pengxh.kt.lite.extensions.binding +import com.pengxh.kt.lite.extensions.initDialogLayoutParams + +class AlertControlDialog private constructor(builder: Builder) : Dialog( + builder.context, R.style.UserDefinedDialogStyle +) { + private val title = builder.title + private val message = builder.message + private val positiveBtn = builder.positiveBtn + private val negativeBtn = builder.negativeBtn + private val listener = builder.listener + + class Builder { + lateinit var context: Context + lateinit var title: String + lateinit var message: String + lateinit var positiveBtn: String + lateinit var negativeBtn: String + lateinit var listener: OnDialogButtonClickListener + + fun setContext(context: Context): Builder { + this.context = context + return this + } + + fun setTitle(title: String): Builder { + this.title = title + return this + } + + fun setMessage(message: String): Builder { + this.message = message + return this + } + + fun setPositiveButton(name: String): Builder { + positiveBtn = name + return this + } + + fun setNegativeButton(name: String): Builder { + negativeBtn = name + return this + } + + fun setOnDialogButtonClickListener(listener: OnDialogButtonClickListener): Builder { + this.listener = listener + return this + } + + fun build(): AlertControlDialog { + return AlertControlDialog(this) + } + } + + private val binding: DialogAlertBinding by binding() + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + this.initDialogLayoutParams(0.3f) + setContentView(R.layout.dialog_alert) + setCancelable(false) + setCanceledOnTouchOutside(false) + initView() + } + + private fun initView() { + if (title.isNotBlank()) { + binding.dialogTitleView.text = title + } + if (message.isNotBlank()) { + binding.dialogMessageView.text = message + } + if (negativeBtn.isNotBlank()) { + binding.dialogCancelButton.text = negativeBtn + } + binding.dialogCancelButton.setOnClickListener { + listener.onCancelClick() + dismiss() + } + if (positiveBtn.isNotBlank()) { + binding.dialogConfirmButton.text = positiveBtn + } + binding.dialogConfirmButton.setOnClickListener { + listener.onConfirmClick() + dismiss() + } + } + + interface OnDialogButtonClickListener { + fun onConfirmClick() + + fun onCancelClick() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/endoscope/view/MainActivity.kt b/app/src/main/java/com/casic/endoscope/view/MainActivity.kt index c4509b0..209f1fc 100644 --- a/app/src/main/java/com/casic/endoscope/view/MainActivity.kt +++ b/app/src/main/java/com/casic/endoscope/view/MainActivity.kt @@ -15,6 +15,7 @@ import android.view.SurfaceHolder import android.view.View import androidx.lifecycle.lifecycleScope +import com.casic.endoscope.R import com.casic.endoscope.databinding.ActivityMainBinding import com.casic.endoscope.extensions.check import com.casic.endoscope.extensions.convertValue @@ -32,6 +33,7 @@ import com.casic.endoscope.utils.ble.OnDeviceDiscoveredListener import com.casic.endoscope.utils.hk.MessageCodeHub import com.casic.endoscope.utils.hk.SDKGuider +import com.casic.endoscope.widgets.AlertControlDialog import com.casic.endoscope.widgets.BluetoothDeviceDialog import com.casic.endoscope.widgets.LineChartMarkerView import com.github.mikephil.charting.data.Entry @@ -44,7 +46,11 @@ import com.hikvision.netsdk.NET_DVR_PREVIEWINFO import com.hikvision.netsdk.NET_DVR_SERIALSTART_V40 import com.hikvision.netsdk.PTZCommand +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets +import com.pengxh.kt.lite.extensions.dp2px import com.pengxh.kt.lite.extensions.getStatusBarHeight import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -53,6 +59,7 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +import java.io.File import java.text.SimpleDateFormat import java.util.Date import java.util.Locale @@ -69,12 +76,14 @@ private val hkSDK by lazy { HCNetSDK.getInstance() } private val bleDeviceManager by lazy { BleDeviceManager(this) } private val timeFormat by lazy { SimpleDateFormat("yyyyMMddHHmmss", Locale.CHINA) } + private val marginOffset by lazy { 10.dp2px(this) } private val selectedSpeed = 7 private val messageCode = 2024021901 private val bluetoothDevices = ArrayList() private val xAxisLabels = ArrayList() private val densityEntries = ArrayList() private val lineDataSets = ArrayList() + private val recyclerViewImages = ArrayList() //趋势线起点X坐标 private var i = 0 @@ -103,15 +112,26 @@ private lateinit var serviceIntent: Intent private lateinit var dataSet: LineDataSet private lateinit var lineData: LineData + private lateinit var imageAdapter: NormalRecyclerAdapter override fun initViewBinding(): ActivityMainBinding { return ActivityMainBinding.inflate(layoutInflater) } - override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(this) + init { +// recyclerViewImages.add("/storage/emulated/0/Android/data/com.casic.endoscope/files/Pictures/2024-04-11/20240411170908.png") +// recyclerViewImages.add("/storage/emulated/0/Android/data/com.casic.endoscope/files/Pictures/2024-04-11/20240411170908.png") +// recyclerViewImages.add("/storage/emulated/0/Android/data/com.casic.endoscope/files/Pictures/2024-04-11/20240411170908.png") +// recyclerViewImages.add("/storage/emulated/0/Android/data/com.casic.endoscope/files/Pictures/2024-04-11/20240411170908.png") +// recyclerViewImages.add("/storage/emulated/0/Android/data/com.casic.endoscope/files/Pictures/2024-04-11/20240411170908.png") +// recyclerViewImages.add("/storage/emulated/0/Android/data/com.casic.endoscope/files/Pictures/2024-04-11/20240411170908.png") +// recyclerViewImages.add("/storage/emulated/0/Android/data/com.casic.endoscope/files/Pictures/2024-04-11/20240411170908.png") +// recyclerViewImages.add("/storage/emulated/0/Android/data/com.casic.endoscope/files/Pictures/2024-04-11/20240411170908.png") + } + override fun initOnCreate(savedInstanceState: Bundle?) { //显示数据 + weakReferenceHandler = WeakReferenceHandler(this) weakReferenceHandler.sendEmptyMessage(messageCode) serviceIntent = Intent(this, VideoTranscodeService::class.java) @@ -130,14 +150,6 @@ startService(serviceIntent) } - override fun handleMessage(msg: Message): Boolean { - if (msg.what == messageCode) { - //绑定数据 - - } - return true - } - override fun initEvent() { binding.openAlbumButton.setOnClickListener { if (isPreviewSuccess) { @@ -380,6 +392,9 @@ if (MessageCodeHub.getErrorCode() == 0) { "画面抓取成功".show(this) binding.imageButton.isEnabled = true + //刷新右侧预览界面 + recyclerViewImages.add(imagePath) + imageAdapter.notifyDataSetChanged() } } else { "摄像头预览未打开,无法拍照".show(this) @@ -411,6 +426,50 @@ } } + override fun handleMessage(msg: Message): Boolean { + if (msg.what == messageCode) { + //绑定数据 + imageAdapter = object : NormalRecyclerAdapter( + R.layout.item_image_rv_g, recyclerViewImages + ) { + override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { + viewHolder.setImageResource(R.id.imageView, item) + viewHolder.setOnLongClickListener(R.id.imageView) { + AlertControlDialog.Builder() + .setContext(context) + .setTitle("温馨提示") + .setMessage("是否保存此图片?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + + } + + override fun onCancelClick() { + //删除图片 + recyclerViewImages.remove(item) + File(item).delete() + imageAdapter.notifyDataSetChanged() + } + }).build().show() + true + } + + viewHolder.setOnClickListener(R.id.imageView) { + //查看大图Dialog + } + } + } + binding.recyclerView.addItemDecoration( + RecyclerViewItemOffsets(marginOffset, marginOffset, marginOffset, marginOffset) + ) + binding.recyclerView.adapter = imageAdapter + } + return true + } + private fun showScanResult() { BluetoothDeviceDialog.Builder().setContext(this).setDeviceArray(bluetoothDevices) .setNegativeButton("取消").setOnDialogButtonClickListener(object : diff --git a/app/src/main/java/com/casic/endoscope/widgets/AddCameraPointDialog.kt b/app/src/main/java/com/casic/endoscope/widgets/AddCameraPointDialog.kt deleted file mode 100644 index 9401648..0000000 --- a/app/src/main/java/com/casic/endoscope/widgets/AddCameraPointDialog.kt +++ /dev/null @@ -1,107 +0,0 @@ -package com.casic.endoscope.widgets - -import android.app.Dialog -import android.content.Context -import android.os.Bundle -import android.view.View -import com.casic.endoscope.R -import com.casic.endoscope.databinding.DialogAddCameraPointBinding -import com.pengxh.kt.lite.extensions.binding -import com.pengxh.kt.lite.extensions.initDialogLayoutParams -import com.pengxh.kt.lite.extensions.show - -class AddCameraPointDialog private constructor(builder: Builder) : Dialog( - builder.context, R.style.UserDefinedDialogStyle -) { - private val kTag = "AddCameraPointDialog" - private val ctx = builder.context - private var step = builder.step - private val positiveBtn = builder.positiveBtn - private val negativeBtn = builder.negativeBtn - private val listener = builder.listener - - class Builder { - lateinit var context: Context - var step = 1 - lateinit var positiveBtn: String - lateinit var negativeBtn: String - lateinit var listener: OnDialogButtonClickListener - - fun setContext(context: Context): Builder { - this.context = context - return this - } - - fun setLastStep(step: Int): Builder { - this.step = step - return this - } - - fun setPositiveButton(name: String): Builder { - positiveBtn = name - return this - } - - fun setNegativeButton(name: String): Builder { - negativeBtn = name - return this - } - - fun setOnDialogButtonClickListener(listener: OnDialogButtonClickListener): Builder { - this.listener = listener - return this - } - - fun build(): AddCameraPointDialog { - return AddCameraPointDialog(this) - } - } - - private val binding: DialogAddCameraPointBinding by binding() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - this.initDialogLayoutParams(0.3f) - setContentView(R.layout.dialog_add_camera_point) - setCanceledOnTouchOutside(false) - initView() - } - - private fun initView() { - //默认继续排序 - binding.continueStepView.isChecked = true - - binding.cancelButton.text = negativeBtn - binding.cancelButton.setOnClickListener { - listener.onCancelClick() - dismiss() - } - - binding.confirmButton.text = positiveBtn - binding.confirmButton.setOnClickListener(View.OnClickListener { - val hAngle: String = binding.hAngleView.text.toString().trim() - if (hAngle.isBlank()) { - "水平角度输入错误,请检查!".show(ctx) - return@OnClickListener - } - - val vAngle: String = binding.vAngleView.text.toString().trim() - if (vAngle.isBlank()) { - "垂直角度输入错误,请检查!".show(ctx) - return@OnClickListener - } - if (binding.continueStepView.isChecked) { - listener.onConfirmClick(++step, hAngle.toInt(), vAngle.toInt()) - } else { - listener.onConfirmClick(1, hAngle.toInt(), vAngle.toInt()) - } - dismiss() - }) - } - - interface OnDialogButtonClickListener { - fun onConfirmClick(step: Int, hAngle: Int, vAngle: Int) - - fun onCancelClick() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/endoscope/widgets/AlertControlDialog.kt b/app/src/main/java/com/casic/endoscope/widgets/AlertControlDialog.kt new file mode 100644 index 0000000..bffbb3c --- /dev/null +++ b/app/src/main/java/com/casic/endoscope/widgets/AlertControlDialog.kt @@ -0,0 +1,102 @@ +package com.casic.endoscope.widgets + +import android.app.Dialog +import android.content.Context +import android.os.Bundle +import com.casic.endoscope.R +import com.casic.endoscope.databinding.DialogAlertBinding +import com.pengxh.kt.lite.extensions.binding +import com.pengxh.kt.lite.extensions.initDialogLayoutParams + +class AlertControlDialog private constructor(builder: Builder) : Dialog( + builder.context, R.style.UserDefinedDialogStyle +) { + private val title = builder.title + private val message = builder.message + private val positiveBtn = builder.positiveBtn + private val negativeBtn = builder.negativeBtn + private val listener = builder.listener + + class Builder { + lateinit var context: Context + lateinit var title: String + lateinit var message: String + lateinit var positiveBtn: String + lateinit var negativeBtn: String + lateinit var listener: OnDialogButtonClickListener + + fun setContext(context: Context): Builder { + this.context = context + return this + } + + fun setTitle(title: String): Builder { + this.title = title + return this + } + + fun setMessage(message: String): Builder { + this.message = message + return this + } + + fun setPositiveButton(name: String): Builder { + positiveBtn = name + return this + } + + fun setNegativeButton(name: String): Builder { + negativeBtn = name + return this + } + + fun setOnDialogButtonClickListener(listener: OnDialogButtonClickListener): Builder { + this.listener = listener + return this + } + + fun build(): AlertControlDialog { + return AlertControlDialog(this) + } + } + + private val binding: DialogAlertBinding by binding() + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + this.initDialogLayoutParams(0.3f) + setContentView(R.layout.dialog_alert) + setCancelable(false) + setCanceledOnTouchOutside(false) + initView() + } + + private fun initView() { + if (title.isNotBlank()) { + binding.dialogTitleView.text = title + } + if (message.isNotBlank()) { + binding.dialogMessageView.text = message + } + if (negativeBtn.isNotBlank()) { + binding.dialogCancelButton.text = negativeBtn + } + binding.dialogCancelButton.setOnClickListener { + listener.onCancelClick() + dismiss() + } + if (positiveBtn.isNotBlank()) { + binding.dialogConfirmButton.text = positiveBtn + } + binding.dialogConfirmButton.setOnClickListener { + listener.onConfirmClick() + dismiss() + } + } + + interface OnDialogButtonClickListener { + fun onConfirmClick() + + fun onCancelClick() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/endoscope/widgets/DirectionControlView.kt b/app/src/main/java/com/casic/endoscope/widgets/DirectionControlView.kt deleted file mode 100644 index 0e6ec4a..0000000 --- a/app/src/main/java/com/casic/endoscope/widgets/DirectionControlView.kt +++ /dev/null @@ -1,404 +0,0 @@ -package com.casic.endoscope.widgets - -import android.content.Context -import android.graphics.BlurMaskFilter -import android.graphics.Canvas -import android.graphics.Color -import android.graphics.Paint -import android.graphics.Path -import android.graphics.Rect -import android.util.AttributeSet -import android.util.Log -import android.view.MotionEvent -import android.view.View -import com.casic.endoscope.R -import com.pengxh.kt.lite.extensions.dp2px -import kotlin.math.acos -import kotlin.math.cos -import kotlin.math.hypot -import kotlin.math.pow -import kotlin.math.sin -import kotlin.math.sqrt - -class DirectionControlView constructor(context: Context, attrs: AttributeSet) : - View(context, attrs), View.OnTouchListener { - - private val kTag = "DirectionControlView" - private val maskFilter = BlurMaskFilter(15f, BlurMaskFilter.Blur.SOLID) - - //View中心X坐标 - private var centerX = 0f - - //View中心Y坐标 - private var centerY = 0f - - private lateinit var tickPaint: Paint - private lateinit var outerPaint: Paint - private lateinit var innerPaint: Paint - - //View属性 - private val circleRadius: Int - private val outerColor: Int - private val outerStroke: Int - private val innerRadius: Int - private val innerColor: Int - private val innerStroke: Int - private val renderColor: Int - - //滑动圆的圆心 - private var moveCircleX = 0f - private var moveCircleY = 0f - - //控件外边界 - private val viewRadius: Int - private val rect: Rect - - private val maxMoveRadius: Int - private lateinit var directionPaints: ArrayList - private lateinit var leftPath: Path - private lateinit var topPath: Path - private lateinit var rightPath: Path - private lateinit var bottomPath: Path - - // 各方位状态 - private var leftTurn = false - private var topTurn = false - private var rightTurn = false - private var bottomTurn = false - - init { - val attr = context.obtainStyledAttributes(attrs, R.styleable.DirectionControlView) - circleRadius = attr.getDimensionPixelOffset( - R.styleable.DirectionControlView_ctrl_radius, 150 - ) - //中心圆半径 - innerRadius = circleRadius / 3 - - outerColor = attr.getColor(R.styleable.DirectionControlView_ctrl_outer_color, Color.LTGRAY) - outerStroke = attr.getDimensionPixelOffset( - R.styleable.DirectionControlView_ctrl_outer_stroke, 3 - ) - innerColor = attr.getColor(R.styleable.DirectionControlView_ctrl_inner_color, Color.WHITE) - innerStroke = attr.getDimensionPixelOffset( - R.styleable.DirectionControlView_ctrl_inner_stroke, 3 - ) - renderColor = attr.getColor(R.styleable.DirectionControlView_ctrl_render_color, Color.BLUE) - attr.recycle() - - //辅助框 - viewRadius = circleRadius + 5.dp2px(context) - rect = Rect(-viewRadius, -viewRadius, viewRadius, viewRadius) - - //滑动圆心最大距离 - maxMoveRadius = innerRadius * 2 - - //初始化画笔 - initPaint() - - //事件监听 - setOnTouchListener(this) - } - - private fun initPaint() { - tickPaint = Paint() - tickPaint.color = Color.DKGRAY - tickPaint.style = Paint.Style.STROKE - tickPaint.strokeWidth = 1f - tickPaint.isAntiAlias = true - - outerPaint = Paint() - outerPaint.color = outerColor - outerPaint.style = Paint.Style.STROKE - outerPaint.strokeWidth = outerStroke.toFloat() - outerPaint.isAntiAlias = true - - innerPaint = Paint() - innerPaint.color = innerColor - innerPaint.style = Paint.Style.FILL - innerPaint.isAntiAlias = true - //设置光晕 - innerPaint.maskFilter = maskFilter - - /** - * 左上右下 - * */ - directionPaints = createDirectionPaint() - - //箭头顶点距离圆心的距离 - val distance = maxMoveRadius * 1.35f - //箭头每边长 - val l = innerRadius * 0.25f - //箭头顶点与圆心的连线,箭头边长之间的夹角 - val cos = cos(Math.PI / 4).toFloat() - val sin = sin(Math.PI / 4).toFloat() - - leftPath = Path() - leftPath.moveTo(-distance, 0f) - leftPath.lineTo(-distance + l * cos, -l * sin) - leftPath.moveTo(-distance, 0f) - leftPath.lineTo(-distance + l * cos, l * sin) - - topPath = Path() - topPath.moveTo(0f, -distance) - topPath.lineTo(-l * cos, -distance + l * sin) - topPath.moveTo(0f, -distance) - topPath.lineTo(l * cos, -distance + l * sin) - - rightPath = Path() - rightPath.moveTo(distance, 0f) - rightPath.lineTo(distance - l * cos, -l * sin) - rightPath.moveTo(distance, 0f) - rightPath.lineTo(distance - l * cos, l * sin) - - bottomPath = Path() - bottomPath.moveTo(0f, distance) - bottomPath.lineTo(-l * cos, distance - l * sin) - bottomPath.moveTo(0f, distance) - bottomPath.lineTo(l * cos, distance - l * sin) - } - - //批量创建画笔 - private fun createDirectionPaint(): ArrayList { - val result = ArrayList() - for (i in 0 until 4) { - val paint = Paint() - paint.color = innerColor - paint.style = Paint.Style.STROKE - paint.strokeCap = Paint.Cap.ROUND - paint.strokeWidth = innerStroke.toFloat() - paint.isAntiAlias = true - //设置光晕 - paint.maskFilter = maskFilter - - result.add(paint) - } - return result - } - - override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) { - super.onSizeChanged(w, h, oldw, oldh) - centerX = (w shr 1).toFloat() - centerY = (h shr 1).toFloat() - } - - override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { - super.onMeasure(widthMeasureSpec, heightMeasureSpec) - val widthSpecMode = MeasureSpec.getMode(widthMeasureSpec) - val widthSpecSize = MeasureSpec.getSize(widthMeasureSpec) - val heightSpecMode = MeasureSpec.getMode(heightMeasureSpec) - val heightSpecSize = MeasureSpec.getSize(heightMeasureSpec) - // 获取宽 - val mWidth: Int = if (widthSpecMode == MeasureSpec.EXACTLY) { - // match_parent/精确值 - widthSpecSize - } else { - // wrap_content,外边界宽 - (viewRadius * 2) - } - // 获取高 - val mHeight: Int = if (heightSpecMode == MeasureSpec.EXACTLY) { - // match_parent/精确值 - heightSpecSize - } else { - // wrap_content,外边界高 - (viewRadius * 2) - } - // 设置该view的宽高 - setMeasuredDimension(mWidth, mHeight) - } - - override fun onDraw(canvas: Canvas) { - super.onDraw(canvas) - /** - * 画布移到中心位置,方便绘制一系列图形 - */ - canvas.translate(centerX, centerY) - -// drawGuides(canvas) - - //画外圆 - canvas.drawCircle(0f, 0f, circleRadius.toFloat(), outerPaint) - - //画内圆 - canvas.drawCircle(moveCircleX, moveCircleY, innerRadius.toFloat(), innerPaint) - - //画上下左右箭头 - canvas.drawPath(leftPath, directionPaints[0]) - canvas.drawPath(topPath, directionPaints[1]) - canvas.drawPath(rightPath, directionPaints[2]) - canvas.drawPath(bottomPath, directionPaints[3]) - } - - override fun onTouch(v: View, event: MotionEvent): Boolean { - val action = event.action - val x = event.x - val y = event.y - when (action) { - MotionEvent.ACTION_DOWN -> { - Log.d(kTag, "onTouch => 按下") - } - - MotionEvent.ACTION_MOVE -> { - /** - * 计算可滑动圆的圆心位置 - * */ - var deltaX = x - circleRadius - val deltaY = y - circleRadius - - //计算滑动的圆心距离圆心的距离。hypot 表示平方和的开平方 - var distance = hypot(deltaX, deltaY) - if (distance >= maxMoveRadius) { - distance = maxMoveRadius.toFloat() - } - - if (deltaX >= maxMoveRadius) { - deltaX = maxMoveRadius - 0.00001f - } else if (deltaX < -maxMoveRadius) { - deltaX = -maxMoveRadius + 0.00001f - } - - moveCircleX = deltaX - val tempY = distance.pow(2) - deltaX.pow(2) - moveCircleY = if (deltaY < 0) { - -sqrt(tempY) - } else { - sqrt(tempY) - } - - if (distance >= innerRadius) { - Log.d(kTag, "onTouch => $distance, $deltaX, $tempY, $moveCircleY") - val arcCos = acos(deltaX / distance) - val degree = Math.toDegrees(arcCos.toDouble()) - if (degree in 45.0..135.0) { - if (moveCircleY < 0) { - updateDirectionColor(ControlDirection.TOP) - } else { - updateDirectionColor(ControlDirection.BOTTOM) - } - } else { - if (moveCircleX < 0) { - updateDirectionColor(ControlDirection.LEFT) - } else { - updateDirectionColor(ControlDirection.RIGHT) - } - } - } else { - Log.d(kTag, "onTouch => 点击了中心") - } - } - - MotionEvent.ACTION_UP -> { - moveCircleX = 0f - moveCircleY = 0f - - directionPaints.forEach { it.color = Color.WHITE } - } - } - invalidate() - return true - } - - private fun updateDirectionColor(direction: ControlDirection) { - when (direction) { - ControlDirection.LEFT -> { - directionPaints[0].color = renderColor - for (i in 1 until directionPaints.size) { - directionPaints[i].color = Color.WHITE - } - } - - ControlDirection.TOP -> { - directionPaints[0].color = Color.WHITE - directionPaints[1].color = renderColor - directionPaints[2].color = Color.WHITE - directionPaints[3].color = Color.WHITE - } - - ControlDirection.RIGHT -> { - directionPaints[0].color = Color.WHITE - directionPaints[1].color = Color.WHITE - directionPaints[2].color = renderColor - directionPaints[3].color = Color.WHITE - } - - ControlDirection.BOTTOM -> { - for (i in 0 until directionPaints.size - 1) { - directionPaints[i].color = Color.WHITE - } - directionPaints[3].color = renderColor - } - } - } - - /** - * 辅助线 - * */ - private fun drawGuides(canvas: Canvas) { - //最外层方框,即自定义View的边界 - canvas.drawRect(rect, tickPaint) - - //触摸圆可到达的最大圆 - canvas.drawCircle(0f, 0f, (innerRadius * 2).toFloat(), tickPaint) - - //中心横线 - canvas.drawLine(-viewRadius.toFloat(), 0f, viewRadius.toFloat(), 0f, tickPaint) - - //中心竖线 - canvas.drawLine(0f, -viewRadius.toFloat(), 0f, viewRadius.toFloat(), tickPaint) - - //对角线 - canvas.drawLine( - -viewRadius.toFloat(), -viewRadius.toFloat(), - viewRadius.toFloat(), viewRadius.toFloat(), - tickPaint - ) - - canvas.drawLine( - -viewRadius.toFloat(), viewRadius.toFloat(), - viewRadius.toFloat(), -viewRadius.toFloat(), - tickPaint - ) - } - - enum class ControlDirection { - LEFT, TOP, RIGHT, BOTTOM - } - - private var listener: OnWheelTouchListener? = null - - fun setOnWheelTouchListener(listener: OnWheelTouchListener?) { - this.listener = listener - } - - interface OnWheelTouchListener { - /** - * 中间 - */ - fun onCenterClicked() - - /** - * 左 - */ - fun onLeftTurn() - - /** - * 上 - */ - fun onTopTurn() - - /** - * 右 - */ - fun onRightTurn() - - /** - * 下 - */ - fun onBottomTurn() - - /** - * 松开 - */ - fun onActionTurnUp(dir: ControlDirection) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/endoscope/view/MainActivity.kt b/app/src/main/java/com/casic/endoscope/view/MainActivity.kt index c4509b0..209f1fc 100644 --- a/app/src/main/java/com/casic/endoscope/view/MainActivity.kt +++ b/app/src/main/java/com/casic/endoscope/view/MainActivity.kt @@ -15,6 +15,7 @@ import android.view.SurfaceHolder import android.view.View import androidx.lifecycle.lifecycleScope +import com.casic.endoscope.R import com.casic.endoscope.databinding.ActivityMainBinding import com.casic.endoscope.extensions.check import com.casic.endoscope.extensions.convertValue @@ -32,6 +33,7 @@ import com.casic.endoscope.utils.ble.OnDeviceDiscoveredListener import com.casic.endoscope.utils.hk.MessageCodeHub import com.casic.endoscope.utils.hk.SDKGuider +import com.casic.endoscope.widgets.AlertControlDialog import com.casic.endoscope.widgets.BluetoothDeviceDialog import com.casic.endoscope.widgets.LineChartMarkerView import com.github.mikephil.charting.data.Entry @@ -44,7 +46,11 @@ import com.hikvision.netsdk.NET_DVR_PREVIEWINFO import com.hikvision.netsdk.NET_DVR_SERIALSTART_V40 import com.hikvision.netsdk.PTZCommand +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets +import com.pengxh.kt.lite.extensions.dp2px import com.pengxh.kt.lite.extensions.getStatusBarHeight import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -53,6 +59,7 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +import java.io.File import java.text.SimpleDateFormat import java.util.Date import java.util.Locale @@ -69,12 +76,14 @@ private val hkSDK by lazy { HCNetSDK.getInstance() } private val bleDeviceManager by lazy { BleDeviceManager(this) } private val timeFormat by lazy { SimpleDateFormat("yyyyMMddHHmmss", Locale.CHINA) } + private val marginOffset by lazy { 10.dp2px(this) } private val selectedSpeed = 7 private val messageCode = 2024021901 private val bluetoothDevices = ArrayList() private val xAxisLabels = ArrayList() private val densityEntries = ArrayList() private val lineDataSets = ArrayList() + private val recyclerViewImages = ArrayList() //趋势线起点X坐标 private var i = 0 @@ -103,15 +112,26 @@ private lateinit var serviceIntent: Intent private lateinit var dataSet: LineDataSet private lateinit var lineData: LineData + private lateinit var imageAdapter: NormalRecyclerAdapter override fun initViewBinding(): ActivityMainBinding { return ActivityMainBinding.inflate(layoutInflater) } - override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(this) + init { +// recyclerViewImages.add("/storage/emulated/0/Android/data/com.casic.endoscope/files/Pictures/2024-04-11/20240411170908.png") +// recyclerViewImages.add("/storage/emulated/0/Android/data/com.casic.endoscope/files/Pictures/2024-04-11/20240411170908.png") +// recyclerViewImages.add("/storage/emulated/0/Android/data/com.casic.endoscope/files/Pictures/2024-04-11/20240411170908.png") +// recyclerViewImages.add("/storage/emulated/0/Android/data/com.casic.endoscope/files/Pictures/2024-04-11/20240411170908.png") +// recyclerViewImages.add("/storage/emulated/0/Android/data/com.casic.endoscope/files/Pictures/2024-04-11/20240411170908.png") +// recyclerViewImages.add("/storage/emulated/0/Android/data/com.casic.endoscope/files/Pictures/2024-04-11/20240411170908.png") +// recyclerViewImages.add("/storage/emulated/0/Android/data/com.casic.endoscope/files/Pictures/2024-04-11/20240411170908.png") +// recyclerViewImages.add("/storage/emulated/0/Android/data/com.casic.endoscope/files/Pictures/2024-04-11/20240411170908.png") + } + override fun initOnCreate(savedInstanceState: Bundle?) { //显示数据 + weakReferenceHandler = WeakReferenceHandler(this) weakReferenceHandler.sendEmptyMessage(messageCode) serviceIntent = Intent(this, VideoTranscodeService::class.java) @@ -130,14 +150,6 @@ startService(serviceIntent) } - override fun handleMessage(msg: Message): Boolean { - if (msg.what == messageCode) { - //绑定数据 - - } - return true - } - override fun initEvent() { binding.openAlbumButton.setOnClickListener { if (isPreviewSuccess) { @@ -380,6 +392,9 @@ if (MessageCodeHub.getErrorCode() == 0) { "画面抓取成功".show(this) binding.imageButton.isEnabled = true + //刷新右侧预览界面 + recyclerViewImages.add(imagePath) + imageAdapter.notifyDataSetChanged() } } else { "摄像头预览未打开,无法拍照".show(this) @@ -411,6 +426,50 @@ } } + override fun handleMessage(msg: Message): Boolean { + if (msg.what == messageCode) { + //绑定数据 + imageAdapter = object : NormalRecyclerAdapter( + R.layout.item_image_rv_g, recyclerViewImages + ) { + override fun convertView(viewHolder: ViewHolder, position: Int, item: String) { + viewHolder.setImageResource(R.id.imageView, item) + viewHolder.setOnLongClickListener(R.id.imageView) { + AlertControlDialog.Builder() + .setContext(context) + .setTitle("温馨提示") + .setMessage("是否保存此图片?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + + } + + override fun onCancelClick() { + //删除图片 + recyclerViewImages.remove(item) + File(item).delete() + imageAdapter.notifyDataSetChanged() + } + }).build().show() + true + } + + viewHolder.setOnClickListener(R.id.imageView) { + //查看大图Dialog + } + } + } + binding.recyclerView.addItemDecoration( + RecyclerViewItemOffsets(marginOffset, marginOffset, marginOffset, marginOffset) + ) + binding.recyclerView.adapter = imageAdapter + } + return true + } + private fun showScanResult() { BluetoothDeviceDialog.Builder().setContext(this).setDeviceArray(bluetoothDevices) .setNegativeButton("取消").setOnDialogButtonClickListener(object : diff --git a/app/src/main/java/com/casic/endoscope/widgets/AddCameraPointDialog.kt b/app/src/main/java/com/casic/endoscope/widgets/AddCameraPointDialog.kt deleted file mode 100644 index 9401648..0000000 --- a/app/src/main/java/com/casic/endoscope/widgets/AddCameraPointDialog.kt +++ /dev/null @@ -1,107 +0,0 @@ -package com.casic.endoscope.widgets - -import android.app.Dialog -import android.content.Context -import android.os.Bundle -import android.view.View -import com.casic.endoscope.R -import com.casic.endoscope.databinding.DialogAddCameraPointBinding -import com.pengxh.kt.lite.extensions.binding -import com.pengxh.kt.lite.extensions.initDialogLayoutParams -import com.pengxh.kt.lite.extensions.show - -class AddCameraPointDialog private constructor(builder: Builder) : Dialog( - builder.context, R.style.UserDefinedDialogStyle -) { - private val kTag = "AddCameraPointDialog" - private val ctx = builder.context - private var step = builder.step - private val positiveBtn = builder.positiveBtn - private val negativeBtn = builder.negativeBtn - private val listener = builder.listener - - class Builder { - lateinit var context: Context - var step = 1 - lateinit var positiveBtn: String - lateinit var negativeBtn: String - lateinit var listener: OnDialogButtonClickListener - - fun setContext(context: Context): Builder { - this.context = context - return this - } - - fun setLastStep(step: Int): Builder { - this.step = step - return this - } - - fun setPositiveButton(name: String): Builder { - positiveBtn = name - return this - } - - fun setNegativeButton(name: String): Builder { - negativeBtn = name - return this - } - - fun setOnDialogButtonClickListener(listener: OnDialogButtonClickListener): Builder { - this.listener = listener - return this - } - - fun build(): AddCameraPointDialog { - return AddCameraPointDialog(this) - } - } - - private val binding: DialogAddCameraPointBinding by binding() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - this.initDialogLayoutParams(0.3f) - setContentView(R.layout.dialog_add_camera_point) - setCanceledOnTouchOutside(false) - initView() - } - - private fun initView() { - //默认继续排序 - binding.continueStepView.isChecked = true - - binding.cancelButton.text = negativeBtn - binding.cancelButton.setOnClickListener { - listener.onCancelClick() - dismiss() - } - - binding.confirmButton.text = positiveBtn - binding.confirmButton.setOnClickListener(View.OnClickListener { - val hAngle: String = binding.hAngleView.text.toString().trim() - if (hAngle.isBlank()) { - "水平角度输入错误,请检查!".show(ctx) - return@OnClickListener - } - - val vAngle: String = binding.vAngleView.text.toString().trim() - if (vAngle.isBlank()) { - "垂直角度输入错误,请检查!".show(ctx) - return@OnClickListener - } - if (binding.continueStepView.isChecked) { - listener.onConfirmClick(++step, hAngle.toInt(), vAngle.toInt()) - } else { - listener.onConfirmClick(1, hAngle.toInt(), vAngle.toInt()) - } - dismiss() - }) - } - - interface OnDialogButtonClickListener { - fun onConfirmClick(step: Int, hAngle: Int, vAngle: Int) - - fun onCancelClick() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/endoscope/widgets/AlertControlDialog.kt b/app/src/main/java/com/casic/endoscope/widgets/AlertControlDialog.kt new file mode 100644 index 0000000..bffbb3c --- /dev/null +++ b/app/src/main/java/com/casic/endoscope/widgets/AlertControlDialog.kt @@ -0,0 +1,102 @@ +package com.casic.endoscope.widgets + +import android.app.Dialog +import android.content.Context +import android.os.Bundle +import com.casic.endoscope.R +import com.casic.endoscope.databinding.DialogAlertBinding +import com.pengxh.kt.lite.extensions.binding +import com.pengxh.kt.lite.extensions.initDialogLayoutParams + +class AlertControlDialog private constructor(builder: Builder) : Dialog( + builder.context, R.style.UserDefinedDialogStyle +) { + private val title = builder.title + private val message = builder.message + private val positiveBtn = builder.positiveBtn + private val negativeBtn = builder.negativeBtn + private val listener = builder.listener + + class Builder { + lateinit var context: Context + lateinit var title: String + lateinit var message: String + lateinit var positiveBtn: String + lateinit var negativeBtn: String + lateinit var listener: OnDialogButtonClickListener + + fun setContext(context: Context): Builder { + this.context = context + return this + } + + fun setTitle(title: String): Builder { + this.title = title + return this + } + + fun setMessage(message: String): Builder { + this.message = message + return this + } + + fun setPositiveButton(name: String): Builder { + positiveBtn = name + return this + } + + fun setNegativeButton(name: String): Builder { + negativeBtn = name + return this + } + + fun setOnDialogButtonClickListener(listener: OnDialogButtonClickListener): Builder { + this.listener = listener + return this + } + + fun build(): AlertControlDialog { + return AlertControlDialog(this) + } + } + + private val binding: DialogAlertBinding by binding() + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + this.initDialogLayoutParams(0.3f) + setContentView(R.layout.dialog_alert) + setCancelable(false) + setCanceledOnTouchOutside(false) + initView() + } + + private fun initView() { + if (title.isNotBlank()) { + binding.dialogTitleView.text = title + } + if (message.isNotBlank()) { + binding.dialogMessageView.text = message + } + if (negativeBtn.isNotBlank()) { + binding.dialogCancelButton.text = negativeBtn + } + binding.dialogCancelButton.setOnClickListener { + listener.onCancelClick() + dismiss() + } + if (positiveBtn.isNotBlank()) { + binding.dialogConfirmButton.text = positiveBtn + } + binding.dialogConfirmButton.setOnClickListener { + listener.onConfirmClick() + dismiss() + } + } + + interface OnDialogButtonClickListener { + fun onConfirmClick() + + fun onCancelClick() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/endoscope/widgets/DirectionControlView.kt b/app/src/main/java/com/casic/endoscope/widgets/DirectionControlView.kt deleted file mode 100644 index 0e6ec4a..0000000 --- a/app/src/main/java/com/casic/endoscope/widgets/DirectionControlView.kt +++ /dev/null @@ -1,404 +0,0 @@ -package com.casic.endoscope.widgets - -import android.content.Context -import android.graphics.BlurMaskFilter -import android.graphics.Canvas -import android.graphics.Color -import android.graphics.Paint -import android.graphics.Path -import android.graphics.Rect -import android.util.AttributeSet -import android.util.Log -import android.view.MotionEvent -import android.view.View -import com.casic.endoscope.R -import com.pengxh.kt.lite.extensions.dp2px -import kotlin.math.acos -import kotlin.math.cos -import kotlin.math.hypot -import kotlin.math.pow -import kotlin.math.sin -import kotlin.math.sqrt - -class DirectionControlView constructor(context: Context, attrs: AttributeSet) : - View(context, attrs), View.OnTouchListener { - - private val kTag = "DirectionControlView" - private val maskFilter = BlurMaskFilter(15f, BlurMaskFilter.Blur.SOLID) - - //View中心X坐标 - private var centerX = 0f - - //View中心Y坐标 - private var centerY = 0f - - private lateinit var tickPaint: Paint - private lateinit var outerPaint: Paint - private lateinit var innerPaint: Paint - - //View属性 - private val circleRadius: Int - private val outerColor: Int - private val outerStroke: Int - private val innerRadius: Int - private val innerColor: Int - private val innerStroke: Int - private val renderColor: Int - - //滑动圆的圆心 - private var moveCircleX = 0f - private var moveCircleY = 0f - - //控件外边界 - private val viewRadius: Int - private val rect: Rect - - private val maxMoveRadius: Int - private lateinit var directionPaints: ArrayList - private lateinit var leftPath: Path - private lateinit var topPath: Path - private lateinit var rightPath: Path - private lateinit var bottomPath: Path - - // 各方位状态 - private var leftTurn = false - private var topTurn = false - private var rightTurn = false - private var bottomTurn = false - - init { - val attr = context.obtainStyledAttributes(attrs, R.styleable.DirectionControlView) - circleRadius = attr.getDimensionPixelOffset( - R.styleable.DirectionControlView_ctrl_radius, 150 - ) - //中心圆半径 - innerRadius = circleRadius / 3 - - outerColor = attr.getColor(R.styleable.DirectionControlView_ctrl_outer_color, Color.LTGRAY) - outerStroke = attr.getDimensionPixelOffset( - R.styleable.DirectionControlView_ctrl_outer_stroke, 3 - ) - innerColor = attr.getColor(R.styleable.DirectionControlView_ctrl_inner_color, Color.WHITE) - innerStroke = attr.getDimensionPixelOffset( - R.styleable.DirectionControlView_ctrl_inner_stroke, 3 - ) - renderColor = attr.getColor(R.styleable.DirectionControlView_ctrl_render_color, Color.BLUE) - attr.recycle() - - //辅助框 - viewRadius = circleRadius + 5.dp2px(context) - rect = Rect(-viewRadius, -viewRadius, viewRadius, viewRadius) - - //滑动圆心最大距离 - maxMoveRadius = innerRadius * 2 - - //初始化画笔 - initPaint() - - //事件监听 - setOnTouchListener(this) - } - - private fun initPaint() { - tickPaint = Paint() - tickPaint.color = Color.DKGRAY - tickPaint.style = Paint.Style.STROKE - tickPaint.strokeWidth = 1f - tickPaint.isAntiAlias = true - - outerPaint = Paint() - outerPaint.color = outerColor - outerPaint.style = Paint.Style.STROKE - outerPaint.strokeWidth = outerStroke.toFloat() - outerPaint.isAntiAlias = true - - innerPaint = Paint() - innerPaint.color = innerColor - innerPaint.style = Paint.Style.FILL - innerPaint.isAntiAlias = true - //设置光晕 - innerPaint.maskFilter = maskFilter - - /** - * 左上右下 - * */ - directionPaints = createDirectionPaint() - - //箭头顶点距离圆心的距离 - val distance = maxMoveRadius * 1.35f - //箭头每边长 - val l = innerRadius * 0.25f - //箭头顶点与圆心的连线,箭头边长之间的夹角 - val cos = cos(Math.PI / 4).toFloat() - val sin = sin(Math.PI / 4).toFloat() - - leftPath = Path() - leftPath.moveTo(-distance, 0f) - leftPath.lineTo(-distance + l * cos, -l * sin) - leftPath.moveTo(-distance, 0f) - leftPath.lineTo(-distance + l * cos, l * sin) - - topPath = Path() - topPath.moveTo(0f, -distance) - topPath.lineTo(-l * cos, -distance + l * sin) - topPath.moveTo(0f, -distance) - topPath.lineTo(l * cos, -distance + l * sin) - - rightPath = Path() - rightPath.moveTo(distance, 0f) - rightPath.lineTo(distance - l * cos, -l * sin) - rightPath.moveTo(distance, 0f) - rightPath.lineTo(distance - l * cos, l * sin) - - bottomPath = Path() - bottomPath.moveTo(0f, distance) - bottomPath.lineTo(-l * cos, distance - l * sin) - bottomPath.moveTo(0f, distance) - bottomPath.lineTo(l * cos, distance - l * sin) - } - - //批量创建画笔 - private fun createDirectionPaint(): ArrayList { - val result = ArrayList() - for (i in 0 until 4) { - val paint = Paint() - paint.color = innerColor - paint.style = Paint.Style.STROKE - paint.strokeCap = Paint.Cap.ROUND - paint.strokeWidth = innerStroke.toFloat() - paint.isAntiAlias = true - //设置光晕 - paint.maskFilter = maskFilter - - result.add(paint) - } - return result - } - - override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) { - super.onSizeChanged(w, h, oldw, oldh) - centerX = (w shr 1).toFloat() - centerY = (h shr 1).toFloat() - } - - override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { - super.onMeasure(widthMeasureSpec, heightMeasureSpec) - val widthSpecMode = MeasureSpec.getMode(widthMeasureSpec) - val widthSpecSize = MeasureSpec.getSize(widthMeasureSpec) - val heightSpecMode = MeasureSpec.getMode(heightMeasureSpec) - val heightSpecSize = MeasureSpec.getSize(heightMeasureSpec) - // 获取宽 - val mWidth: Int = if (widthSpecMode == MeasureSpec.EXACTLY) { - // match_parent/精确值 - widthSpecSize - } else { - // wrap_content,外边界宽 - (viewRadius * 2) - } - // 获取高 - val mHeight: Int = if (heightSpecMode == MeasureSpec.EXACTLY) { - // match_parent/精确值 - heightSpecSize - } else { - // wrap_content,外边界高 - (viewRadius * 2) - } - // 设置该view的宽高 - setMeasuredDimension(mWidth, mHeight) - } - - override fun onDraw(canvas: Canvas) { - super.onDraw(canvas) - /** - * 画布移到中心位置,方便绘制一系列图形 - */ - canvas.translate(centerX, centerY) - -// drawGuides(canvas) - - //画外圆 - canvas.drawCircle(0f, 0f, circleRadius.toFloat(), outerPaint) - - //画内圆 - canvas.drawCircle(moveCircleX, moveCircleY, innerRadius.toFloat(), innerPaint) - - //画上下左右箭头 - canvas.drawPath(leftPath, directionPaints[0]) - canvas.drawPath(topPath, directionPaints[1]) - canvas.drawPath(rightPath, directionPaints[2]) - canvas.drawPath(bottomPath, directionPaints[3]) - } - - override fun onTouch(v: View, event: MotionEvent): Boolean { - val action = event.action - val x = event.x - val y = event.y - when (action) { - MotionEvent.ACTION_DOWN -> { - Log.d(kTag, "onTouch => 按下") - } - - MotionEvent.ACTION_MOVE -> { - /** - * 计算可滑动圆的圆心位置 - * */ - var deltaX = x - circleRadius - val deltaY = y - circleRadius - - //计算滑动的圆心距离圆心的距离。hypot 表示平方和的开平方 - var distance = hypot(deltaX, deltaY) - if (distance >= maxMoveRadius) { - distance = maxMoveRadius.toFloat() - } - - if (deltaX >= maxMoveRadius) { - deltaX = maxMoveRadius - 0.00001f - } else if (deltaX < -maxMoveRadius) { - deltaX = -maxMoveRadius + 0.00001f - } - - moveCircleX = deltaX - val tempY = distance.pow(2) - deltaX.pow(2) - moveCircleY = if (deltaY < 0) { - -sqrt(tempY) - } else { - sqrt(tempY) - } - - if (distance >= innerRadius) { - Log.d(kTag, "onTouch => $distance, $deltaX, $tempY, $moveCircleY") - val arcCos = acos(deltaX / distance) - val degree = Math.toDegrees(arcCos.toDouble()) - if (degree in 45.0..135.0) { - if (moveCircleY < 0) { - updateDirectionColor(ControlDirection.TOP) - } else { - updateDirectionColor(ControlDirection.BOTTOM) - } - } else { - if (moveCircleX < 0) { - updateDirectionColor(ControlDirection.LEFT) - } else { - updateDirectionColor(ControlDirection.RIGHT) - } - } - } else { - Log.d(kTag, "onTouch => 点击了中心") - } - } - - MotionEvent.ACTION_UP -> { - moveCircleX = 0f - moveCircleY = 0f - - directionPaints.forEach { it.color = Color.WHITE } - } - } - invalidate() - return true - } - - private fun updateDirectionColor(direction: ControlDirection) { - when (direction) { - ControlDirection.LEFT -> { - directionPaints[0].color = renderColor - for (i in 1 until directionPaints.size) { - directionPaints[i].color = Color.WHITE - } - } - - ControlDirection.TOP -> { - directionPaints[0].color = Color.WHITE - directionPaints[1].color = renderColor - directionPaints[2].color = Color.WHITE - directionPaints[3].color = Color.WHITE - } - - ControlDirection.RIGHT -> { - directionPaints[0].color = Color.WHITE - directionPaints[1].color = Color.WHITE - directionPaints[2].color = renderColor - directionPaints[3].color = Color.WHITE - } - - ControlDirection.BOTTOM -> { - for (i in 0 until directionPaints.size - 1) { - directionPaints[i].color = Color.WHITE - } - directionPaints[3].color = renderColor - } - } - } - - /** - * 辅助线 - * */ - private fun drawGuides(canvas: Canvas) { - //最外层方框,即自定义View的边界 - canvas.drawRect(rect, tickPaint) - - //触摸圆可到达的最大圆 - canvas.drawCircle(0f, 0f, (innerRadius * 2).toFloat(), tickPaint) - - //中心横线 - canvas.drawLine(-viewRadius.toFloat(), 0f, viewRadius.toFloat(), 0f, tickPaint) - - //中心竖线 - canvas.drawLine(0f, -viewRadius.toFloat(), 0f, viewRadius.toFloat(), tickPaint) - - //对角线 - canvas.drawLine( - -viewRadius.toFloat(), -viewRadius.toFloat(), - viewRadius.toFloat(), viewRadius.toFloat(), - tickPaint - ) - - canvas.drawLine( - -viewRadius.toFloat(), viewRadius.toFloat(), - viewRadius.toFloat(), -viewRadius.toFloat(), - tickPaint - ) - } - - enum class ControlDirection { - LEFT, TOP, RIGHT, BOTTOM - } - - private var listener: OnWheelTouchListener? = null - - fun setOnWheelTouchListener(listener: OnWheelTouchListener?) { - this.listener = listener - } - - interface OnWheelTouchListener { - /** - * 中间 - */ - fun onCenterClicked() - - /** - * 左 - */ - fun onLeftTurn() - - /** - * 上 - */ - fun onTopTurn() - - /** - * 右 - */ - fun onRightTurn() - - /** - * 下 - */ - fun onBottomTurn() - - /** - * 松开 - */ - fun onActionTurnUp(dir: ControlDirection) - } -} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_album.xml b/app/src/main/res/layout/activity_album.xml index cf06f5a..3474fb0 100644 --- a/app/src/main/res/layout/activity_album.xml +++ b/app/src/main/res/layout/activity_album.xml @@ -33,13 +33,16 @@ android:id="@+id/ascButton" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:layout_margin="@dimen/dp_7" + android:background="@drawable/selector_scale_button" android:text="时间升序" />