osmdroid简单的点符号化与文字符号化

由于项目需要,需要对点、线、面等图形数据进行复杂的符号化展示,自己瞎琢磨了好几天,心态都快不行了的时候,后来才发现只要根据需要重写 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)
    }
}

这个复杂一点,包括想将点展示成图片,点的选中状态等等。如果是选中状态的话将颜色改变成红色,进行区别展示。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值