Android安卓 自定义高德地图比例尺
来源:互联网 发布:淘宝调整上下架时间 编辑:程序博客网 时间:2024/05/16 19:50
高德地图有提供自带的比例尺,但是不能改变位置,只能固定在屏幕右下角,做项目时,有些需求非要在某个位置,那就只能自定义了。
用高德自带的比例尺测试过,同一缩放等级,不同经纬度,比例尺也可能是不一样的,所以不能根据缩放等级处理。
好在高德地图有提供相应api
比例尺数据:AMap. getScalePerPixel()可以获取当前地图级别下1像素点对应的距离长度(米),然后可自定义比例尺长度(如100像素)。
效果图如下。
完整代码:
public class MapScaleView extends View { private int scaleWidth; private int scaleHeight; private int scaleSpaceText; private int textSize; private String text; private Paint mPaint; private Rect scaleRect; public MapScaleView(Context context) { this(context, null); } public MapScaleView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public MapScaleView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); this.initVariables(); } private void initVariables() { scaleWidth = 150;//比例尺宽度 scaleHeight = ResHelper.dipToPx(this.getContext(), 3);//比例尺高度 text = "10km";//比例尺文本 textSize = ResHelper.sp2px(this.getContext(), 11);//比例尺字体 scaleSpaceText = scaleHeight;//比例尺文本与图形的间隔高度 mPaint = new Paint();//画笔 mPaint.setColor(Color.BLACK); mPaint.setAntiAlias(true); mPaint.setTextSize(textSize); scaleRect = new Rect(); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int widthSize = MeasureSpec.getSize(widthMeasureSpec); int widthMode = MeasureSpec.getMode(widthMeasureSpec); int resultWidth; if (widthMode == MeasureSpec.EXACTLY) { resultWidth = widthSize; } else { resultWidth = scaleWidth; if (widthMode == MeasureSpec.AT_MOST) { resultWidth = Math.min(resultWidth, widthSize); } } int heightSize = getHeightSize(heightMeasureSpec); setMeasuredDimension(resultWidth, heightSize); } /** * 测量ScaleView的高度 */ private int getHeightSize(int heightMeasureSpec) { int mode = MeasureSpec.getMode(heightMeasureSpec); int height = 0; switch (mode) { case MeasureSpec.AT_MOST: height = textSize + scaleSpaceText + scaleHeight; break; case MeasureSpec.EXACTLY: { height = MeasureSpec.getSize(heightMeasureSpec); break; } case MeasureSpec.UNSPECIFIED: { height = Math.max(textSize + scaleSpaceText + scaleHeight, MeasureSpec.getSize(heightMeasureSpec)); break; } } return height; } /** * 绘制上面的文字和下面的比例尺,因为比例尺是.9.png,我们需要利用{@link #drawNinePath(Canvas, int, Rect)}方法绘制比例尺 */ @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); float textWidth = mPaint.measureText(text); canvas.drawText(text, (scaleWidth - textWidth) / 2, textSize, mPaint); scaleRect.set(0, textSize + scaleSpaceText, scaleWidth, textSize + scaleSpaceText + scaleHeight); drawNinePath(canvas, R.drawable.blc, scaleRect); } private void drawNinePath(Canvas canvas, int resId, Rect rect) { Bitmap bmp = BitmapFactory.decodeResource(getResources(), resId); NinePatch patch = new NinePatch(bmp, bmp.getNinePatchChunk(), null); patch.draw(canvas, rect); } /** * 根据缩放级别更新ScaleView的文字以及比例尺的长度 */ public void refreshScaleView(AMap mapView) { if (mapView == null) { return; } int max = 100; double scale = mapView.getScalePerPixel() * max;//结果单位米,表示图上max像素代表*米 if (scale > 0 && scale <= 14) {//换算10米 text = "10m"; scaleWidth = (int) (10 * max / scale); } else if (scale <= 25) {//换算25米 text = "25m"; scaleWidth = (int) (25 * max / scale); } else if (scale <= 50) {//换算50米 text = "50m"; scaleWidth = (int) (50 * max / scale); } else if (scale <= 100) { text = "100m"; scaleWidth = (int) (100 * max / scale); } else if (scale <= 200) { text = "200m"; scaleWidth = (int) (200 * max / scale); } else if (scale <= 500) { text = "500m"; scaleWidth = (int) (500 * max / scale); } else if (scale <= 1000) { text = "1km"; scaleWidth = (int) (1000 * max / scale); } else if (scale <= 2000) { text = "2km"; scaleWidth = (int) (2000 * max / scale); } else if (scale <= 5000) { text = "5km"; scaleWidth = (int) (5000 * max / scale); } else if (scale <= 10000) { text = "10km"; scaleWidth = (int) (10000 * max / scale); } else if (scale <= 20000) { text = "20km"; scaleWidth = (int) (20000 * max / scale); } else if (scale <= 25000) { text = "25km"; scaleWidth = (int) (25000 * max / scale); } else if (scale <= 50000) { text = "50km"; scaleWidth = (int) (50000 * max / scale); } else if (scale <= 100000) { text = "100km"; scaleWidth = (int) (100000 * max / scale); } else if (scale <= 200000) { text = "200km"; scaleWidth = (int) (200000 * max / scale); } else if (scale <= 500000) { text = "500km"; scaleWidth = (int) (500000 * max / scale); } else if (scale <= 1000000) { text = "1000km"; scaleWidth = (int) (1000000 * max / scale); } requestLayout(); invalidate(); }}
使用方法:
和正常view一样添加到layout中,注意修改包名
<com.xxx.xxx.view.MapScaleView android:id="@+id/blc" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toLeftOf="@id/tv_scale" />
在OnCameraChangeListener
的onCameraChange
中调用比例尺的refreshScaleView()
override fun onCameraChange(p0: CameraPosition?) { if (p0 == null) return blc.refreshScaleView(mMap)}
上面用到的单位转换方法:
public static int dipToPx(Context context, int dip) { float density = context.getResources().getDisplayMetrics().density; return (int) ((float) dip * density + 0.5F); }
public static int sp2px(Context context, float spValue) { final float fontScale = context.getResources().getDisplayMetrics().scaledDensity; return (int) (spValue * fontScale + 0.5F); }
比例尺点9图 blc.9.png
下面这个黑色的,有点小
参考资料:
如何自定义指南针、缩放按钮、比例尺控件、定位按钮?
ArcGIS for Android 自定义地图比例尺
阅读全文
0 0
- Android安卓 自定义高德地图比例尺
- ArcGIS for Android 自定义地图比例尺
- cGIS for Android 自定义地图比例尺
- Android高德地图自定义地图指南针
- IOS 高德地图 初始化 重定义比例尺
- iOS高德地图 初始化 重定义比例尺
- 高德地图缩放级别对应的比例尺
- Android 高德地图自定义InfoWindow
- Android高德地图自定义信息窗
- (android地图开发) 高德地图添加自定义菜单栏
- (android地图开发) 高德地图自定义标题栏
- (android地图开发) 高德地图自定义对话框
- 安卓Android开发——scrollview嵌套高德地图滑动出现黑影
- 地图比例尺
- 高德地图中缩放级别(zoom)和比例尺(getScalePerPixel)之间的计算关系
- 高德地图(二)之显示定位,比例尺和添加Marker
- 安卓api之高德地图API(申请高德地图apiv2)
- ArcGIS For Android 地图比例尺获取
- 我是如何从技术转向产品的
- 伯克利最新发明机器人:他叫Vestri,他能“看见”未来
- 产品工作中保持饥饿感,保持拒绝90%以上的伪需求你就不会错过下一个微信
- iOS开发之获取indexPath等于nil
- PMCAFF微课堂「已结束」| 测试兄弟CEO揭秘如何提高创初团队的产品质量
- Android安卓 自定义高德地图比例尺
- 杂七杂八-Linux
- iPhone Q4出货量将达8800万台,或打破单季最高纪录
- hdu1018(求n!的位数)
- 马化腾:我与马云不同 腾讯强调“去中心化”的赋能
- 第四范式发布企业AI核心系统,帮助企业进行商业分析与决策 | 乌镇峰会
- 中译语通CEO于洋:产品标准化,是大数据分析公司盈利的关键
- 腾讯翻译君亮相“一带一路”论坛 成“翻译国家队”战略合作伙伴
- 多种方法求平均数