From b446a2562ab0ec714664997d9fc1e5f0e4d25d74 Mon Sep 17 00:00:00 2001 From: squallzhjch Date: Mon, 24 Apr 2023 15:34:44 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9UI=E9=83=A8=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/navinfo/omqs/Constant.kt | 5 + .../http/taskdownload/TaskDownloadScope.kt | 11 +- .../com/navinfo/omqs/tools/FileManager.kt | 66 ++- .../omqs/ui/activity/map/MainViewModel.kt | 2 +- .../EvaluationResultViewModel.kt | 4 +- .../ui/fragment/tasklist/TaskListAdapter.kt | 14 +- .../ui/fragment/tasklist/TaskListFragment.kt | 5 +- .../ui/fragment/tasklist/TaskListViewModel.kt | 7 +- .../drawable-v24/baseline_camera_alt_24.xml | 6 + .../baseline_delete_forever_24.xml | 0 .../baseline_keyboard_voice_24.xml | 2 +- .../baseline_map_24.xml | 0 .../baseline_my_location_24.xml | 0 .../baseline_person_24.xml | 0 .../baseline_save_24.xml | 0 .../ic_baseline_import_export_24.xml | 0 app/src/main/res/layout/adapter_task_list.xml | 40 +- .../res/layout/fragment_evaluation_result.xml | 82 +-- .../main/res/layout/fragment_task_list.xml | 24 +- .../map/handler/LayerManagerHandler.kt | 433 +--------------- .../library/map/handler/MarkHandler.kt | 465 +++++++++++++++++- 21 files changed, 672 insertions(+), 494 deletions(-) create mode 100644 app/src/main/res/drawable-v24/baseline_camera_alt_24.xml rename app/src/main/res/{drawable => drawable-v24}/baseline_delete_forever_24.xml (100%) rename app/src/main/res/{drawable => drawable-v24}/baseline_keyboard_voice_24.xml (89%) rename app/src/main/res/{drawable => drawable-v24}/baseline_map_24.xml (100%) rename app/src/main/res/{drawable => drawable-v24}/baseline_my_location_24.xml (100%) rename app/src/main/res/{drawable => drawable-v24}/baseline_person_24.xml (100%) rename app/src/main/res/{drawable => drawable-v24}/baseline_save_24.xml (100%) rename app/src/main/res/{drawable => drawable-v24}/ic_baseline_import_export_24.xml (100%) diff --git a/app/src/main/java/com/navinfo/omqs/Constant.kt b/app/src/main/java/com/navinfo/omqs/Constant.kt index 6612fdc2..4bf4f215 100644 --- a/app/src/main/java/com/navinfo/omqs/Constant.kt +++ b/app/src/main/java/com/navinfo/omqs/Constant.kt @@ -24,6 +24,11 @@ class Constant { */ lateinit var OFFLINE_MAP_PATH: String + /** + * 下载目录 + */ + lateinit var DOWNLOAD_PATH: String + /** * 服务器地址 */ diff --git a/app/src/main/java/com/navinfo/omqs/http/taskdownload/TaskDownloadScope.kt b/app/src/main/java/com/navinfo/omqs/http/taskdownload/TaskDownloadScope.kt index 6e698de6..15694cb1 100644 --- a/app/src/main/java/com/navinfo/omqs/http/taskdownload/TaskDownloadScope.kt +++ b/app/src/main/java/com/navinfo/omqs/http/taskdownload/TaskDownloadScope.kt @@ -104,13 +104,13 @@ class TaskDownloadScope( var randomAccessFile: RandomAccessFile? = null try { //创建离线地图 下载文件夹,.map文件夹的下一级 - val fileDir = File("${Constant.OFFLINE_MAP_PATH}download") + val fileDir = File("${Constant.DOWNLOAD_PATH}download") if (!fileDir.exists()) { fileDir.mkdirs() } val fileTemp = - File("${Constant.OFFLINE_MAP_PATH}download/${taskBean.id}_${taskBean.dataVersion}") + File("${Constant.DOWNLOAD_PATH}${taskBean.id}_${taskBean.dataVersion}") val startPosition = taskBean.currentSize //验证断点有效性 if (startPosition < 0) throw IOException("jingo Start position less than zero") @@ -119,8 +119,13 @@ class TaskDownloadScope( url = taskBean.getDownLoadUrl() ) val responseBody = response.body() + change(FileDownloadStatus.LOADING) responseBody ?: throw IOException("jingo ResponseBody is null") + + if (startPosition == 0L) { + taskBean.fileSize = responseBody.contentLength() + } //写入文件 randomAccessFile = RandomAccessFile(fileTemp, "rwd") randomAccessFile.seek(startPosition) @@ -144,7 +149,7 @@ class TaskDownloadScope( Log.e("jingo", "文件下载完成 ${taskBean.currentSize} == ${taskBean.fileSize}") if (taskBean.currentSize == taskBean.fileSize) { val res = - fileTemp.renameTo(File("${Constant.OFFLINE_MAP_PATH}${taskBean.evaluationTaskName}.zip")) + fileTemp.renameTo(File("${Constant.DOWNLOAD_PATH}${taskBean.evaluationTaskName}.zip")) Log.e("jingo", "文件下载完成 修改文件 $res") change(FileDownloadStatus.DONE) } else { diff --git a/app/src/main/java/com/navinfo/omqs/tools/FileManager.kt b/app/src/main/java/com/navinfo/omqs/tools/FileManager.kt index df942398..4b0aa70d 100644 --- a/app/src/main/java/com/navinfo/omqs/tools/FileManager.kt +++ b/app/src/main/java/com/navinfo/omqs/tools/FileManager.kt @@ -3,6 +3,7 @@ package com.navinfo.omqs.tools import android.content.Context import com.navinfo.omqs.Constant import com.navinfo.omqs.bean.OfflineMapCityBean +import com.navinfo.omqs.bean.TaskBean import java.io.File class FileManager { @@ -20,13 +21,14 @@ class FileManager { } //初始化数据文件夹 - fun initRootDir(context:Context){ + fun initRootDir(context: Context) { // 在SD卡创建项目目录 val sdCardPath = context.getExternalFilesDir(null) sdCardPath?.let { Constant.ROOT_PATH = sdCardPath.absolutePath Constant.MAP_PATH = Constant.ROOT_PATH + "/map/" Constant.OFFLINE_MAP_PATH = Constant.MAP_PATH + "offline/" + Constant.DOWNLOAD_PATH = Constant.ROOT_PATH + "/download/" val file = File(Constant.MAP_PATH) if (!file.exists()) { file.mkdirs() @@ -37,7 +39,7 @@ class FileManager { with(File(Constant.DATA_PATH)) { if (!this.exists()) this.mkdirs() } - }else{ + } else { Constant.DATA_PATH = Constant.ROOT_PATH + "/data/" } } @@ -102,5 +104,65 @@ class FileManager { } } } + + /** + * 检查离线地图文件 + */ + suspend fun checkOMDBFileInfo(taskBean: TaskBean) { + //访问离线地图文件夹 + val fileDir = File("${Constant.DOWNLOAD_PATH}") + //如果连本地文件夹还没有,就不用修改任何数据了 + if (!fileDir.exists()) { + return + } + //访问离线地图临时下载文件夹 + val fileTempDir = File(Constant.DOWNLOAD_PATH) + //是否有一份.map文件了 + var mapFile: File? = null + //文件夹里文件挨个访问 + for (item in fileDir.listFiles()) { + //先找到对应的省市文件,例如:540000_西藏自治区_20230401195018.map",以id开头 + if (item.isFile && item.name.startsWith("${taskBean.id}_")) { + //如果本地文件与从网络获取到版本号一致,表示这个文件已经下载完毕,不用处理了 + if (item.name == "${taskBean.id}_${taskBean.dataVersion}") { + taskBean.status = FileDownloadStatus.DONE + return + } + //文件存在,版本号不对应,留给下面流程处理 + mapFile = item + break + } + } + //临时下载文件夹 + if (fileTempDir.exists()) { + for (item in fileTempDir.listFiles()) { + //先找到对应的省市文件,例如:540000_20230401195018",以id开头 + if (item.isFile && item.name.startsWith("${taskBean.id}_")) { + //如果本地文件与从网络获取到版本号一致,表示这个文件已经在下载列表中 + if (item.name == "${taskBean.id}_${taskBean.dataVersion}") { + //如果这个临时文件的大小和下载大小是一致的,说明已经下载完了,但是在下载环节没有更名移动成功,需要重命名和移动文件夹 + if (item.length() == taskBean.fileSize) { + //移动更名文件后删除旧数据,修改状态 + if (item.renameTo(File("${Constant.OFFLINE_MAP_PATH}${taskBean.evaluationTaskName}.zip"))) { + //删除旧版本数据 + mapFile?.delete() + taskBean.status = FileDownloadStatus.DONE + return + } + } else { // 临时文件大小和目标不一致,说明下载了一半 + taskBean.status = FileDownloadStatus.PAUSE + taskBean.currentSize = item.length() + return + } + } else { //虽然省市id开头一致,但是版本号不一致,说明之前版本下载了一部分,现在要更新了,原来下载的文件直接删除 + taskBean.status = FileDownloadStatus.UPDATE + item.delete() + return + } + break + } + } + } + } } } \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt index 76aba0e5..29e1f66e 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt @@ -39,7 +39,7 @@ class MainViewModel @Inject constructor( private var niLocationList: MutableList = ArrayList() init { - mapController.layerManagerHandler.setOnQsRecordItemClickListener(object : + mapController.markerHandle.setOnQsRecordItemClickListener(object : OnQsRecordItemClickListener { override fun onQsRecordList(list: MutableList) { liveDataQsRecordIdList.value = list diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt index 9f2cc68e..01b4c6a7 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt @@ -212,7 +212,7 @@ class EvaluationResultViewModel @Inject constructor( it.copyToRealmOrUpdate(liveDataQsRecordBean.value) } // realm.close() - mapController.layerManagerHandler.addOrUpdateQsRecordMark(liveDataQsRecordBean.value!!) + mapController.markerHandle.addOrUpdateQsRecordMark(liveDataQsRecordBean.value!!) liveDataFinish.postValue(true) } } @@ -228,7 +228,7 @@ class EvaluationResultViewModel @Inject constructor( objects?.deleteFromRealm() } // realm.close() - mapController.layerManagerHandler.removeQsRecordMark(liveDataQsRecordBean.value!!) + mapController.markerHandle.removeQsRecordMark(liveDataQsRecordBean.value!!) liveDataFinish.postValue(true) } } diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListAdapter.kt index 8c03439a..8e3ab8f8 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListAdapter.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListAdapter.kt @@ -23,7 +23,7 @@ import com.navinfo.omqs.ui.other.BaseViewHolder *使用 LifecycleRegistry 给 ViewHolder 分发生命周期(这里使用了这个) */ class TaskListAdapter( - private val downloadManager: TaskDownloadManager, private val context: Context + private val downloadManager: TaskDownloadManager ) : BaseRecyclerViewAdapter() { @@ -70,6 +70,8 @@ class TaskListAdapter( binding.taskDownloadBtn.tag = position binding.taskDownloadBtn.setOnClickListener(downloadBtnClick) binding.taskName.text = taskBean.evaluationTaskName + binding.taskCityName.text = taskBean.cityName + binding.taskDataVersion.text = "版本号:${taskBean.dataVersion}" // binding.offlineMapCitySize.text = cityBean.getFileSizeText() } @@ -82,10 +84,12 @@ class TaskListAdapter( } - private fun changeViews(binding: AdapterTaskListBinding, cityBean: TaskBean) { - binding.taskProgress.progress = - (cityBean.currentSize * 100 / cityBean.fileSize).toInt() - when (cityBean.status) { + private fun changeViews(binding: AdapterTaskListBinding, taskBean: TaskBean) { + if (taskBean.fileSize > 0L) { + binding.taskProgress.progress = + (taskBean.currentSize * 100 / taskBean.fileSize).toInt() + } + when (taskBean.status) { FileDownloadStatus.NONE -> { if (binding.taskProgress.visibility == View.VISIBLE) binding.taskProgress.visibility = View.INVISIBLE diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListFragment.kt index 682318cf..55e149d9 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListFragment.kt @@ -5,6 +5,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.viewModels +import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.LinearLayoutManager import com.navinfo.omqs.databinding.FragmentTaskListBinding import com.navinfo.omqs.http.taskdownload.TaskDownloadManager @@ -22,7 +23,6 @@ class TaskListFragment : BaseFragment(){ private val adapter: TaskListAdapter by lazy { TaskListAdapter( downloadManager, - requireContext() ) } @@ -46,6 +46,9 @@ class TaskListFragment : BaseFragment(){ adapter.refreshData(it) } viewModel.getTaskList(requireContext()) + binding.taskBack.setOnClickListener{ + findNavController().navigateUp() + } } override fun onDestroyView() { diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListViewModel.kt index 3aab833b..d8825811 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListViewModel.kt @@ -52,8 +52,11 @@ class TaskListViewModel @Inject constructor( else -> {} } val objects = realm.where(TaskBean::class.java).findAll() - liveDataTaskList.postValue(realm.copyFromRealm(objects)) -// realm.close() + val taskList = realm.copyFromRealm(objects) + for(item in taskList){ + FileManager.checkOMDBFileInfo(item) + } + liveDataTaskList.postValue(taskList) } } diff --git a/app/src/main/res/drawable-v24/baseline_camera_alt_24.xml b/app/src/main/res/drawable-v24/baseline_camera_alt_24.xml new file mode 100644 index 00000000..a939a65c --- /dev/null +++ b/app/src/main/res/drawable-v24/baseline_camera_alt_24.xml @@ -0,0 +1,6 @@ + + + + diff --git a/app/src/main/res/drawable/baseline_delete_forever_24.xml b/app/src/main/res/drawable-v24/baseline_delete_forever_24.xml similarity index 100% rename from app/src/main/res/drawable/baseline_delete_forever_24.xml rename to app/src/main/res/drawable-v24/baseline_delete_forever_24.xml diff --git a/app/src/main/res/drawable/baseline_keyboard_voice_24.xml b/app/src/main/res/drawable-v24/baseline_keyboard_voice_24.xml similarity index 89% rename from app/src/main/res/drawable/baseline_keyboard_voice_24.xml rename to app/src/main/res/drawable-v24/baseline_keyboard_voice_24.xml index 50ea1620..70a2cb47 100644 --- a/app/src/main/res/drawable/baseline_keyboard_voice_24.xml +++ b/app/src/main/res/drawable-v24/baseline_keyboard_voice_24.xml @@ -1,4 +1,4 @@ - diff --git a/app/src/main/res/drawable/baseline_map_24.xml b/app/src/main/res/drawable-v24/baseline_map_24.xml similarity index 100% rename from app/src/main/res/drawable/baseline_map_24.xml rename to app/src/main/res/drawable-v24/baseline_map_24.xml diff --git a/app/src/main/res/drawable/baseline_my_location_24.xml b/app/src/main/res/drawable-v24/baseline_my_location_24.xml similarity index 100% rename from app/src/main/res/drawable/baseline_my_location_24.xml rename to app/src/main/res/drawable-v24/baseline_my_location_24.xml diff --git a/app/src/main/res/drawable/baseline_person_24.xml b/app/src/main/res/drawable-v24/baseline_person_24.xml similarity index 100% rename from app/src/main/res/drawable/baseline_person_24.xml rename to app/src/main/res/drawable-v24/baseline_person_24.xml diff --git a/app/src/main/res/drawable/baseline_save_24.xml b/app/src/main/res/drawable-v24/baseline_save_24.xml similarity index 100% rename from app/src/main/res/drawable/baseline_save_24.xml rename to app/src/main/res/drawable-v24/baseline_save_24.xml diff --git a/app/src/main/res/drawable/ic_baseline_import_export_24.xml b/app/src/main/res/drawable-v24/ic_baseline_import_export_24.xml similarity index 100% rename from app/src/main/res/drawable/ic_baseline_import_export_24.xml rename to app/src/main/res/drawable-v24/ic_baseline_import_export_24.xml diff --git a/app/src/main/res/layout/adapter_task_list.xml b/app/src/main/res/layout/adapter_task_list.xml index e40e1db4..632c2578 100644 --- a/app/src/main/res/layout/adapter_task_list.xml +++ b/app/src/main/res/layout/adapter_task_list.xml @@ -6,26 +6,48 @@ android:layout_height="wrap_content" android:background="@color/cv_bg_color" android:paddingLeft="10dp" - android:paddingRight="10dp" android:paddingTop="5dp" + android:paddingRight="10dp" tools:context="com.navinfo.omqs.ui.fragment.tasklist.TaskListAdapter"> + + + + @@ -34,9 +56,9 @@ android:id="@+id/task_download_btn" style="@style/map_download_style_btn" android:layout_width="60dp" - android:layout_alignTop="@id/task_name" - android:layout_alignBottom="@id/task_size" android:layout_alignParentRight="true" + android:layout_centerVertical="true" + android:gravity="center" android:shadowColor="@android:color/transparent" android:text="下载" android:textColor="@color/btn_blue_solid" @@ -60,8 +82,8 @@ style="?android:attr/progressBarStyleHorizontal" android:layout_width="match_parent" android:layout_height="16dp" - android:layout_below="@id/task_download_btn" - android:progressDrawable="@drawable/progress_bg" + android:layout_below="@id/task_size" android:paddingTop="10dp" + android:progressDrawable="@drawable/progress_bg" android:visibility="invisible" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_evaluation_result.xml b/app/src/main/res/layout/fragment_evaluation_result.xml index d5abcfde..2b07c99f 100644 --- a/app/src/main/res/layout/fragment_evaluation_result.xml +++ b/app/src/main/res/layout/fragment_evaluation_result.xml @@ -4,10 +4,11 @@ xmlns:tools="http://schemas.android.com/tools"> + + type="com.navinfo.omqs.ui.fragment.evaluationresult.EvaluationResultFragment" /> + @@ -42,7 +43,7 @@ android:layout_height="0dp" android:layout_marginTop="10dp" android:padding="10dp" - app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintBottom_toTopOf="@id/evaluation_camera" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toBottomOf="@id/evaluation_appbar_layout"> @@ -59,77 +60,98 @@ + android:text="@{viewModel.liveDataQsRecordBean.classType}" /> + android:text="@{viewModel.liveDataQsRecordBean.problemType}" /> + android:text="@{viewModel.liveDataQsRecordBean.phenomenon}" /> + android:text="@{viewModel.liveDataQsRecordBean.problemLink}" /> + android:text="@{viewModel.liveDataQsRecordBean.cause}" /> + - - - - - + android:gravity="start" + android:hint="请输入备注信息" + android:inputType="textMultiLine" + android:lines="3" + android:maxLines="3" + android:text="@={viewModel.liveDataQsRecordBean.description}" /> - - - - - + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_task_list.xml b/app/src/main/res/layout/fragment_task_list.xml index fbd4259d..d7d7a393 100644 --- a/app/src/main/res/layout/fragment_task_list.xml +++ b/app/src/main/res/layout/fragment_task_list.xml @@ -7,6 +7,28 @@ android:background="@color/white" tools:context=".ui.fragment.tasklist.TaskListFragment"> + + + app:layout_constraintTop_toBottomOf="@id/task_title" /> - if (e == org.oscim.map.Map.SCALE_EVENT) { - itemizedLayer.isEnabled = mapPosition.getZoomLevel() >= 12 - } - }) + } @@ -197,405 +169,6 @@ open class LayerManagerHandler(context: AppCompatActivity, mapView: NIMapView,tr mMapView.updateMap() } - fun setOnQsRecordItemClickListener(listener: OnQsRecordItemClickListener?) { - itemListener = listener - } - - /** - * 增加或更新marker - */ - suspend fun addOrUpdateQsRecordMark(data: QsRecordBean) { - for (item in itemizedLayer.itemList) { - if (item is MarkerItem) { - if (item.title == data.id) { - itemizedLayer.itemList.remove(item) - break - } - } - } - createMarkerItem(data) - withContext(Dispatchers.Main) { - mMapView.updateMap(true) - } - - } - - - /** - * 删除marker - */ - suspend fun removeQsRecordMark(data: QsRecordBean) { - for (item in itemizedLayer.itemList) { - if (item is MarkerItem) { - if (item.title == data.id) { - itemizedLayer.itemList.remove(item) - itemizedLayer.populate() - return - } - } - } - } - - /** - * 初始话质检数据图层 - */ - private fun initQsRecordDataLayer() { - - canvas = CanvasAdapter.newCanvas() - paint = CanvasAdapter.newPaint() - paint.setTypeface(Paint.FontFamily.DEFAULT, Paint.FontStyle.NORMAL) - paint.setTextSize(NUM_13 * CanvasAdapter.getScale()) - paint.strokeWidth = 2 * CanvasAdapter.getScale() - paint.color = Color.parseColor(mDefaultTextColor) - val bitmapPoi: Bitmap = AndroidBitmap( - BitmapFactory.decodeResource( - mContext.resources, - R.mipmap.map_icon_blue2 - ) - ) - val symbol = MarkerSymbol(bitmapPoi, MarkerSymbol.HotspotPlace.BOTTOM_CENTER) - markerRendererFactory = MarkerRendererFactory { markerLayer -> - object : ClusterMarkerRenderer( - mContext, - markerLayer, - symbol, - ClusterStyle( - org.oscim.backend.canvas.Color.WHITE, - org.oscim.backend.canvas.Color.BLUE - ) - ) { -// override fun getClusterBitmap(size: Int): Bitmap? { -// return super.getclusterbitmap(size) -// } - } - } - - itemizedLayer = - MyItemizedLayer( - mMapView.vtmMap, - mutableListOf(), - markerRendererFactory, - object : MyItemizedLayer.OnItemGestureListener { - override fun onItemSingleTapUp( - list: MutableList, - nearest: Int - ): Boolean { - itemListener?.let { - val idList = mutableListOf() - if (list.size == 0) { - } else { - for (i in list) { - val markerInterface: MarkerInterface = - itemizedLayer.itemList[i] - if (markerInterface is MarkerItem) { - idList.add(markerInterface.title) - } - } - it.onQsRecordList(idList.distinct().toMutableList()) - } - } - return true - } - - override fun onItemLongPress( - list: MutableList?, - nearest: Int - ): Boolean { - return true - } - }) - addLayer(itemizedLayer, NIMapView.LAYER_GROUPS.OPERATE) - mContext.lifecycleScope.launch(Dispatchers.IO) { - var list = mutableListOf() - val realm = Realm.getDefaultInstance() - Log.e("jingo","realm hashCOde ${realm.hashCode()}") - realm.executeTransaction { - val objects = realm.where().findAll() - list = realm.copyFromRealm(objects) - } -// realm.close() - - for (item in list) { - createMarkerItem(item) - } - } - - } - - private suspend fun createMarkerItem(item: QsRecordBean) { - val bitmap: Bitmap = createTextMarkerBitmap(mContext, item.description, resId) - if (item.t_lifecycle != 2) { - val geometry: Geometry? = GeometryTools.createGeometry(item.geometry) - if (geometry != null) { - var geoPoint: GeoPoint? = null - if (geometry.geometryType != null) { - when (geometry.geometryType.uppercase(Locale.getDefault())) { - "POINT" -> geoPoint = - GeoPoint(geometry.coordinate.y, geometry.coordinate.x) -// "LINESTRING" -> { -// val lineString = geometry as LineString -// if (lineString != null && lineString.coordinates.size > 0) { -// geoPoint = GeoPoint( -// lineString.coordinates[0].y, -// lineString.coordinates[0].x -// ) -// } -// val drawableLine: Drawable = -// convertGeometry2Drawable(geometry, lineStyle) -// if (drawableLine != null) { -// dataVectorLayer.add(drawableLine) -// } -// } -// "POLYGON" -> { -// val polygon = geometry as Polygon -// if (polygon != null && polygon.coordinates.size > 0) { -// geoPoint = GeoPoint( -// polygon.coordinates[0].y, -// polygon.coordinates[0].x -// ) -// } -// val drawablePolygon: Drawable = -// convertGeometry2Drawable(geometry, polygonStyle) -// if (drawablePolygon != null) { -// dataVectorLayer.add(drawablePolygon) -// } -// } - } - } - if (geoPoint != null) { - var geoMarkerItem: MarkerItem -// if (item.getType() === 1) { - geoMarkerItem = ClusterMarkerItem( - 1, item.id, item.description, geoPoint - ) -// } else { -// geoMarkerItem = MarkerItem( -// ePointTemp.getType(), -// ePointTemp.getId(), -// ePointTemp.getStyleText(), -// geoPoint -// ) -// } - val markerSymbol = - MarkerSymbol(bitmap, MarkerSymbol.HotspotPlace.CENTER) - geoMarkerItem.marker = markerSymbol - itemizedLayer.itemList.add(geoMarkerItem) - } - } - } - itemizedLayer.populate() - } - - - /** - * 文字和图片拼装,文字换行 - * - * @param context - * @param text - * @param resId - * @return - */ - private fun createTextMarkerBitmap(context: Context, text: String, resId: Int): Bitmap { - var text: String? = text - return if (text == null || text.trim { it <= ' ' }.isEmpty()) { - val drawable = ResourcesCompat.getDrawable(context.resources, resId, null) - val originBitmap = android.graphics.Bitmap.createBitmap( - drawable!!.intrinsicWidth, - drawable.intrinsicHeight * 2, - android.graphics.Bitmap.Config.ARGB_8888 - ) - val androidCanvas = Canvas(originBitmap) - val startX = (originBitmap.width - drawable.intrinsicWidth) / 2 - drawable.setBounds( - startX, 0, startX + drawable.intrinsicWidth, drawable.intrinsicHeight - ) - drawable.draw(androidCanvas) - val bitmap: Bitmap = AndroidBitmap(originBitmap) - canvas.setBitmap(bitmap) - bitmap - } else { - val drawable = ResourcesCompat.getDrawable(context.resources, resId, null) - val textList: MutableList = ArrayList() - val fontSize: Float = NUM_13 * CanvasAdapter.getScale() - paint.setTextSize(fontSize) - var maxWidth = 0f - //最多4行,一行7个 - if (text.trim { it <= ' ' }.length > 24) { - val size = (drawable!!.intrinsicHeight / 4).toFloat() - if (size < fontSize) paint.setTextSize(size) - if (text.trim { it <= ' ' }.length > 28) text = text.substring(0, 26) + "..." - val temp1 = text.substring(0, 7) - textList.add(temp1) - text = text.substring(7) - maxWidth = paint.getTextWidth(temp1) - val temp2 = text.substring(0, 7) - textList.add(temp2) - text = text.substring(7) - var newWidth = paint.getTextWidth(temp2) - if (newWidth > maxWidth) { - maxWidth = newWidth - } - val temp3 = text.substring(0, 7) - textList.add(temp3) - text = text.substring(7) - newWidth = paint.getTextWidth(temp3) - if (newWidth > maxWidth) { - maxWidth = newWidth - } - textList.add(text) - newWidth = paint.getTextWidth(text) - if (newWidth > maxWidth) { - maxWidth = newWidth - } - } else if (text.trim { it <= ' ' }.length > 21) { - val size = (drawable!!.intrinsicHeight / 4).toFloat() - if (size < fontSize) paint.setTextSize(size) - val temp1 = text.substring(0, 6) - textList.add(temp1) - text = text.substring(6) - maxWidth = paint.getTextWidth(temp1) - val temp2 = text.substring(0, 6) - textList.add(temp2) - text = text.substring(6) - var newWidth = paint.getTextWidth(temp2) - if (newWidth > maxWidth) { - maxWidth = newWidth - } - val temp3 = text.substring(0, 6) - textList.add(temp3) - text = text.substring(6) - newWidth = paint.getTextWidth(temp3) - if (newWidth > maxWidth) { - maxWidth = newWidth - } - textList.add(text) - newWidth = paint.getTextWidth(text) - if (newWidth > maxWidth) { - maxWidth = newWidth - } - } else if (text.trim { it <= ' ' }.length > 18) { - val size = (drawable!!.intrinsicHeight / 3).toFloat() - if (size < fontSize) paint.setTextSize(size) - val temp1 = text.substring(0, 7) - textList.add(temp1) - text = text.substring(7) - maxWidth = paint.getTextWidth(temp1) - val temp2 = text.substring(0, 7) - textList.add(temp2) - text = text.substring(7) - var newWidth = paint.getTextWidth(temp2) - if (newWidth > maxWidth) { - maxWidth = newWidth - } - textList.add(text) - newWidth = paint.getTextWidth(text) - if (newWidth > maxWidth) { - maxWidth = newWidth - } - } else if (text.trim { it <= ' ' }.length > 18) { - val size = (drawable!!.intrinsicHeight / 3).toFloat() - if (size < fontSize) paint.setTextSize(size) - val temp1 = text.substring(0, 7) - textList.add(temp1) - text = text.substring(7) - maxWidth = paint.getTextWidth(temp1) - val temp2 = text.substring(0, 7) - textList.add(temp2) - text = text.substring(7) - var newWidth = paint.getTextWidth(temp2) - if (newWidth > maxWidth) { - maxWidth = newWidth - } - textList.add(text) - newWidth = paint.getTextWidth(text) - if (newWidth > maxWidth) { - maxWidth = newWidth - } - } else if (text.trim { it <= ' ' }.length > 14) { - val size = (drawable!!.intrinsicHeight / 3).toFloat() - if (size < fontSize) paint.setTextSize(size) - val temp1 = text.substring(0, 6) - textList.add(temp1) - text = text.substring(6) - maxWidth = paint.getTextWidth(temp1) - val temp2 = text.substring(0, 6) - textList.add(temp2) - text = text.substring(6) - var newWidth = paint.getTextWidth(temp2) - if (newWidth > maxWidth) { - maxWidth = newWidth - } - textList.add(text) - newWidth = paint.getTextWidth(text) - if (newWidth > maxWidth) { - maxWidth = newWidth - } - } else if (text.trim { it <= ' ' }.length > 12) { - val size = (drawable!!.intrinsicHeight / 2).toFloat() - if (size < fontSize) paint.setTextSize(size) - val temp1 = text.substring(0, 7) - textList.add(temp1) - text = text.substring(7) - maxWidth = paint.getTextWidth(temp1) - textList.add(text) - val newWidth = paint.getTextWidth(text) - if (newWidth > maxWidth) { - maxWidth = newWidth - } - } else if (text.trim { it <= ' ' }.length > 10) { - val size = (drawable!!.intrinsicHeight / 2).toFloat() - if (size < fontSize) paint.setTextSize(size) - val temp1 = text.substring(0, 6) - textList.add(temp1) - text = text.substring(6) - maxWidth = paint.getTextWidth(temp1) - textList.add(text) - val newWidth = paint.getTextWidth(text) - if (newWidth > maxWidth) { - maxWidth = newWidth - } - } else if (text.trim { it <= ' ' }.length > 7) { - val size = (drawable!!.intrinsicHeight / 2).toFloat() - if (size < fontSize) paint.setTextSize(size) - val temp1 = text.substring(0, 5) - textList.add(temp1) - text = text.substring(5) - maxWidth = paint.getTextWidth(temp1) - textList.add(text) - val newWidth = paint.getTextWidth(text) - if (newWidth > maxWidth) { - maxWidth = newWidth - } - } else { - val size = drawable!!.intrinsicHeight.toFloat() - if (size < fontSize) paint.setTextSize(size) - textList.add(text) - maxWidth = paint.getTextWidth(text) - } - paint.color = Color.parseColor(mDefaultTextColor) - val originBitmap = android.graphics.Bitmap.createBitmap( - if (drawable.intrinsicWidth > maxWidth) drawable.intrinsicWidth else maxWidth.toInt(), - drawable.intrinsicHeight * 2, - android.graphics.Bitmap.Config.ARGB_4444 - ) - val androidCanvas = Canvas(originBitmap) - val startX = (originBitmap.width - drawable.intrinsicWidth) / 2 - drawable.setBounds( - startX, 0, startX + drawable.intrinsicWidth, drawable.intrinsicHeight - ) - drawable.draw(androidCanvas) - val bitmap: Bitmap = AndroidBitmap(originBitmap) - canvas.setBitmap(bitmap) - var startHeight = (drawable.intrinsicHeight + paint.getTextHeight(text)).toInt() - for (txt in textList) { - canvas.drawText( - txt, (bitmap.width - paint.getTextWidth(txt)) / 2, startHeight.toFloat(), paint - ) - startHeight += paint.getTextHeight(txt).toInt() - } - bitmap - } - } //显示轨迹图层 fun showNiLocationLayer() { @@ -608,12 +181,8 @@ open class LayerManagerHandler(context: AppCompatActivity, mapView: NIMapView,tr vectorNiLocationTileLayer.isEnabled = false labelNiLocationLayer.isEnabled = false } - } -interface OnQsRecordItemClickListener { - fun onQsRecordList(list: MutableList) -} /** * 基础 diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt index 6942847b..240b6ef5 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt @@ -2,17 +2,36 @@ package com.navinfo.collect.library.map.handler import android.content.Context import android.graphics.BitmapFactory +import android.graphics.Canvas +import android.graphics.Color +import android.util.Log import androidx.appcompat.app.AppCompatActivity +import androidx.core.content.res.ResourcesCompat +import androidx.lifecycle.lifecycleScope import com.navinfo.collect.library.R +import com.navinfo.collect.library.data.entity.QsRecordBean import com.navinfo.collect.library.map.GeoPoint import com.navinfo.collect.library.map.NIMapView +import com.navinfo.collect.library.map.cluster.ClusterMarkerItem +import com.navinfo.collect.library.map.cluster.ClusterMarkerRenderer +import com.navinfo.collect.library.map.layers.MyItemizedLayer +import com.navinfo.collect.library.utils.GeometryTools import com.navinfo.collect.library.utils.StringUtil +import io.realm.Realm +import io.realm.kotlin.where +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import org.locationtech.jts.geom.Geometry import org.oscim.android.canvas.AndroidBitmap -import org.oscim.layers.marker.ItemizedLayer +import org.oscim.backend.CanvasAdapter +import org.oscim.backend.canvas.Bitmap +import org.oscim.backend.canvas.Paint +import org.oscim.layers.marker.* import org.oscim.layers.marker.ItemizedLayer.OnItemGestureListener -import org.oscim.layers.marker.MarkerInterface -import org.oscim.layers.marker.MarkerItem -import org.oscim.layers.marker.MarkerSymbol +import org.oscim.map.Map +import java.util.* +import kotlin.collections.ArrayList /** * marker 操作 @@ -23,6 +42,29 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : // //默认marker图层 private var mDefaultMarkerLayer: ItemizedLayer + /** + * 默认文字颜色 + */ + private val mDefaultTextColor = "#4E55AF" + + /** + * 文字画笔 + */ + + private lateinit var paint: Paint + + //画布 + private lateinit var canvas: org.oscim.backend.canvas.Canvas + private lateinit var itemizedLayer: MyItemizedLayer + private lateinit var markerRendererFactory: MarkerRendererFactory + private var resId = R.mipmap.map_icon_point_add + private var itemListener: OnQsRecordItemClickListener? = null + + /** + * 文字大小 + */ + private val NUM_13 = 13 + init { //新增marker图标样式 val mDefaultBitmap = @@ -49,6 +91,19 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : } ) addLayer(mDefaultMarkerLayer, NIMapView.LAYER_GROUPS.OPERATE); + //初始化之间数据图层 + initQsRecordDataLayer() + // 设置矢量图层均在12级以上才显示 + mMapView.vtmMap.events.bind(Map.UpdateListener { e, mapPosition -> + if (e == Map.SCALE_EVENT) { + itemizedLayer.isEnabled = mapPosition.getZoomLevel() >= 12 + } + }) + mMapView.updateMap() + } + + fun setOnQsRecordItemClickListener(listener: OnQsRecordItemClickListener?) { + itemListener = listener } //增加marker @@ -99,4 +154,404 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : } } -} \ No newline at end of file + + /** + * 增加或更新marker + */ + suspend fun addOrUpdateQsRecordMark(data: QsRecordBean) { + for (item in itemizedLayer.itemList) { + if (item is MarkerItem) { + if (item.title == data.id) { + itemizedLayer.itemList.remove(item) + break + } + } + } + createMarkerItem(data) + withContext(Dispatchers.Main) { + mMapView.updateMap(true) + } + + } + + + /** + * 删除marker + */ + suspend fun removeQsRecordMark(data: QsRecordBean) { + for (item in itemizedLayer.itemList) { + if (item is MarkerItem) { + if (item.title == data.id) { + itemizedLayer.itemList.remove(item) + itemizedLayer.populate() + return + } + } + } + } + + /** + * 初始话质检数据图层 + */ + private fun initQsRecordDataLayer() { + + canvas = CanvasAdapter.newCanvas() + paint = CanvasAdapter.newPaint() + paint.setTypeface(Paint.FontFamily.DEFAULT, Paint.FontStyle.NORMAL) + paint.setTextSize(NUM_13 * CanvasAdapter.getScale()) + paint.strokeWidth = 2 * CanvasAdapter.getScale() + paint.color = Color.parseColor(mDefaultTextColor) + val bitmapPoi: Bitmap = AndroidBitmap( + BitmapFactory.decodeResource( + mContext.resources, + R.mipmap.map_icon_blue2 + ) + ) + val symbol = MarkerSymbol(bitmapPoi, MarkerSymbol.HotspotPlace.BOTTOM_CENTER) + markerRendererFactory = MarkerRendererFactory { markerLayer -> + object : ClusterMarkerRenderer( + mContext, + markerLayer, + symbol, + ClusterStyle( + org.oscim.backend.canvas.Color.WHITE, + org.oscim.backend.canvas.Color.BLUE + ) + ) { +// override fun getClusterBitmap(size: Int): Bitmap? { +// return super.getclusterbitmap(size) +// } + } + } + + itemizedLayer = + MyItemizedLayer( + mMapView.vtmMap, + mutableListOf(), + markerRendererFactory, + object : MyItemizedLayer.OnItemGestureListener { + override fun onItemSingleTapUp( + list: MutableList, + nearest: Int + ): Boolean { + itemListener?.let { + val idList = mutableListOf() + if (list.size == 0) { + } else { + for (i in list) { + val markerInterface: MarkerInterface = + itemizedLayer.itemList[i] + if (markerInterface is MarkerItem) { + idList.add(markerInterface.title) + } + } + it.onQsRecordList(idList.distinct().toMutableList()) + } + } + return true + } + + override fun onItemLongPress( + list: MutableList?, + nearest: Int + ): Boolean { + return true + } + }) + addLayer(itemizedLayer, NIMapView.LAYER_GROUPS.OPERATE) + mContext.lifecycleScope.launch(Dispatchers.IO) { + var list = mutableListOf() + val realm = Realm.getDefaultInstance() + Log.e("jingo", "realm hashCOde ${realm.hashCode()}") + realm.executeTransaction { + val objects = realm.where().findAll() + list = realm.copyFromRealm(objects) + } +// realm.close() + + for (item in list) { + createMarkerItem(item) + } + } + + } + + private suspend fun createMarkerItem(item: QsRecordBean) { + val bitmap: Bitmap = createTextMarkerBitmap(mContext, item.description, resId) + if (item.t_lifecycle != 2) { + val geometry: Geometry? = GeometryTools.createGeometry(item.geometry) + if (geometry != null) { + var geoPoint: org.oscim.core.GeoPoint? = null + if (geometry.geometryType != null) { + when (geometry.geometryType.uppercase(Locale.getDefault())) { + "POINT" -> geoPoint = + org.oscim.core.GeoPoint(geometry.coordinate.y, geometry.coordinate.x) +// "LINESTRING" -> { +// val lineString = geometry as LineString +// if (lineString != null && lineString.coordinates.size > 0) { +// geoPoint = GeoPoint( +// lineString.coordinates[0].y, +// lineString.coordinates[0].x +// ) +// } +// val drawableLine: Drawable = +// convertGeometry2Drawable(geometry, lineStyle) +// if (drawableLine != null) { +// dataVectorLayer.add(drawableLine) +// } +// } +// "POLYGON" -> { +// val polygon = geometry as Polygon +// if (polygon != null && polygon.coordinates.size > 0) { +// geoPoint = GeoPoint( +// polygon.coordinates[0].y, +// polygon.coordinates[0].x +// ) +// } +// val drawablePolygon: Drawable = +// convertGeometry2Drawable(geometry, polygonStyle) +// if (drawablePolygon != null) { +// dataVectorLayer.add(drawablePolygon) +// } +// } + } + } + if (geoPoint != null) { + var geoMarkerItem: MarkerItem +// if (item.getType() === 1) { + geoMarkerItem = ClusterMarkerItem( + 1, item.id, item.description, geoPoint + ) +// } else { +// geoMarkerItem = MarkerItem( +// ePointTemp.getType(), +// ePointTemp.getId(), +// ePointTemp.getStyleText(), +// geoPoint +// ) +// } + val markerSymbol = + MarkerSymbol(bitmap, MarkerSymbol.HotspotPlace.CENTER) + geoMarkerItem.marker = markerSymbol + itemizedLayer.itemList.add(geoMarkerItem) + } + } + } + itemizedLayer.populate() + } + + + /** + * 文字和图片拼装,文字换行 + * + * @param context + * @param text + * @param resId + * @return + */ + private fun createTextMarkerBitmap(context: Context, text: String, resId: Int): Bitmap { + var text: String? = text + return if (text == null || text.trim { it <= ' ' }.isEmpty()) { + val drawable = ResourcesCompat.getDrawable(context.resources, resId, null) + val originBitmap = android.graphics.Bitmap.createBitmap( + drawable!!.intrinsicWidth, + drawable.intrinsicHeight * 2, + android.graphics.Bitmap.Config.ARGB_8888 + ) + val androidCanvas = Canvas(originBitmap) + val startX = (originBitmap.width - drawable.intrinsicWidth) / 2 + drawable.setBounds( + startX, 0, startX + drawable.intrinsicWidth, drawable.intrinsicHeight + ) + drawable.draw(androidCanvas) + val bitmap: Bitmap = AndroidBitmap(originBitmap) + canvas.setBitmap(bitmap) + bitmap + } else { + val drawable = ResourcesCompat.getDrawable(context.resources, resId, null) + val textList: MutableList = java.util.ArrayList() + val fontSize: Float = NUM_13 * CanvasAdapter.getScale() + paint.setTextSize(fontSize) + var maxWidth = 0f + //最多4行,一行7个 + if (text.trim { it <= ' ' }.length > 24) { + val size = (drawable!!.intrinsicHeight / 4).toFloat() + if (size < fontSize) paint.setTextSize(size) + if (text.trim { it <= ' ' }.length > 28) text = text.substring(0, 26) + "..." + val temp1 = text.substring(0, 7) + textList.add(temp1) + text = text.substring(7) + maxWidth = paint.getTextWidth(temp1) + val temp2 = text.substring(0, 7) + textList.add(temp2) + text = text.substring(7) + var newWidth = paint.getTextWidth(temp2) + if (newWidth > maxWidth) { + maxWidth = newWidth + } + val temp3 = text.substring(0, 7) + textList.add(temp3) + text = text.substring(7) + newWidth = paint.getTextWidth(temp3) + if (newWidth > maxWidth) { + maxWidth = newWidth + } + textList.add(text) + newWidth = paint.getTextWidth(text) + if (newWidth > maxWidth) { + maxWidth = newWidth + } + } else if (text.trim { it <= ' ' }.length > 21) { + val size = (drawable!!.intrinsicHeight / 4).toFloat() + if (size < fontSize) paint.setTextSize(size) + val temp1 = text.substring(0, 6) + textList.add(temp1) + text = text.substring(6) + maxWidth = paint.getTextWidth(temp1) + val temp2 = text.substring(0, 6) + textList.add(temp2) + text = text.substring(6) + var newWidth = paint.getTextWidth(temp2) + if (newWidth > maxWidth) { + maxWidth = newWidth + } + val temp3 = text.substring(0, 6) + textList.add(temp3) + text = text.substring(6) + newWidth = paint.getTextWidth(temp3) + if (newWidth > maxWidth) { + maxWidth = newWidth + } + textList.add(text) + newWidth = paint.getTextWidth(text) + if (newWidth > maxWidth) { + maxWidth = newWidth + } + } else if (text.trim { it <= ' ' }.length > 18) { + val size = (drawable!!.intrinsicHeight / 3).toFloat() + if (size < fontSize) paint.setTextSize(size) + val temp1 = text.substring(0, 7) + textList.add(temp1) + text = text.substring(7) + maxWidth = paint.getTextWidth(temp1) + val temp2 = text.substring(0, 7) + textList.add(temp2) + text = text.substring(7) + var newWidth = paint.getTextWidth(temp2) + if (newWidth > maxWidth) { + maxWidth = newWidth + } + textList.add(text) + newWidth = paint.getTextWidth(text) + if (newWidth > maxWidth) { + maxWidth = newWidth + } + } else if (text.trim { it <= ' ' }.length > 18) { + val size = (drawable!!.intrinsicHeight / 3).toFloat() + if (size < fontSize) paint.setTextSize(size) + val temp1 = text.substring(0, 7) + textList.add(temp1) + text = text.substring(7) + maxWidth = paint.getTextWidth(temp1) + val temp2 = text.substring(0, 7) + textList.add(temp2) + text = text.substring(7) + var newWidth = paint.getTextWidth(temp2) + if (newWidth > maxWidth) { + maxWidth = newWidth + } + textList.add(text) + newWidth = paint.getTextWidth(text) + if (newWidth > maxWidth) { + maxWidth = newWidth + } + } else if (text.trim { it <= ' ' }.length > 14) { + val size = (drawable!!.intrinsicHeight / 3).toFloat() + if (size < fontSize) paint.setTextSize(size) + val temp1 = text.substring(0, 6) + textList.add(temp1) + text = text.substring(6) + maxWidth = paint.getTextWidth(temp1) + val temp2 = text.substring(0, 6) + textList.add(temp2) + text = text.substring(6) + var newWidth = paint.getTextWidth(temp2) + if (newWidth > maxWidth) { + maxWidth = newWidth + } + textList.add(text) + newWidth = paint.getTextWidth(text) + if (newWidth > maxWidth) { + maxWidth = newWidth + } + } else if (text.trim { it <= ' ' }.length > 12) { + val size = (drawable!!.intrinsicHeight / 2).toFloat() + if (size < fontSize) paint.setTextSize(size) + val temp1 = text.substring(0, 7) + textList.add(temp1) + text = text.substring(7) + maxWidth = paint.getTextWidth(temp1) + textList.add(text) + val newWidth = paint.getTextWidth(text) + if (newWidth > maxWidth) { + maxWidth = newWidth + } + } else if (text.trim { it <= ' ' }.length > 10) { + val size = (drawable!!.intrinsicHeight / 2).toFloat() + if (size < fontSize) paint.setTextSize(size) + val temp1 = text.substring(0, 6) + textList.add(temp1) + text = text.substring(6) + maxWidth = paint.getTextWidth(temp1) + textList.add(text) + val newWidth = paint.getTextWidth(text) + if (newWidth > maxWidth) { + maxWidth = newWidth + } + } else if (text.trim { it <= ' ' }.length > 7) { + val size = (drawable!!.intrinsicHeight / 2).toFloat() + if (size < fontSize) paint.setTextSize(size) + val temp1 = text.substring(0, 5) + textList.add(temp1) + text = text.substring(5) + maxWidth = paint.getTextWidth(temp1) + textList.add(text) + val newWidth = paint.getTextWidth(text) + if (newWidth > maxWidth) { + maxWidth = newWidth + } + } else { + val size = drawable!!.intrinsicHeight.toFloat() + if (size < fontSize) paint.setTextSize(size) + textList.add(text) + maxWidth = paint.getTextWidth(text) + } + paint.color = Color.parseColor(mDefaultTextColor) + val originBitmap = android.graphics.Bitmap.createBitmap( + if (drawable.intrinsicWidth > maxWidth) drawable.intrinsicWidth else maxWidth.toInt(), + drawable.intrinsicHeight * 2, + android.graphics.Bitmap.Config.ARGB_4444 + ) + val androidCanvas = Canvas(originBitmap) + val startX = (originBitmap.width - drawable.intrinsicWidth) / 2 + drawable.setBounds( + startX, 0, startX + drawable.intrinsicWidth, drawable.intrinsicHeight + ) + drawable.draw(androidCanvas) + val bitmap: Bitmap = AndroidBitmap(originBitmap) + canvas.setBitmap(bitmap) + var startHeight = (drawable.intrinsicHeight + paint.getTextHeight(text)).toInt() + for (txt in textList) { + canvas.drawText( + txt, (bitmap.width - paint.getTextWidth(txt)) / 2, startHeight.toFloat(), paint + ) + startHeight += paint.getTextHeight(txt).toInt() + } + bitmap + } + } +} + +interface OnQsRecordItemClickListener { + fun onQsRecordList(list: MutableList) +}