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

集成初始化,显示地图,显示定位蓝点

parent b785e7cb
package com.sd.maplibrary.fragments package com.sd.maplibrary.fragments
import android.app.Activity import android.app.Activity
import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.util.Log import android.util.Log
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.result.contract.ActivityResultContracts
import androidx.activity.viewModels import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels import com.minedata.minenavi.map.MineMap
import com.sd.maplibrary.MAP_TYPE import com.sd.maplibrary.core.MapReadyView
import com.sd.maplibrary.MSDKInitializer
import com.sd.maplibrary.base.BaseFragment
import com.sd.maplibrary.databinding.FragmentForeMapBinding import com.sd.maplibrary.databinding.FragmentForeMapBinding
import com.sd.maplibrary.ui.SearchActivity import com.sd.maplibrary.ui.MapMultiView.OnMapReadyLis
import com.sd.maplibrary.viewmodels.FourMapOpVm
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
//private const val ARG_PARAM1 = "param1" //private const val ARG_PARAM1 = "param1"
...@@ -24,7 +20,7 @@ import com.sd.maplibrary.viewmodels.FourMapOpVm ...@@ -24,7 +20,7 @@ import com.sd.maplibrary.viewmodels.FourMapOpVm
/** /**
*四维地图 *四维地图
*/ */
class ForeMapFragment : BaseFragment() { class ForeMapFragment : Fragment() {
// private var param1: String? = null // private var param1: String? = null
// private var param2: String? = null // private var param2: String? = null
...@@ -43,13 +39,11 @@ class ForeMapFragment : BaseFragment() { ...@@ -43,13 +39,11 @@ class ForeMapFragment : BaseFragment() {
binding = FragmentForeMapBinding.inflate(inflater, container, false) binding = FragmentForeMapBinding.inflate(inflater, container, false)
// Inflate the layout for this fragment // Inflate the layout for this fragment
return binding.root return binding.root
// return inflater.inflate(R.layout.fragment_fore_map, container, false)
} }
private lateinit var binding: FragmentForeMapBinding private lateinit var binding: FragmentForeMapBinding
//四维地图操作
private val fourMapOpVm: FourMapOpVm by activityViewModels()
//跳转到搜索界面 //跳转到搜索界面
private var searchAct = private var searchAct =
...@@ -61,31 +55,36 @@ class ForeMapFragment : BaseFragment() { ...@@ -61,31 +55,36 @@ class ForeMapFragment : BaseFragment() {
} }
}) })
private var mMineMap: MineMap? = null
private var onMapReadyLis: OnMapReadyLis? = null
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
initView() initView()
setLis() setLis()
fourMapOpVm.starLoc()
} }
private fun initView(){ private fun initView() {
when(MSDKInitializer.getMapType()){
MAP_TYPE.MINE->{
fourMapOpVm.init(binding.mapView)
// fourMapOpVm.mOnMapViewListener=this@ForeMapFragment
}
MAP_TYPE.AMAP->{
} }
private fun setLis() {
binding.mapView.addMapRenderCallback { mineMap ->
this.mMineMap = mineMap
MapReadyView.instance.mMineMap = mineMap
onMapReadyLis?.onMapReady(MapReadyView.instance)
} }
} }
private fun setLis() { /****地图加载监听回调*/
binding.sLayout.searchLl.setOnClickListener { fun addMapRenderCallback(onMapReadyLis: OnMapReadyLis) {
val intent = Intent(requireContext(), SearchActivity::class.java) this.onMapReadyLis = onMapReadyLis
searchAct.launch(intent)
} }
fun getAnyMap(): MineMap? {
return mMineMap
} }
override fun onPause() { override fun onPause() {
...@@ -100,8 +99,8 @@ class ForeMapFragment : BaseFragment() { ...@@ -100,8 +99,8 @@ class ForeMapFragment : BaseFragment() {
override fun onDestroy() { override fun onDestroy() {
super.onDestroy() super.onDestroy()
fourMapOpVm.stopLoc()
binding.mapView.onDestroy() binding.mapView.onDestroy()
binding.mapView.map
} }
companion object { companion object {
......
package com.sd.maplibrary.intfaces
import com.minedata.minenavi.mapdal.PoiFavorite
import com.minedata.minenavi.navi.ArrowInfo
import com.minedata.minenavi.navi.BusRoute
import com.minedata.minenavi.navi.GuidanceText
import com.minedata.minenavi.navi.MineNaviListener
import com.minedata.minenavi.navi.NaviProgressData
import com.minedata.minenavi.navi.NaviSessionData
import com.minedata.minenavi.navi.RouteBase
import com.minedata.minenavi.navi.RouteBriefQuerier
import com.minedata.minenavi.navi.RouteCollection
import com.minedata.minenavi.navi.RouterErrorInfo
import com.minedata.minenavi.navi.SmoothNaviData
import com.minedata.minenavi.navi.TmcSections
/***
* 导航监听
*/
abstract class MyMineNaviListener : MineNaviListener {
override fun onCalculateRouteSuccess(data: RouteCollection) {
// 路线规划成功
}
override fun onCalculateBusSuccess(p0: List<BusRoute?>?) {
}
override fun onCalculateRouteFailed(data: RouterErrorInfo) {
// 路线规划失败
}
override fun onCalculateVrpSuccess(p0: List<PoiFavorite?>?) {
}
//到达目的地后回调函数
override fun onArriveDestination() {
}
override fun onWayPointArrived(p0: Int) {
}
//当前有新的转弯箭头需要显示回调函数
override fun onNewArrow(arrowInfo: ArrowInfo) {
}
override fun onDeleteArrow() {
}
override fun onNewRouteTaken() {
}
override fun onRouteRemoved() {
}
override fun onNeedsReroute() {
}
override fun onRerouteCancelled() {
}
override fun onRerouteComplete(p0: RouteBase?) {
}
override fun onRerouteFailed(p0: RouterErrorInfo) {
}
override fun onRerouteStarted() {
}
override fun onRouteCancelled() {
}
override fun onRouteStarted() {
}
override fun onRouting() {
}
override fun onNaviBegin() {
}
override fun onSimNaviBegin() {
}
override fun onSimNaviEnd() {
}
override fun onNaviEnded() {
}
/***
* 车位置发生改变
* */
override fun onTracking(data: NaviSessionData) {
}
/**
* 导航或者模拟导航时平滑跟踪
* **/
override fun onSmoothTracking(data: SmoothNaviData) {
}
/**
* 解析 naviProgressData 导航更新信息
* **/
override fun onDataUpdated(naviProgressData: NaviProgressData) {
}
/**
* 引导文字改变
* **/
override fun onTextChanged(guidanceText: GuidanceText) {
}
/**
* 导航路口剩余距离
* */
override fun onDistanceChanged(p0: Int) {
}
/**
* 解析 tmcSections 路况(TMC)信息条中的段信息
* **/
override fun onTiBarUpdated(tmcSections: TmcSections) {
}
override fun onRouteTmcUpdated(p0: RouteBase?) {
}
override fun onRouteTeUpdated(p0: RouteBase?) {
}
override fun onRouteBriefRequestSucceeded(p0: RouteBriefQuerier.RouteBrief?) {
}
override fun onRouteBriefRequestFailed(p0: Int, p1: String?) {
}
override fun onRouteBriefRequestCancelled() {
}
}
\ No newline at end of file
package com.sd.maplibrary.intfaces
import com.minedata.minenavi.navi.GuidanceText
import com.minedata.minenavi.navi.NaviProgressData
import com.minedata.minenavi.navi.RouteBase
import com.minedata.minenavi.navi.RouteDetailItem
import com.minedata.minenavi.navi.TmcSections
interface OnNaviPresenterListener {
fun onDataUpdated(naviProgressData: NaviProgressData)
fun onTiBarUpdated(tmcSections: TmcSections)
fun onTextChanged(guidanceText: GuidanceText)
fun onDistanceChanged(distance: Int)
fun onRouteDetailBrowserLoaded(routeDetailItems: MutableList<RouteDetailItem>?)
fun onCalculateRouteSuccess(routeBase: RouteBase?)
fun onCalculateRouteFailed(msg: String?)
fun onArriveDestination()
fun onRerouteFailed(msg: String?)
fun onNaviBegin()
fun onNaviEnded()
fun onSimNaviBegin()
fun onSimNaviEnd()
/**
* 走过了多少路
* @param ratio
*/
fun onTracking(ratio: Float)
fun onGpsConnected()
}
\ No newline at end of file
package com.sd.maplibrary.ui.view package com.sd.maplibrary.ui
import android.content.Context import android.content.Context
import android.graphics.Rect import android.graphics.Rect
...@@ -26,7 +26,7 @@ class ForeMapView : MapView { ...@@ -26,7 +26,7 @@ class ForeMapView : MapView {
fun onScrollFinished() fun onScrollFinished()
} }
private val mListeners = arrayListOf<ForeMapView.Listener>() private val mListeners = arrayListOf<Listener>()
fun addListener(listener: Listener) { fun addListener(listener: Listener) {
mListeners.add(listener) mListeners.add(listener)
......
...@@ -4,10 +4,14 @@ import android.content.Context ...@@ -4,10 +4,14 @@ import android.content.Context
import android.util.AttributeSet import android.util.AttributeSet
import android.view.LayoutInflater import android.view.LayoutInflater
import android.widget.LinearLayout import android.widget.LinearLayout
import androidx.core.content.withStyledAttributes
import androidx.fragment.app.FragmentActivity import androidx.fragment.app.FragmentActivity
import com.amap.api.maps.AMap
import com.minedata.minenavi.map.MineMap
import com.sd.maplibrary.MAP_TYPE import com.sd.maplibrary.MAP_TYPE
import com.sd.maplibrary.MSDKInitializer import com.sd.maplibrary.MSDKInitializer
import com.sd.maplibrary.R import com.sd.maplibrary.R
import com.sd.maplibrary.core.MapReadyView
import com.sd.maplibrary.databinding.MultiViewBinding import com.sd.maplibrary.databinding.MultiViewBinding
import com.sd.maplibrary.fragments.AMapFragment import com.sd.maplibrary.fragments.AMapFragment
import com.sd.maplibrary.fragments.ForeMapFragment import com.sd.maplibrary.fragments.ForeMapFragment
...@@ -31,23 +35,27 @@ class MapMultiView : LinearLayout { ...@@ -31,23 +35,27 @@ class MapMultiView : LinearLayout {
init(attrs, defStyleAttr) init(attrs, defStyleAttr)
} }
interface OnMapReadyLis {
fun onMapReady(mapReadyView: MapReadyView)
}
private lateinit var binding: MultiViewBinding private lateinit var binding: MultiViewBinding
//四维地图 //四维地图
private val foreMapFragment by lazy { ForeMapFragment.newInstance() } private val foreMapFragment by lazy { ForeMapFragment.newInstance() }
//高德地图 //高德地图
private val aMapFragment by lazy { AMapFragment.newInstance() } private val aMapFragment by lazy { AMapFragment.newInstance() }
private var enmuValue = 0 private var enmuValue = 0
private fun init(attrs: AttributeSet?, defStyle: Int) { private fun init(attrs: AttributeSet?, defStyle: Int) {
// context.withStyledAttributes(attrs, R.styleable.MapMultiView, defStyle, 0) { context.withStyledAttributes(attrs, R.styleable.MapMultiView, defStyle, 0) {
// if (hasValue(R.styleable.MapMultiView_map_type)) { if (hasValue(R.styleable.MapMultiView_map_type)) {
// enmuValue = getInt(R.styleable.MapMultiView_map_type, 0) enmuValue = getInt(R.styleable.MapMultiView_map_type, 0)
// } }
// } }
// println("------------MSDKInitializer. = ${MSDKInitializer.getMapType()}") println("------------MSDKInitializer. = ${MSDKInitializer.getMapType()}")
binding = MultiViewBinding.inflate(LayoutInflater.from(context)) binding = MultiViewBinding.inflate(LayoutInflater.from(context))
addView(binding.root) addView(binding.root)
loadMapFrament() loadMapFrament()
...@@ -58,15 +66,35 @@ class MapMultiView : LinearLayout { ...@@ -58,15 +66,35 @@ class MapMultiView : LinearLayout {
if (context is FragmentActivity) { if (context is FragmentActivity) {
var act = context as FragmentActivity var act = context as FragmentActivity
var ft = act.supportFragmentManager.beginTransaction() var ft = act.supportFragmentManager.beginTransaction()
val map_type = MSDKInitializer.getMapType() if (enmuValue == MAP_TYPE.MINE.ordinal) {
if (map_type == MAP_TYPE.MINE) { ft.replace(R.id.frame_layout, foreMapFragment)
ft.replace(R.id.frame_layout,foreMapFragment) } else if (enmuValue == MAP_TYPE.AMAP.ordinal) {
} else if (map_type == MAP_TYPE.AMAP) { ft.replace(R.id.frame_layout, aMapFragment)
ft.replace(R.id.frame_layout,aMapFragment)
} }
ft.commit() ft.commit()
} }
} }
/****地图加载监听回调*/
fun addMapRenderCallback(onMapReadyLis: OnMapReadyLis) {
if (enmuValue == 0) {
foreMapFragment.addMapRenderCallback(onMapReadyLis)
} else if (enmuValue == 1) {
aMapFragment.addMapRenderCallback(onMapReadyLis)
}
}
/****获取 mMineMap 或者 aMap ***/
fun getAnyMap(): Any? {
if (enmuValue == 0) {
return foreMapFragment.getAnyMap() as MineMap
} else if (enmuValue == 1) {
return aMapFragment.getAnyMap() as AMap
}
return null
}
} }
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();
}
}
package com.sd.maplibrary.ui.view;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import androidx.appcompat.widget.AppCompatEditText;
/**
* @author Administrator
* 在焦点变化时和输入内容发生变化时均要判断是否显示右边clean图标
*/
public class CleanableEditText extends AppCompatEditText {
private Drawable mRightDrawable;
private boolean isHasFocus;
public CleanableEditText(Context context) {
super(context);
init();
}
public CleanableEditText(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public CleanableEditText(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
private void init() {
// getCompoundDrawables:
// Returns drawables for the left, top, right, and bottom borders.
Drawable[] drawables = this.getCompoundDrawables();
// 取得right位置的Drawable
// 即我们在布局文件中设置的android:drawableRight
mRightDrawable = drawables[2];
// mRightDrawable.setBounds(0,0,25,25);
// 设置焦点变化的监听
this.setOnFocusChangeListener(new FocusChangeListenerImpl());
// 设置EditText文字变化的监听
this.addTextChangedListener(new TextWatcherImpl());
// 初始化时让右边clean图标不可见
setClearDrawableVisible(false);
}
/**
* 当手指抬起的位置在clean的图标的区域 我们将此视为进行清除操作 getWidth():得到控件的宽度
* event.getX():抬起时的坐标(改坐标是相对于控件本身而言的)
* getTotalPaddingRight():clean的图标左边缘至控件右边缘的距离
* getPaddingRight():clean的图标右边缘至控件右边缘的距离 于是: getWidth() -
* getTotalPaddingRight()表示: 控件左边到clean的图标左边缘的区域 getWidth() -
* getPaddingRight()表示: 控件左边到clean的图标右边缘的区域 所以这两者之间的区域刚好是clean的图标的区域
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_UP:
boolean isClean = (event.getX() > (getWidth() - getTotalPaddingRight()))
&& (event.getX() < (getWidth() - getPaddingRight()));
if (isClean) {
setText("");
}
break;
default:
break;
}
return super.onTouchEvent(event);
}
private class FocusChangeListenerImpl implements OnFocusChangeListener {
@Override
public void onFocusChange(View v, boolean hasFocus) {
isHasFocus = hasFocus;
if (isHasFocus) {
boolean isVisible = getText().toString().length() >= 1;
setClearDrawableVisible(isVisible);
} else {
setClearDrawableVisible(false);
}
}
}
// 当输入结束后判断是否显示右边clean的图标
private class TextWatcherImpl implements TextWatcher {
@Override
public void afterTextChanged(Editable s) {
boolean isVisible = getText().toString().length() >= 1;
setClearDrawableVisible(isVisible);
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
}
}
// 隐藏或者显示右边clean的图标
protected void setClearDrawableVisible(boolean isVisible) {
Drawable rightDrawable;
if (isVisible) {
rightDrawable = mRightDrawable;
} else {
rightDrawable = null;
}
// 使用代码设置该控件left, top, right, and bottom处的图标
setCompoundDrawables(getCompoundDrawables()[0],
getCompoundDrawables()[1], rightDrawable,
getCompoundDrawables()[3]);
}
}
package com.sd.maplibrary.viewmodels
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
class Ee:ViewModel() {
fun sdsd(){
}
}
\ No newline at end of file
package com.sd.maplibrary.viewmodels
import android.annotation.SuppressLint
import android.app.Application
import android.os.Bundle
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import com.minedata.minenavi.location.MineLocation
import com.minedata.minenavi.location.MineLocationListener
import com.minedata.minenavi.location.MineLocationManager
import com.minedata.minenavi.location.MineLocationOptions
import com.minedata.minenavi.map.MineMap
import com.minedata.minenavi.map.MyLocationStyle
import com.minedata.minenavi.mapdal.CoordType
import com.sd.maplibrary.bean.MyLocBean
import com.sd.maplibrary.ui.view.ForeMapView
import com.sd.maplibrary.utils.MyContants
/***四维地图操作类***/
class FourMapOpVm(private var application: Application) : AndroidViewModel(application) {
@SuppressLint("StaticFieldLeak")
private lateinit var mMapView: ForeMapView
private lateinit var mMineMap: MineMap
private var mMyLocationStyle: MyLocationStyle? = null
//我的定位信息
var myLocBean = MutableLiveData<MyLocBean>()
fun init(foreMapView: ForeMapView) {
mMapView = foreMapView
MineLocationManager.getInstance()
.init(application, MineLocationManager.LocationSource.all)
MineLocationManager.getInstance().addListener(mineLocationListener)
mMapView.addMapRenderCallback { mineMap: MineMap ->
mMineMap = mineMap
mMineMap.minZoomLevel = 0.0f
mMineMap.maxZoomLevel = 17.0f
addMyLocationStyle()
mOnMapViewListener?.onMapReady()
}
}
private fun addMyLocationStyle() {
// 定位蓝点,默认使用内置定位
mMyLocationStyle = MyLocationStyle()
// 使用外部传入位置信息
mMyLocationStyle?.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATE)
// mMyLocationStyle.setPosition(point);
// mMyLocationStyle.orientAngle(30.0f);
// mMyLocationStyle.interval(2000);
mMyLocationStyle?.showMyLocation(true)
mMyLocationStyle?.setClickable(true)
mMineMap.setMyLocationStyle(mMyLocationStyle)
}
/***
* 开启定位
*/
fun starLoc(): LiveData<MyLocBean> {
// 设置定位参数,并开始定位。
val options = MineLocationOptions()
options.setCoordType(CoordType.GCJ02)
options.setGpsInterval(1000);//GPS定位更新时间,最小1000
options.setNetWorkInterval(3000);//WiFi定位更新时间,最小3000
options.setStationInterval(5000);//基站定位更新时间,最小500
MineLocationManager.getInstance().start(options)
return myLocBean
}
fun stopLoc() {
MineLocationManager.getInstance().removeAllListener()
MineLocationManager.getInstance().stop()
MineLocationManager.getInstance().cleanup()
}
////////////////////////////////////
////////////////////////////////////
////////////////////////////////////
var mOnMapViewListener: OnMapViewListener? = null
interface OnMapViewListener {
fun onMapReady()
fun onswitchLocation(imageLevel: Int)
}
private var mineLocationListener = object : MineLocationListener {
override fun onSimLocationChanged(location: MineLocation?) {
var a = 0
}
override fun onLocationChanged(location: MineLocation?) {
println("-------定位改变 = ${location?.latitude} curLng=${location?.longitude} speed=${location?.speed}")
// var df = DecimalFormat("#.00000000")
MyContants.CUR_LAT = location?.latitude ?: 0.0
MyContants.CUR_LNG = location?.longitude ?: 0.0
MyContants.CUR_SPEED = location?.speed ?: 0f
// MyPres.curLat = MyContants.CUR_LAT
// MyPres.curLng = MyContants.CUR_LNG
if (MyContants.CUR_SPEED > 0f) {
// MyPres.curSpeed = MyContants.CUR_SPEED
}
var myLoc = MyLocBean().apply {
curLat = MyContants.CUR_LAT
curLng = MyContants.CUR_LNG
// curLat = MyContants.MOCK_LAT
// curLng = MyContants.MOCK_LNG
speed = MyContants.CUR_SPEED
}
// myLocBean.postValue(bean)
myLocBean.value = myLoc
}
override fun onStatusChanged(provider: String?, status: Int, extras: Bundle?) {
var a = 0
}
override fun onProviderEnabled(provider: String?) {
var a = 0
}
override fun onProviderDisabled(provider: String?) {
var b = 0
}
}
}
\ No newline at end of file
package com.sd.maplibrary.viewmodels
import android.annotation.SuppressLint
import android.app.Application
import android.content.Context
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import com.minedata.minenavi.mapdal.PoiItem
import com.minedata.minenavi.poiquery.LatLonPoint
import com.minedata.minenavi.poiquery.PoiResult
import com.minedata.minenavi.poiquery.PoiSearch
import com.minedata.minenavi.poiquery.SearchErrorCode
import com.minedata.minenavi.poiquery.SortType
import com.sd.maplibrary.bean.PoiSearchBean
import com.sd.maplibrary.utils.MyContants
/***四维地图搜索相关***/
class SearchForeMapVm(private var application: Application) : AndroidViewModel(application) {
@SuppressLint("StaticFieldLeak")
private var ctx: Context? = null
private var poiSearch: PoiSearch? = null
//搜索结果
var poiSearchBean = MutableLiveData<List<PoiSearchBean>>()
init {
ctx = application.applicationContext
poiSearch = PoiSearch(ctx)
poiSearch?.setOnPoiSearchListener(object : PoiSearch.OnPoiSearchListener {
override fun onPoiItemSearched(poiItem: PoiItem?, errorCode: Int) {
var a=0
}
override fun onPoiSearched(
poiResult: PoiResult?, errorCode: Int
) {
if (errorCode == SearchErrorCode.none) {
var temps = poiResult?.getPois()
var poiList = temps!!.map { pos ->
PoiSearchBean().apply {
lat = pos.location.latitude
lng = pos.location.longitude
// title = "${pos.provinceName}${pos.cityName}${pos.district}${pos.title}"
title = pos.title
snippet = pos.snippet
cityName = pos.cityName
//这里为0 因为不是范围搜素
distance = pos.distance
adCode = pos.adCode
}
}
poiSearchBean.postValue(poiList)
} else {
}
}
})
}
fun getPoiList(str: String,curLat: Double, curLng: Double): LiveData<List<PoiSearchBean>> {
val query = PoiSearch.Query(str,"")
// 限制严格按照设置城市搜索
// query.setCityLimit(true)
// 设置查询位置点
if (curLat != 0.0 && curLng != 0.0) {
query.setLocation(LatLonPoint(curLat, curLng))
}
// 设置排序方式为热度排序
query.setSortType(SortType.SORT_TYPE_HIT)
// 返回父子关系
query.requireSubPois(false)
// 设置查询每页的结果数目
query.setPageSize(10)
poiSearch?.setQuery(query)
// 开始搜索
poiSearch?.searchPOIAsyn()
return poiSearchBean
}
}
\ No newline at end of file
package com.sd.maplibrary.vms
import androidx.lifecycle.ViewModel
import com.sd.maplibrary.core.MSLocationStyle
import com.sd.maplibrary.core.MapReadyView
class MainVM: ViewModel() {
//显示定位蓝点
fun showMyLocLandian(mapReadView: MapReadyView?){
MSLocationStyle.setLocationStyle(mapReadView)
}
}
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" <com.amap.api.maps.MapView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:id="@+id/mMapView"
android:layout_width="match_parent" android:layout_width="wrap_content"
android:layout_height="match_parent" android:layout_height="match_parent" />
tools:context=".fragments.AMapFragment">
<!-- TODO: Update blank fragment layout -->
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="@string/hello_blank_fragment" />
</FrameLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android" <com.minedata.minenavi.map.MapView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"> xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/mapView"
<data>
</data>
<RelativeLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
tools:context=".fragments.ForeMapFragment"> tools:context=".fragments.ForeMapFragment" />
<!-- smallView="true"--> <!-- smallView="true"-->
...@@ -20,17 +13,13 @@ ...@@ -20,17 +13,13 @@
<!-- smallViewLeft="0"--> <!-- smallViewLeft="0"-->
<!-- smallViewRight="10"--> <!-- smallViewRight="10"-->
<!-- smallViewTop="0"--> <!-- smallViewTop="0"-->
<com.sd.maplibrary.ui.view.ForeMapView
android:id="@+id/mapView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<include <!-- <include-->
android:id="@+id/s_layout" <!-- android:id="@+id/s_layout"-->
layout="@layout/search_layout" /> <!-- layout="@layout/search_layout" />-->
<!--</com.minedata.minenavi.map.MapView>-->
</RelativeLayout>
</layout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:background="@drawable/rect_white_10"
android:paddingVertical="@dimen/dp_20"
android:paddingHorizontal="@dimen/dp_50"
android:orientation="vertical"
tools:context=".ui.dialog.LoadDialogFragment">
<ProgressBar
style="?android:attr/progressBarStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="正在加载" />
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
</data>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/frame_layout" android:id="@+id/frame_layout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" /> android:layout_height="match_parent" />
<RelativeLayout <!-- <RelativeLayout-->
android:layout_width="match_parent" <!-- android:layout_width="match_parent"-->
android:layout_height="40dp" <!-- android:layout_height="40dp"-->
android:background="#66E4E4E4"> <!-- android:background="#66E4E4E4">-->
<!-- <TextView-->
<!-- android:layout_width="wrap_content"-->
<!-- android:layout_height="wrap_content"-->
<!-- android:layout_alignParentRight="true"-->
<!-- android:layout_centerVertical="true"-->
<!-- android:paddingVertical="2dp"-->
<!-- android:paddingRight="10dp"-->
<!-- android:text="切换地图"-->
<!-- android:textSize="14sp" />-->
<TextView <!-- </RelativeLayout>-->
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:paddingVertical="2dp"
android:paddingRight="10dp"
android:text="切换地图"
android:textSize="14sp" />
</RelativeLayout> <!-- </RelativeLayout>-->
</RelativeLayout>
</layout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/search_ll"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/rect_white_10"
android:elevation="2dp"
android:orientation="horizontal"
android:paddingHorizontal="10dp"
android:paddingVertical="8dp"
tools:showIn="@layout/fragment_fore_map">
<!-- android:src="@drawable/ic_arrow_back_24"-->
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:src="@drawable/icon_search" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginLeft="5dp"
android:hint="搜索地点或地址"
android:textColorHint="#66000000"
android:textSize="12sp" />
</LinearLayout>
\ No newline at end of file
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