FengMap楼层地图源码分析隐藏logo

2023-11-09 20:51

本文主要是介绍FengMap楼层地图源码分析隐藏logo,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在使用第三方Android SDK产品中,大多SDK都有logo,如百度地图,高德地图,然而,这些SDK在嵌入项目使用过程中会发现,手机屏幕就那么大点,logo遮住了冰山一角,就非常影响UI的美观,于是,大多工程师都会看源码去找一些SDK里面的设计漏洞去隐藏Logo,

如:百度地图隐藏logo:https://blog.csdn.net/zhangphil/article/details/47953695

蜂鸟的FengMap楼层地图也不例外,下面是通过源码分析去隐藏FengMa楼层地图的logo,第三方SDK在使用logo时,基本都有两种方式:

第一种:直接绘制渲染上去,但是这种与界面合为一体的,在调整时很不方便,很少使用。

第二种:使用图片水印的形式去添加到view中,这种方式就简单了许多,且可以摆放在界面的任何位置。

蜂鸟的FengMap楼层地图使用的正好是第二种,放在屏幕的右下角,百度地图也是使用第二种添加形式...

这些资源在下载SDK时,都会放在SDK打好的jar包里面,SDK里面也包含JNI的一些.so库,.so库里面是C的代码,方便java通过JNI来快速调用渲染UI,同时达到SDK适配不同的手机CPU架构的目的,这些都是不可以改动的! 使用过程中直接去调用jar包里面的资源即可,以jar包的形式去添加引入,图片marker和一些控制图标也放在jar里面的assets目录下,如fengmap的目录和水印logo:

 

分析完jar包和.so库里面的基本资源后,就可以直接去分析源码,达到我们隐藏logo的目的。看上面assets目录下watermarker.png就是FengMap的logo了,那么,在使用中,怎么去找这张logo引入的入口呢?也就是加载这张图片到view中了。

FengMap和百度地图有些类似,找入口当然要找能在layout里面加载渲染的view了,然而FengMap入口View是通过FMMapView加载的,但是在FMMapView中并没有找到引入watermarker这张logo图片的方法,只是引入加载了一些动画资源。

 

之后通过代码执行去FMMapView.getViewCount()时,里面只有根布局RelativeLayout,也没有找到类似ImageView或ImageButton能加载logo图片之类的view,也没多余的其他view添加到RelativeLayout里面,这样就可以证明logo不是在FMMapView里面add的。

那么继续往上分析,FMMapView里面没有找到,找初始化完FMMapView继而获取FMMap这个操作地图的控制类,能过源码查看,只是看到加载了assets目录下的楼层地图和主题,通过反射去获取图层的操作而已,也没有找到加载watermarker.png logo的地方,但是找到了渲染的接口了。

 

如加载默认主题资源:

加载图层控件指北针图标:

但是找到了一个关键的词和方法:getRender()(获取渲染),并且返回一个FMGLRenderer渲染对象

通过返回的FMGLRenderer类去继续往上深探,发现FMGLRenderer继承自FMMapRenderer类,实现了Renderer接口,

Renderer接口是GLSurfaceView里面的接口,GLSurfaceView是一个渲染类,这样就有了渲染的源头。是系统里面自带类,无法在里面操作渲染,只能由其他类继承或实现接口代理渲染,那么这条线索走不通,看继承类。

那么再来看看继承的FMGLRenderer类,刚好在FMGLRenderer里面看到了添加watermarker.png logo的水印图标。

但是是通过JniView去添加的。那么看看JniView里面有些什么。JniView里面都是封装的.so库里面的方法,通过java调用去渲染

当调用JniView.addWaterMarker(this.viewHandle, "pic/watermarker.png")添加完成后,调用混淆过的方法this.d() ,d方法里面都是设置logo在屏幕中的位置和尺寸。

到此,在JniView里面找到了操作logo的方法,

包括:

addWaterMarker(添加图标),

getWaterMartSize(获取图标大小),

setWaterMartPosition(设置图标位置),

hiddenWaterMartPosition(隐藏图标)

 

方法找到了,但是是以Jni的形式去调用的,那么问题就来了,怎么使用JniView里面提供的java调用Jni的方法?

这就得回到FMGLRenderer里面去看怎么调用这些方法了:

从调用的方法传参可以看出,每交调用操作logo方法时,都必须传入一个参数叫viewHolder的参数,这个参数是一个long值,是通过初始化时创建获取上下文的hashCode值做标识的,哈希值是什么呢:我觉得百度百科回答比较确切一些:

public int hashCode()返回该对象的哈希码值。支持此方法是为了提高哈希表(例如 java.util.Hashtable 提供的哈希表)的性能。在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是将对象进行hashcode比较时所用的信息没有被修改。

 

到这里,方法找到了,方法的参数也明确了,只需要调用JniView.hiddenWaterMartPosition(viewHandle),确保viewHandle的哈希值一致就ok了,在FMMap里面,除了获取渲染入口时提供的渲染类,还封装且返回viewhandle的值,所以可以直接通过FMMap.getViewHandle返回hashcode值,切都是同一个对象,没有被改变过,hashCode完全相同。

还有一点要注意的就是,FengMap地图有加载流程操作,加载调回流程:

地图设置加载回调监听--->回调地图加载成功

设置主题监听---->回调主题加载成功

在渲染地图时,地图加载成功后回调时去设置隐藏logo是隐藏不了的,

只能等主题加载成功后调回方法里面去设置隐藏logo才生效。

 

原因:

1.地图加载和地图主题加载是分开的,需要分别设置监听。

2.先渲染主题再添加logo,这样logo才能显示,如果先渲染logo,再渲染主题,那么logo就会被覆盖

最后展示隐藏右下角logo后的地图

在FengMap地图SDK版本2.1.3之前可用 , 2.1.3之后的版本升级后去掉了隐藏Logo的方法,得重新寻找其他方式隐藏Logo!

 

 

 

 

 

这篇关于FengMap楼层地图源码分析隐藏logo的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/378384

相关文章

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟 开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚 第一站:海量资源,应有尽有 走进“智听

Java ArrayList扩容机制 (源码解读)

结论:初始长度为10,若所需长度小于1.5倍原长度,则按照1.5倍扩容。若不够用则按照所需长度扩容。 一. 明确类内部重要变量含义         1:数组默认长度         2:这是一个共享的空数组实例,用于明确创建长度为0时的ArrayList ,比如通过 new ArrayList<>(0),ArrayList 内部的数组 elementData 会指向这个 EMPTY_EL

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者

MOLE 2.5 分析分子通道和孔隙

软件介绍 生物大分子通道和孔隙在生物学中发挥着重要作用,例如在分子识别和酶底物特异性方面。 我们介绍了一种名为 MOLE 2.5 的高级软件工具,该工具旨在分析分子通道和孔隙。 与其他可用软件工具的基准测试表明,MOLE 2.5 相比更快、更强大、功能更丰富。作为一项新功能,MOLE 2.5 可以估算已识别通道的物理化学性质。 软件下载 https://pan.quark.cn/s/57

工厂ERP管理系统实现源码(JAVA)

工厂进销存管理系统是一个集采购管理、仓库管理、生产管理和销售管理于一体的综合解决方案。该系统旨在帮助企业优化流程、提高效率、降低成本,并实时掌握各环节的运营状况。 在采购管理方面,系统能够处理采购订单、供应商管理和采购入库等流程,确保采购过程的透明和高效。仓库管理方面,实现库存的精准管理,包括入库、出库、盘点等操作,确保库存数据的准确性和实时性。 生产管理模块则涵盖了生产计划制定、物料需求计划、

衡石分析平台使用手册-单机安装及启动

单机安装及启动​ 本文讲述如何在单机环境下进行 HENGSHI SENSE 安装的操作过程。 在安装前请确认网络环境,如果是隔离环境,无法连接互联网时,请先按照 离线环境安装依赖的指导进行依赖包的安装,然后按照本文的指导继续操作。如果网络环境可以连接互联网,请直接按照本文的指导进行安装。 准备工作​ 请参考安装环境文档准备安装环境。 配置用户与安装目录。 在操作前请检查您是否有 sud

线性因子模型 - 独立分量分析(ICA)篇

序言 线性因子模型是数据分析与机器学习中的一类重要模型,它们通过引入潜变量( latent variables \text{latent variables} latent variables)来更好地表征数据。其中,独立分量分析( ICA \text{ICA} ICA)作为线性因子模型的一种,以其独特的视角和广泛的应用领域而备受关注。 ICA \text{ICA} ICA旨在将观察到的复杂信号