Commit b785e7cb authored by p x's avatar p x
Browse files

四维搜索

parent 0665639d
......@@ -33,6 +33,10 @@ android {
kotlinOptions {
jvmTarget = "11"
}
buildFeatures {
// dataBinding = true
viewBinding = true
}
}
......
package com.sd.mapmultiengine
import android.os.Bundle
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import com.sd.maplibrary.MAP_TYPE
import com.sd.maplibrary.MSDKInitializer
import com.sd.maplibrary.OnSdkInitCb
import com.sd.mapmultiengine.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
// val yy:Yy by viewModels()
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContentView(R.layout.activity_main)
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets
}
// enableEdgeToEdge()
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
// ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
// val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
// v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
// insets
// }
initMap()
}
fun initMap(){
MSDKInitializer.initializeMap(this, MAP_TYPE.AMAP)
fun initMap() {
MSDKInitializer.initializeMap(this, MAP_TYPE.MINE, object : OnSdkInitCb{
override fun onInitSuccess(map_type: MAP_TYPE) {
println("--------onMapInitSuccess---map_type = ${map_type}")
}
override fun onInitFailed(msg: String?) {
}
override fun onPerDenied() {
}
})
}
}
\ No newline at end of file
package com.sd.mapmultiengine
import androidx.lifecycle.ViewModel
class Yy:ViewModel() {
}
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<com.sd.maplibrary.ui.MapMultiView
android:id="@+id/mapMultiView"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</LinearLayout>
......@@ -20,4 +20,5 @@ kotlin.code.style=official
# Enables namespacing of each library's R class so that its R class includes only the
# resources declared in the library itself and none from the library's dependencies,
# thereby reducing the size of the R class for that library
android.nonTransitiveRClass=true
\ No newline at end of file
android.nonTransitiveRClass=true
android.defaults.buildfeatures.databinding=true
\ No newline at end of file
......@@ -10,6 +10,7 @@ material = "1.12.0"
activity = "1.10.1"
constraintlayout = "2.2.1"
[libraries]
androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }
junit = { group = "junit", name = "junit", version.ref = "junit" }
......@@ -20,6 +21,7 @@ material = { group = "com.google.android.material", name = "material", version.r
androidx-activity = { group = "androidx.activity", name = "activity", version.ref = "activity" }
androidx-constraintlayout = { group = "androidx.constraintlayout", name = "constraintlayout", version.ref = "constraintlayout" }
[plugins]
android-application = { id = "com.android.application", version.ref = "agp" }
kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
......
plugins {
alias(libs.plugins.android.library)
alias(libs.plugins.kotlin.android)
id("kotlin-kapt")
}
android {
......@@ -30,6 +31,10 @@ android {
kotlinOptions {
jvmTarget = "11"
}
buildFeatures {
// dataBinding = true
viewBinding = true
}
}
//repositories {
......@@ -43,11 +48,21 @@ dependencies {
implementation(libs.androidx.core.ktx)
implementation(libs.androidx.appcompat)
implementation(libs.material)
implementation(libs.androidx.constraintlayout)
testImplementation(libs.junit)
androidTestImplementation(libs.androidx.junit)
androidTestImplementation(libs.androidx.espresso.core)
//网络
implementation("com.squareup.retrofit2:retrofit:2.9.0")
implementation("com.squareup.retrofit2:converter-gson:2.9.0")
// 权限请求框架
implementation("com.guolindev.permissionx:permissionx:1.8.1")
// ViewModel
implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2")
//fragment-ktx
implementation("androidx.fragment:fragment-ktx:1.8.0")
// https://github.com/CymChad/BaseRecyclerViewAdapterHelper/ RecyclerView 适配器
implementation("io.github.cymchad:BaseRecyclerViewAdapterHelper4:4.1.7")
}
\ No newline at end of file
......@@ -7,40 +7,27 @@
tools:ignore="ProtectedPermissions" />
<uses-permission
android:name="android.permission.INTERACT_ACROSS_USERS_FULL"
tools:ignore="ProtectedPermissions" />
<!-- 允许程序打开网络套接字 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 允许程序访问网络状态 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 允许用户改变WiFi连接状态 -->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<!-- 程序访问粗略位置 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- 允许用户访问精确位置 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- Android Q 允许后台运行定位 -->
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
<!-- 允许程序读取手机状态 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- 打电话的权限 -->
<uses-permission android:name="android.permission.CALL_PHONE" />
<!-- 从SDCard读出数据权限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!-- 允许程序写入外部存储设备 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 允许程序读取所有者数据 -->
<uses-permission android:name="android.permission.READ_OWNER_DATA" />
<!-- 访问WiFi状态,需要WiFi信息用于网络定位 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- 访问网络的变化, 需要某些信息用于网络定位 -->
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<!-- 8.0 安装未知程序权限 -->
tools:ignore="ProtectedPermissions" /> <!-- 允许程序打开网络套接字 -->
<uses-permission android:name="android.permission.INTERNET" /> <!-- 允许程序访问网络状态 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- 允许用户改变WiFi连接状态 -->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <!-- 程序访问粗略位置 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- 允许用户访问精确位置 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- Android Q 允许后台运行定位 -->
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" /> <!-- 允许程序读取手机状态 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> <!-- 打电话的权限 -->
<uses-permission android:name="android.permission.CALL_PHONE" /> <!-- 从SDCard读出数据权限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!-- 允许程序写入外部存储设备 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 允许程序读取所有者数据 -->
<uses-permission android:name="android.permission.READ_OWNER_DATA" /> <!-- 访问WiFi状态,需要WiFi信息用于网络定位 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!-- 访问网络的变化, 需要某些信息用于网络定位 -->
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> <!-- 8.0 安装未知程序权限 -->
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<application
android:networkSecurityConfig="@xml/network_security_config"
android:supportsRtl="true">
<activity android:name=".ui.SearchActivity" />
<uses-library
android:name="org.apache.http.legacy"
android:required="false" />
......@@ -48,8 +35,6 @@
<meta-data
android:name="com.minedata.minenavi.apikey"
android:value="57ac7a0d56494912a0c28e651fa4a40a" />
</application>
</manifest>
\ No newline at end of file
......@@ -2,7 +2,6 @@ package com.sd.maplibrary
import android.Manifest
import android.content.Context
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity
import com.minedata.minenavi.SDKInitializer
import com.minedata.minenavi.SDKInitializer.InitListener
......@@ -16,70 +15,95 @@ import com.sd.maplibrary.utils.ToastHelper
* MINE =四维
* ***/
enum class MAP_TYPE {
AMAP,
MINE
MINE,
AMAP
}
class UserCtx {
var mContext: Context? = null
var map_type: MAP_TYPE = MAP_TYPE.MINE
companion object {
val instance: UserCtx by lazy { UserCtx() }
}
}
interface OnSdkInitCb {
/***初始化成功**/
fun onInitSuccess(map_type: MAP_TYPE)
/***初始化成失败**/
fun onInitFailed(msg: String?)
/***权限被拒**/
fun onPerDenied()
}
object MSDKInitializer {
private var onSdkInitCb: OnSdkInitCb? = null
fun initializeMap(context: Context, map_type: MAP_TYPE) {
fun initializeMap(context: Context, map_type: MAP_TYPE, onSdkInitCb: OnSdkInitCb?) {
this@MSDKInitializer.onSdkInitCb = onSdkInitCb
UserCtx.instance.mContext = context
UserCtx.instance.map_type = map_type
requestPers()
// when (map_type) {
// MAP_TYPE.AMAP -> {
//
// }
// MAP_TYPE.MINE -> {
//
//
// }
// }
// 隐私合规接口
// SDKInitializer.setAgreePrivacy(true)
// if (SDKInitializer.getServerHost().equals("mineservice.minedata.cn")) {
// SDKInitializer.setStyleUrl(
// MineMap.UrlType.basicMap,
// "https://service.minedata.cn/map/solu/style/1359221494104252416"
// )
// }
// 设置地图坐标系
// SDKInitializer.setCoordType(CoordType.GCJ02)
// SDKInitializer.setSearchUrlType(SearchUrlType.v1)
// SDKInitializer.initialize(context, object : InitListener {
// override fun onInitSuccess() {
// }
//
// override fun onInitFailed(msg: String?) {
// }
// })
}
fun getMapType(): MAP_TYPE {
return UserCtx.instance.map_type
}
private fun mapTypeInit() {
val ctx = UserCtx.instance.mContext
when (UserCtx.instance.map_type) {
MAP_TYPE.AMAP -> {
}
MAP_TYPE.MINE -> {
// 隐私合规接口
SDKInitializer.setAgreePrivacy(true)
//设置地图坐标系
SDKInitializer.setCoordType(CoordType.GCJ02)
SDKInitializer.setSearchUrlType(SearchUrlType.v1)
SDKInitializer.initialize(ctx, object : InitListener {
override fun onInitSuccess() {
onSdkInitCb?.onInitSuccess(UserCtx.instance.map_type)
}
fun requestPers() {
if (UserCtx.instance.mContext is FragmentActivity || UserCtx.instance.mContext is Fragment) {
override fun onInitFailed(msg: String?) {
onSdkInitCb?.onInitFailed(msg)
}
})
}
else -> {
}
}
}
private fun requestPers() {
if (UserCtx.instance.mContext is FragmentActivity) {
var list = listOf(
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.ACCESS_BACKGROUND_LOCATION
)
PermissionX.init(UserCtx.instance.mContext as FragmentActivity)
.permissions(list)
.onExplainRequestReason { scope, deniedList ->
scope.showRequestReasonDialog(
deniedList,
"Adas 需要同意以下授权才能正常使用",
"需要同意以下授权才能正常使用",
"好的",
"取消"
)
......@@ -89,17 +113,18 @@ object MSDKInitializer {
// }
.request { allGranted, grantedList, deniedList ->
if (allGranted) {
mapTypeInit()
} else {
// ToastHelper.showShort(this, "权限被拒")
ToastHelper.showShort(UserCtx.instance.mContext!!, "权限被拒")
onSdkInitCb?.onPerDenied()
}
}
} else {
ToastHelper.showShort(UserCtx.instance.mContext!!, "请在正确的地方初始化")
// ToastHelper.showShort(UserCtx.instance.mContext!!, "请在正确的地方初始化")
}
}
}
\ No newline at end of file
package com.sd.maplibrary.adapter
//import kotlinx.android.synthetic.main.poi_search_list_item.view.*
import android.content.Context
import android.graphics.Color
import android.text.SpannableString
import android.text.style.ForegroundColorSpan
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.core.text.set
import androidx.recyclerview.widget.RecyclerView
import com.chad.library.adapter4.BaseQuickAdapter
import com.minedata.minenavi.addons.DistanceBean
import com.sd.maplibrary.bean.PoiSearchBean
import com.sd.maplibrary.databinding.PoiSearchListItemBinding
import com.sd.maplibrary.utils.MyGeoTools
class PoiAdapter : BaseQuickAdapter<PoiSearchBean, PoiAdapter.PoiSH>() {
init {
// addChildClickViewIds(R.id.tv_fouc)
}
//用户的搜素关键字
var usrSearchStr = ""
override fun onCreateViewHolder(context: Context, parent: ViewGroup, viewType: Int): PoiSH {
return PoiSH(parent)
}
inner class PoiSH(
parent: ViewGroup,
val binding: PoiSearchListItemBinding = PoiSearchListItemBinding.inflate(
LayoutInflater.from(parent.context),
parent,
false
)
) : RecyclerView.ViewHolder(binding.root) {
private var poi_title = binding.poiTitle
private var tv_num = binding.tvNum
fun show(bean: PoiSearchBean) {
tv_num.text = (bindingAdapterPosition + 1).toString()
if (usrSearchStr.isNotEmpty()) {
var tempStr = bean.title
var star = tempStr.indexOf(usrSearchStr)
if (star != -1) {
var spannableString = SpannableString(tempStr)
var c = ForegroundColorSpan(Color.parseColor("#2C7FFA"))
var end = star + usrSearchStr.count()
spannableString.set(star..end, c)
poi_title.text = spannableString
} else {
poi_title.text = bean.title
}
} else {
poi_title.text = bean.title
}
binding.poiDes.text = bean.snippet
val distanceBean: DistanceBean = MyGeoTools.cauMyLocDistance(bean.lat, bean.lng)
binding.tvDistan.text = "${distanceBean.distanceValue}${distanceBean.distanceUnit}"
}
fun setListener() {
// tv_fouc.clicks().throttleFirst(1, TimeUnit.SECONDS).subscribe {
// focusOn(layoutPosition)
// }
}
}
override fun onBindViewHolder(holder: PoiSH, position: Int, item: PoiSearchBean?) {
holder.show(item!!)
}
}
\ No newline at end of file
package com.sd.maplibrary.base
import androidx.appcompat.app.AppCompatActivity
import com.sd.maplibrary.ui.dialog.LoadDialogFragment
open class BaseActivity: AppCompatActivity() {
private var loadDialogFragment: LoadDialogFragment? = null
fun showLoading(msg: String) {
// loadDialogFragment?.dismiss()
loadDialogFragment = LoadDialogFragment.newInstance(msg)
loadDialogFragment?.show(supportFragmentManager, "loadDialog")
}
fun dismisLoading() {
loadDialogFragment?.dismissNow()
}
}
\ No newline at end of file
package com.sd.maplibrary.base
import androidx.fragment.app.Fragment
import com.sd.maplibrary.ui.dialog.LoadDialogFragment
open class BaseFragment: Fragment() {
private var loadDialogFragment: LoadDialogFragment? = null
fun showLoading(msg: String) {
// loadDialogFragment?.dismiss()
loadDialogFragment = LoadDialogFragment.newInstance(msg)
loadDialogFragment?.show(parentFragmentManager, "loadDialog")
}
fun dismisLoading() {
loadDialogFragment?.dismissNow()
}
}
\ No newline at end of file
package com.sd.maplibrary.bean
class MyLocBean {
// 返回逆地理编码结果所在区(县)的编码。
var adCode = ""
//当前经纬度
var curLat = 0.0
var curLng = 0.0
var city = ""
var cityCode = ""
//速度
var speed = 0f
}
\ No newline at end of file
package com.sd.maplibrary.bean
/**搜索poi**/
class PoiSearchBean {
var lat = 0.0
var lng = 0.0
var cityName = ""
var adCode = ""
//POI的名称
var title = ""
//POI的地址
var snippet = ""
//POI距离中心点的距离。
var distance = 0
}
\ No newline at end of file
package com.sd.maplibrary.fragments
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.sd.maplibrary.R
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
//private const val ARG_PARAM1 = "param1"
//private const val ARG_PARAM2 = "param2"
/**
* 高德地图
*/
class AMapFragment : Fragment() {
// private var param1: String? = null
// private var param2: String? = null
// override fun onCreate(savedInstanceState: Bundle?) {
// super.onCreate(savedInstanceState)
// arguments?.let {
// param1 = it.getString(ARG_PARAM1)
// param2 = it.getString(ARG_PARAM2)
// }
// }
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_a_map, container, false)
}
companion object {
@JvmStatic
fun newInstance() = AMapFragment()
// @JvmStatic
// fun newInstance(param1: String, param2: String) =
// AMapFragment().apply {
// arguments = Bundle().apply {
// putString(ARG_PARAM1, param1)
// putString(ARG_PARAM2, param2)
// }
// }
}
}
\ No newline at end of file
package com.sd.maplibrary.fragments
import android.app.Activity
import android.content.Intent
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.activity.result.contract.ActivityResultContracts
import androidx.activity.viewModels
import androidx.fragment.app.activityViewModels
import com.sd.maplibrary.MAP_TYPE
import com.sd.maplibrary.MSDKInitializer
import com.sd.maplibrary.base.BaseFragment
import com.sd.maplibrary.databinding.FragmentForeMapBinding
import com.sd.maplibrary.ui.SearchActivity
import com.sd.maplibrary.viewmodels.FourMapOpVm
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
//private const val ARG_PARAM1 = "param1"
//private const val ARG_PARAM2 = "param2"
/**
*四维地图
*/
class ForeMapFragment : BaseFragment() {
// private var param1: String? = null
// private var param2: String? = null
// override fun onCreate(savedInstanceState: Bundle?) {
// super.onCreate(savedInstanceState)
// arguments?.let {
// param1 = it.getString(ARG_PARAM1)
// param2 = it.getString(ARG_PARAM2)
// }
// }
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
binding = FragmentForeMapBinding.inflate(inflater, container, false)
// Inflate the layout for this fragment
return binding.root
// return inflater.inflate(R.layout.fragment_fore_map, container, false)
}
private lateinit var binding: FragmentForeMapBinding
//四维地图操作
private val fourMapOpVm: FourMapOpVm by activityViewModels()
//跳转到搜索界面
private var searchAct =
registerForActivityResult(ActivityResultContracts.StartActivityForResult(), { result ->
if (result.resultCode == Activity.RESULT_OK) {
val intent = result.data
val returnedData = intent?.getStringExtra("123")
Log.d("----", "----Returned data: $returnedData")
}
})
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
initView()
setLis()
fourMapOpVm.starLoc()
}
private fun initView(){
when(MSDKInitializer.getMapType()){
MAP_TYPE.MINE->{
fourMapOpVm.init(binding.mapView)
// fourMapOpVm.mOnMapViewListener=this@ForeMapFragment
}
MAP_TYPE.AMAP->{
}
}
}
private fun setLis() {
binding.sLayout.searchLl.setOnClickListener {
val intent = Intent(requireContext(), SearchActivity::class.java)
searchAct.launch(intent)
}
}
override fun onPause() {
super.onPause()
binding.mapView.onPause()
}
override fun onResume() {
super.onResume()
binding.mapView.onResume()
}
override fun onDestroy() {
super.onDestroy()
fourMapOpVm.stopLoc()
binding.mapView.onDestroy()
}
companion object {
@JvmStatic
fun newInstance() = ForeMapFragment()
// @JvmStatic
// fun newInstance(param1: String, param2: String) =
// ForeMapFragment().apply {
// arguments = Bundle().apply {
// putString(ARG_PARAM1, param1)
// putString(ARG_PARAM2, param2)
// }
// }
}
}
\ No newline at end of file
package com.sd.maplibrary.ui
import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import android.widget.LinearLayout
import androidx.fragment.app.FragmentActivity
import com.sd.maplibrary.MAP_TYPE
import com.sd.maplibrary.MSDKInitializer
import com.sd.maplibrary.R
import com.sd.maplibrary.databinding.MultiViewBinding
import com.sd.maplibrary.fragments.AMapFragment
import com.sd.maplibrary.fragments.ForeMapFragment
class MapMultiView : LinearLayout {
constructor(context: Context?) : super(context) {
init(null, 0)
}
constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) {
init(attrs, 0)
}
constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(
context,
attrs,
defStyleAttr
) {
init(attrs, defStyleAttr)
}
private lateinit var binding: MultiViewBinding
//四维地图
private val foreMapFragment by lazy { ForeMapFragment.newInstance() }
//高德地图
private val aMapFragment by lazy { AMapFragment.newInstance() }
private var enmuValue = 0
private fun init(attrs: AttributeSet?, defStyle: Int) {
// context.withStyledAttributes(attrs, R.styleable.MapMultiView, defStyle, 0) {
// if (hasValue(R.styleable.MapMultiView_map_type)) {
// enmuValue = getInt(R.styleable.MapMultiView_map_type, 0)
// }
// }
// println("------------MSDKInitializer. = ${MSDKInitializer.getMapType()}")
binding = MultiViewBinding.inflate(LayoutInflater.from(context))
addView(binding.root)
loadMapFrament()
}
fun loadMapFrament() {
if (context is FragmentActivity) {
var act = context as FragmentActivity
var ft = act.supportFragmentManager.beginTransaction()
val map_type = MSDKInitializer.getMapType()
if (map_type == MAP_TYPE.MINE) {
ft.replace(R.id.frame_layout,foreMapFragment)
} else if (map_type == MAP_TYPE.AMAP) {
ft.replace(R.id.frame_layout,aMapFragment)
}
ft.commit()
}
}
}
\ No newline at end of file
package com.sd.maplibrary.ui
import android.os.Bundle
import android.view.View
import androidx.activity.viewModels
import com.chad.library.adapter4.BaseQuickAdapter
import com.sd.maplibrary.MAP_TYPE
import com.sd.maplibrary.MSDKInitializer
import com.sd.maplibrary.adapter.PoiAdapter
import com.sd.maplibrary.base.BaseActivity
import com.sd.maplibrary.bean.PoiSearchBean
import com.sd.maplibrary.databinding.ActivitySearchBinding
import com.sd.maplibrary.utils.MyContants
import com.sd.maplibrary.utils.ToastHelper
import com.sd.maplibrary.viewmodels.FourMapOpVm
import com.sd.maplibrary.viewmodels.SearchForeMapVm
class SearchActivity : BaseActivity() {
private lateinit var binding: ActivitySearchBinding
//四维搜索
private val searchForeMapVm: SearchForeMapVm by viewModels()
private var poiAdapter = PoiAdapter()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivitySearchBinding.inflate(layoutInflater)
setContentView(binding.root)
initView()
setLis()
// var intee=Intent().apply {
// putExtra("123","23423423")
// }
// setResult(Activity.RESULT_OK,intee)
// finish()
}
private fun initView() {
binding.poiList.adapter = poiAdapter
when (MSDKInitializer.getMapType()) {
MAP_TYPE.MINE -> {
}
MAP_TYPE.AMAP -> {
}
}
}
private fun getPoiList(str: String) {
if (str.isEmpty()) {
ToastHelper.showShort(this, "请输入关键字")
return
}
showLoading("搜索中")
when (MSDKInitializer.getMapType()) {
MAP_TYPE.MINE -> {
searchForeMapVm.getPoiList(
str,
MyContants.CUR_LAT, MyContants.CUR_LNG
).observe(this) { poiList ->
dismisLoading()
poiAdapter.submitList(poiList)
}
}
MAP_TYPE.AMAP -> {
}
}
}
private fun setLis() {
with(binding.rInputLayout) {
tvPoi.setOnClickListener {
getPoiList(etEndPlace.text.toString())
}
btnRouteS.setOnClickListener {
}
btnSwap.setOnClickListener {
}
}
poiAdapter.setOnItemClickListener { adapter, view, position ->
var bean: PoiSearchBean? = adapter.getItem(position)
binding.rInputLayout.etEndPlace.setText(bean?.title)
}
}
}
\ No newline at end of file
package com.sd.maplibrary.ui.dialog
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.DialogFragment
import com.sd.maplibrary.databinding.FragmentLoadDialogBinding
private const val ARG_PARAM1 = "msg"
private const val ARG_PARAM2 = "setCancelable"
/**
* 等待对话框
*/
class LoadDialogFragment : DialogFragment() {
private var cancelable = true
private var msg = ""
private lateinit var binding: FragmentLoadDialogBinding
fun setIsCanablell(canable: Boolean) {
this.cancelable = canable
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.let {
this.msg = it.getString(ARG_PARAM1, "正在加载")
this.cancelable = it.getBoolean(ARG_PARAM2, true)
}
}
override fun onStart() {
super.onStart()
// setWidth(0.5f)
}
// override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
// return AlertDialog.Builder(requireContext())
// .setMessage("getString(R.string.order_confirmation)")
// .setPositiveButton("getString(R.string.ok)") { _,_ -> }
// .create()
//// return super.onCreateDialog(savedInstanceState)
// }
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
binding= FragmentLoadDialogBinding.inflate(
inflater,
container,
false
)
// binding=FragmentLoadDialogBinding.inflate(inflater)
return binding.root
// return inflater.inflate(R.layout.fragment_load_dialog, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.tv.setText(msg)
}
companion object {
@JvmStatic
fun newInstance(msg: String = "正在加载", cancelable: Boolean = true) =
LoadDialogFragment().apply {
arguments = Bundle().apply {
putString(ARG_PARAM1, msg)
putBoolean(ARG_PARAM2, cancelable)
}
}
}
}
\ No newline at end of file
package com.sd.maplibrary.ui.view;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.Gravity;
import androidx.annotation.ColorInt;
import androidx.annotation.NonNull;
import androidx.appcompat.widget.AppCompatTextView;
import com.sd.maplibrary.R;
public class CircleTextView extends AppCompatTextView {
private Paint circlePaint;
private Paint backPaint;
private Paint textPaint;
private int storkColor = Color.WHITE;
private int circleBackColor = Color.WHITE;
private float storkWidth;
public CircleTextView(@NonNull Context context) {
super(context);
init(context, null);
}
public CircleTextView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs);
}
private void init(Context context, AttributeSet attrs) {
setGravity(Gravity.CENTER);
setPadding(getPaddingLeft(), getPaddingTop(), getPaddingRight(), getPaddingBottom());
circlePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
circlePaint.setStyle(Paint.Style.STROKE);
backPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
backPaint.setStyle(Paint.Style.FILL);
textPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
storkWidth = 0;
if (attrs != null) {
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CircleTextView);
storkColor = typedArray.getColor(R.styleable.CircleTextView_storkColor, storkColor);
circleBackColor = typedArray.getColor(R.styleable.CircleTextView_backColor, circleBackColor);
storkWidth = typedArray.getDimension(R.styleable.CircleTextView_storkWidth, storkWidth);
typedArray.recycle();
}
if (storkWidth != 0) {
circlePaint.setStrokeWidth(storkWidth);
circlePaint.setColor(storkColor);
}
backPaint.setColor(circleBackColor);
textPaint.setColor(getCurrentTextColor());
textPaint.setTextSize(getTextSize());
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
int height = getHeight();
int width = getWidth();
int radius;
int storkRadius;
int textWidth = (int) textPaint.measureText(getText().toString());
if (width > height) {
if (height > textWidth) {
radius = height;
} else {
setHeight(textWidth + getPaddingTop() + getPaddingBottom());
radius = textWidth;
}
} else {
if (width > textWidth) {
radius = width;
} else {
setWidth(textWidth + getPaddingRight() + getPaddingLeft());
radius = textWidth;
}
}
storkRadius = (int) (radius / 2 - storkWidth);
radius = storkRadius - 1;
if (storkWidth != 0)
canvas.drawCircle(getWidth() / 2, getHeight() / 2, storkRadius, circlePaint);
canvas.drawCircle(getWidth() / 2, getHeight() / 2, radius, backPaint);
Paint.FontMetrics fontMetrics = textPaint.getFontMetrics();
canvas.drawText(getText().toString(), getWidth() / 2 - textPaint.measureText(getText().toString()) / 2, getHeight() / 2 - fontMetrics.descent + (fontMetrics.bottom - fontMetrics.top) / 2, textPaint);
}
public void setMyStorkColor(@ColorInt int color) {
this.storkColor = color;
circlePaint.setColor(storkColor);
// invalidate();
}
public void setMyStorkWidth(int storkWidth) {
this.storkWidth = storkWidth;
invalidate();
}
public void setBackColor(@ColorInt int color) {
this.circleBackColor = color;
backPaint.setColor(circleBackColor);
invalidate();
}
public void setMyTextColor(@ColorInt int color) {
textPaint.setColor(color);
invalidate();
}
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment