在使用第三方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相关推荐

  1. 【ROS-Navigation】Costmap2d代价地图源码分析——ObstacleLayer障碍物层

    在学习ROS-Navigation源码过程中,记录自己的理解,本文为分层代价地图中障碍物层源码的学习笔记,针对obstacle_layer.h和obstacle_layer.cpp源码文件,分析障碍物 ...

  2. linux显示启动logo源码分析以及修改显示logo

    1.linux显示启动logo整个流程分析 (1)logo图片在内核源码中是以ppm格式的文件保存,在编译内核时会把ppm格式的文件自动转换成.c文件,在c文件中会构造一个struct linux_l ...

  3. 「源码分析」CopyOnWriteArrayList 中的隐藏知识,你Get了吗?

    前言 本觉 CopyOnWriteArrayList 过于简单,寻思看名字就能知道内部的实现逻辑,所以没有写这篇文章的想法,最近又仔细看了下 CopyOnWriteArrayList 的源码实现,大体 ...

  4. 集合的get方法中参数从多少开始_源码分析CopyOnWriteArrayList 中的隐藏知识,你Get了吗?...

    欢迎点击 "未读代码" ,关注公众号,文章每周更新 杭州-阿里园区墙 前言 本觉 CopyOnWriteArrayList 过于简单,寻思看名字就能知道内部的实现逻辑,所以没有写这 ...

  5. java地图源码_Java集合源码分析(四)HashMap

    一.HashMap简介 1.1.HashMap概述 HashMap是基于哈希表的Map接口实现的,它存储的是内容是键值对映射.此类不保证映射的顺序,假定哈希函数将元素适当的分布在各桶之间,可为基本操作 ...

  6. android源码分析

    01_Android系统概述 02_Android系统的开发综述 03_Android的Linux内核与驱动程序 04_Android的底层库和程序 05_Android的JAVA虚拟机和JAVA环境 ...

  7. Dialog源码分析

    目录介绍 1.简单用法 2.AlertDialog源码分析 2.1 AlertDialog.Builder的构造方法 2.2 通过AlertDialog.Builder对象设置属性 2.3 build ...

  8. Android 别踩白块 源码分析

    文章目录 一.项目下载 二.项目分析 三.源码分析 1.实体层(Entity) (1).Block类 [1].属性 [2].方法 (2).SuccGroup类 [1].属性 [2].方法 (3).Fa ...

  9. 【梦幻连连连】源码分析(二)

    转载请注明出处:http://blog.csdn.net/oyangyufu/article/details/24736711 源码下载:http://download.csdn.net/detail ...

  10. 基于‘纯洁的微笑’开源项目 — Favorites 源码分析

    引言: 对于某语言不算熟悉的话自创项目是很痛苦的过程,即便笔者是一位掌握java的Android码农,对于java入门也是深感无力,毕竟语言是基础,但框架设计模式却与Android有出入,且学习成本较 ...

最新文章

  1. 【django轻量级框架】Django项目导入css,js,images等静态文件
  2. [转] Java @interface 自定义注解
  3. linux-搜索查找类
  4. ai人工智能收入_人工智能促进收入增长:使用ML推动更有价值的定价
  5. excel 电阻并联计算_电路分析基础(5)-关于电阻,有些话我还是要说一说
  6. [原创]K8 cping 3.0大型内网渗透扫描工具
  7. matlab knn实现,Matlab之KNN实现
  8. 用蒙特卡洛求pi_蒙特卡洛算法(MCS)及其MATLAB实现
  9. 得物回应中消协点名批评:感谢监督 涉及案例已处理完结
  10. mongodb和mysql中自动增长id_MongoDB 自动增长
  11. 全面屏手机有什么缺点?
  12. Ubuntu源码安装Nginx
  13. istio-opentracing链路追踪方案
  14. 地方税务局行政效能管理(行政审批)整体解决方案
  15. 解决ORA-27103:internal error错误一例
  16. 下载并安装mercurial/hg
  17. FCIV 一个MD5校验工具
  18. ZBrush、Maya和3dmax的区别?
  19. VirtualBox Linux 安装增强工具
  20. arcgis的重采样和插值方法

热门文章

  1. Argumentative structure for English essay
  2. arm c语言的交叉编译环境ads代码,交叉编译环境的概念以及建立步骤
  3. PYTHON股票定向爬虫(2020年后针对廖雪峰老师的爬虫教程练习)
  4. Java篇—字符串加解密
  5. Pointer is missing a nullability type specifier (_Nonnull, _Nullable, or _Null_unspecified
  6. 【干货分享】流程DEMO-加班与调休
  7. 任天行互联网安全审计系统详细功能及关键技术介绍
  8. SpringBoot之jar瘦身打包部署
  9. 如何删除要分享的照片中的位置数据
  10. Android中获取手机SIM卡的各种信息