由于项目需要,需要对点、线、面等图形数据进行复杂的符号化展示,自己瞎琢磨了好几天,心态都快不行了的时候,后来才发现只要根据需要重写 draw方法就可以了。
文字符号化
class TextSymbol(geopoint: GeoPoint, text: String, color: Int): Overlay() {
var point = geopoint
var textStr = text
var textColor = color
override fun draw(pCanvas: Canvas?, pMapView: MapView?, p2: Boolean) {
var localPoint = pMapView!!.projection.toPixels(point, null)
if (localPoint != null) {
var paint = Paint()
paint.style = Paint.Style.STROKE
paint.color = textColor
paint.textSize = 32f
pCanvas!!.drawText(textStr, localPoint.x.toFloat(), localPoint.y.toFloat(), paint)
}
}
}
文字符号化弄了个简单的,在使用时传入点,文字以及文字的颜色,添加到地图上即可显示。
点的复杂符号化
class MarkSymbol(geopoint: GeoPoint, pointStyle: Paint,
textStyle: Paint, symbol: SimpleFastPointOverlayOptions.Shape,
circleRadius: Float, vectorDrawableId: Int, context: Context, showLabel: Boolean,text: String,select: Boolean
) : IconOverlay() {
var point = geopoint
var textStylePaint = textStyle
var lable = text
var pointStylePaint = pointStyle
var mSymbol = symbol
var mCircleRadius = circleRadius
var drawable = vectorDrawableId
var context = context
var showLabel = showLabel
var drawablemIcon: Drawable = context!!.getDrawable(drawable)!!
var isSelect = select
init {
var width = drawablemIcon.intrinsicWidth
var height = drawablemIcon.intrinsicHeight
var rect = Rect(0, 0, width + 10, height + 10)
drawablemIcon.bounds = rect
}
override fun draw(pCanvas: Canvas?, pMapView: MapView?, p2: Boolean) {
var localPoint = pMapView!!.projection.toPixels(point, null)
if (localPoint != null) {
drawPointAt(pCanvas!!, localPoint.x.toFloat(),localPoint.y.toFloat(),showLabel, lable, pointStylePaint,textStylePaint )
}
}
protected fun drawPointAt(
canvas: Canvas,
x: Float,
y: Float,
showLabel: Boolean,
label: String?,
pointStyle: Paint?,
textStyle: Paint?) {
if(drawable == null){
if (mSymbol == SimpleFastPointOverlayOptions.Shape.CIRCLE) {
canvas.drawCircle(x, y, mCircleRadius, pointStyle!!)
} else{
canvas.drawRect(x - mCircleRadius, y - mCircleRadius, x + mCircleRadius, y + mCircleRadius, pointStyle!!)
}
if (showLabel && label != null) {
canvas.drawText(label, x, y - mCircleRadius - 5, textStyle!!)
}
}else{
var bitmap = Command.getBitmap(context!!, drawable)
var dst = Rect()
dst.left = x.toInt()
dst.top = y.toInt()
dst.right = x.toInt() + bitmap!!.width;
dst.bottom = y .toInt() + bitmap!!.height;
if(!isSelect){
canvas!!.drawBitmap(bitmap!!,null, dst, null)
}else{
var tempBitmap = BitmapUtil().tintBitmap(bitmap, Color.RED)
canvas.drawBitmap(tempBitmap, null, dst, null)
}
}
}
var clickListener: OnClickListener? = null
override fun onSingleTapConfirmed(event: MotionEvent?, mapView: MapView?): Boolean {
var touched = hitTest(event!!, mapView!!)
if (touched && clickListener != null) {
clickListener!!.onClick(point)
return true
} else {
return super.onSingleTapConfirmed(event, mapView)
}
}
fun setOnClickListener(listener: OnClickListener) {
clickListener = listener
}
interface OnClickListener {
fun onClick(point: GeoPoint?)
}
//判断是否点中了点
protected fun hitTest(
event: MotionEvent, mapView: MapView): Boolean {
var pj = mapView.projection
if (point == null || mPositionPixels == null || pj == null) return false
pj.toPixels(point, mPositionPixels)
var screenRect = pj.intrinsicScreenRect
var x = -mPositionPixels.x + screenRect.left + event.x.toInt()
var y = -mPositionPixels.y + screenRect.top + event.y.toInt()
return drawablemIcon.bounds.contains(x, y)
}
}
这个复杂一点,包括想将点展示成图片,点的选中状态等等。如果是选中状态的话将颜色改变成红色,进行区别展示。