一丶效果图

二丶需求功能点技术点

1.业务想要的大致模样

呈现地图及省份,高热点地域颜色越红,前五以不同色值标注

2.程序员表示

移动端没有控件及框架,开发的话需要大量时间。前段有相关框架,不如前段做吧...

3.项目经理表示

手机屏幕就那么大,不适合展示整张中国地图,展示的话文字小,体验感也不高,设计师切个半屏图,程序员加点动画展现数据...

最终讨论效果如图

4.技术点

1.根据设计师给的背景图,测量文字显示位置

2.平移呈现动画 ObjectAnimator平移动画即可

三丶看代码

1.造数据

实体类MapViewEntity.Java

public classMapViewEntity implementsSerializable {

publicString overviewName;//区块名称publicString overviewSubName;//区块子名称publicList areaList;//区域列表数据public static classArea implementsSerializable {

public intranking;//排名publicString areaName;//区域名称public intareaCount;//数量}

} 写成public,可省去get set方法

public voidgetData(){

areaList= newArrayList<>();MapViewEntity.Area area1= newMapViewEntity.Area();area1.areaName= "武汉";area1.areaCount= 5;area1.ranking= 1;MapViewEntity.Area area2= newMapViewEntity.Area();area2.areaName= "深圳";area2.areaCount= 4;area2.ranking= 2;MapViewEntity.Area area3= newMapViewEntity.Area();area3.areaName= "北京";area3.areaCount= 3;area3.ranking= 3;MapViewEntity.Area area4= newMapViewEntity.Area();area4.areaName= "上海";area4.areaCount= 2;area4.ranking= 4;MapViewEntity.Area area5= newMapViewEntity.Area();area5.areaName= "惠州";area5.areaCount= 1;area5.ranking= 5;areaList.add(area1);areaList.add(area2);areaList.add(area3);areaList.add(area4);areaList.add(area5);} 这里只造用到的数据

2.MyViewActivity

@Overrideprotected voidonCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);setContentView(R.layout.map_view_activity);MapView mapView = (MapView) findViewById(R.id.mapview);getData();mapView.init(areaList);} xml布局里面就一个TextView和自定义MapView(略)

MapView.Java

public classMapView extendsLinearLayout {

privateDecimalFormat format=newDecimalFormat("###,###,###");publicMapView(Context context) {

super(context);setOrientation(HORIZONTAL);}

publicMapView(Context context,@NullableAttributeSet attrs) {

super(context,attrs);setOrientation(HORIZONTAL);}

publicMapView(Context context,@NullableAttributeSet attrs, intdefStyleAttr) {

super(context,attrs,defStyleAttr);setOrientation(HORIZONTAL);}

intbgHeight= 0,bgWidth= 0;public voidinit(List datas) {

removeAllViews();if(datas == null) {

return;}

//左侧背景图ImageView imageView = newImageView(getContext());Bitmap bg = BitmapFactory.decodeResource(getResources(),R.mipmap.map_bg);if(bg != null) {

imageView.setImageBitmap(bg);bgHeight= bg.getHeight();bgWidth= bg.getWidth();}

addView(imageView);finalLinearLayout itemContainer = newLinearLayout(getContext());itemContainer.setOrientation(VERTICAL);for(inti = 0;i < datas.size();i++) {

View item = LayoutInflater.from(getContext()).inflate(R.layout.map_view_item,itemContainer, false);TextView indexView = (TextView) item.findViewById(R.id.index);TextView textView = (TextView) item.findViewById(R.id.text);GradientDrawable indexDrawable = (GradientDrawable) indexView.getBackground();intcolor = Color.parseColor("#FA7401");switch(i) {

case0:

color = Color.parseColor("#FA7401");break;case1:

color = Color.parseColor("#D2007F");break;case2:

color = Color.parseColor("#006FBF");break;case3:

color = Color.parseColor("#009C85");break;case4:

color = Color.parseColor("#8FC41E");break;}

indexDrawable.setColor(color);indexView.setBackground(indexDrawable);MapViewEntity.Area area=datas.get(i);indexView.setText(area.ranking+ "");textView.setTextColor(color);textView.setText(area.areaName+" "+format.format(area.areaCount));itemContainer.addView(item);}

LayoutParams lp = newLayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT);lp.leftMargin= -bgWidth;addView(itemContainer,lp);//修正位置(瞎计算)getViewTreeObserver().addOnPreDrawListener(newViewTreeObserver.OnPreDrawListener() {

@Overridepublic booleanonPreDraw() {

floatdegree0 = (float) Math.sin(Math.PI* 30.0/ 180.0);floatdegree1 = (float) Math.sin(Math.PI* 60.0/ 180.0);floatdegree2 = (float) Math.sin(Math.PI* 90.0/ 180.0);intshift = (int) (getResources().getDisplayMetrics().density* 7);for(inti = 0;i < itemContainer.getChildCount();i++) {

finalView item = itemContainer.getChildAt(i);LayoutParams lp = (LayoutParams) item.getLayoutParams();switch(i) {

case0:

lp.leftMargin= (int) (bgWidth* degree0) + shift * 4;lp.topMargin= (int) (bgHeight* degree0) / 22;break;case1:

lp.leftMargin= (int) (bgWidth* degree1) + shift * 2;lp.topMargin= (int) (bgHeight* degree1) / 16;break;case2:

lp.leftMargin= (int) (bgWidth* degree2) + shift;lp.topMargin= (int) (bgHeight* degree2) / 8;break;case3:

lp.leftMargin= (int) (bgWidth* degree1) + shift * 2;lp.topMargin= (int) (bgHeight* degree2) / 8;break;case4:

lp.leftMargin= (int) (bgWidth* degree0) + shift * 4;lp.topMargin= (int) (bgHeight* degree1) / 16;break;}

item.setLayoutParams(lp);item.setVisibility(View.GONE);item.postDelayed(newRunnable() {

@Overridepublic voidrun() {

ObjectAnimator anim = ObjectAnimator.ofFloat(item,"translationX",-bgWidth,0);anim.setDuration(1000);anim.addListener(newAnimatorListenerAdapter() {

@Overridepublic voidonAnimationStart(Animator animation) {

super.onAnimationStart(animation);item.setVisibility(View.VISIBLE);}

});anim.start();}

},(i + 1) * 300);}

getViewTreeObserver().removeOnPreDrawListener(this);return false;}

});}

} 直接看init()方法,传入要展示的值

1.首先添加背景图,并获取宽高

2.添加LinearLayout设置垂直布局

3.将文字显示需要动画的部分,添加到LinearLayout

map_view_item

<?xml version="1.0"encoding="utf-8"?> 图解:

for循环

根据个数动态添加移动布局,遍历添加对应数值

switch (i)添加不同颜色

最后测量item的显示位置,瞎测量

为什么说瞎测量呢?

背景图的高度,近似等于直径长度,所以top值是可以通过控制被除数调整的

背景图的宽度等于半径+X(当然x你可以通过工具测量),所得有一个参数+-来调整

各tiem的值同样通过switch (i)分配

动画平移,参考前面文章,不再赘述

四丶跪求关注下载源码,200粉小目标

欢迎关注我的博客及微信公众号

源码下载记得顺便Star哦~

下载链接:https://github.com/JinBoy23520/CoderToDeveloperByTCLer

android 自定义热点区,Android 自定义View之中国地图热点区域分布相关推荐

  1. Android 自定义View之中国地图热点区域分布

    本文出自:http://blog.csdn.net/dt235201314/article/details/78133932 一丶效果图 二丶需求功能点技术点 1.业务想要的大致模样 呈现地图及省份, ...

  2. jquery中国地图热点提示信息,可作链接特效

    这是一个做jquery做的中国地址,鼠标放在每个地市上面都有一个不同的提示信息,也可以在城市上面做不同的链接 非常实用的jquery特效-网页特效代码,我们在平时有些网站中看到全国分站的网站,都用这么 ...

  3. android覆盖扩散动画,[Android]多层波纹扩散动画——自定义View绘制

    之前整理过一些属性动画的基本操作,这一段时间的动画相关需求都安然度过了.直到这次-- 一.另一种动画需求 多数交互中的动画都是让单个页面元素动起来,这种就很适合用属性动画实现.但是对于 多个元素.非页 ...

  4. android小球移动代码,Android自定义圆形View实现小球跟随手指移动效果

    本文实例为大家分享了Android实现小球跟随手指移动效果的具体代码,供大家参考,具体内容如下 一. 需求功能 手指在屏幕上滑动,红色的小球始终跟随手指移动. 实现的思路: 1)自定义View,在on ...

  5. android 画布实现签名,Android 自定义View手写签名并保存图片

    1.自定义View--支撑设置画笔色彩,画笔宽度,画板色彩,铲除画板,查看是否有签名,保存画板图片(仿制粘贴可直接使用) /***CreatedbyYyyyQon2020/3/5. *电子签名*/pu ...

  6. android canvas绘制圆角_Android自定义View撸一个渐变的温度指示器(TmepView)

    秦子帅明确目标,每天进步一点点..... 作者 |  andy 地址 |  blog.csdn.net/Andy_l1/article/details/82910061 1.概述 自定义View对需要 ...

  7. 我的Android进阶之旅------Android自定义View来实现解析lrc歌词并同步滚动、上下拖动、缩放歌词的功能...

    前言 一LRC歌词文件简介 1什么是LRC歌词文件 2LRC歌词文件的格式 LRC歌词文件的标签类型 1标识标签 2时间标签 二解析LRC歌词 1读取出歌词文件 2解析得到的歌词内容 1表示每行歌词内 ...

  8. Android WiFi热点完全研究(自定义创建、跳转系统界面设置、读取配置、切换,Android6.0适配)...

    前言: WiFi热点设置页面的安全性选项在Android 4.x上有"无"."WPA PSK"."WPA2 PSK"三个选项,在Androi ...

  9. Android中实现Bitmap在自定义View中的放大与拖动

    一基本实现思路: 基于View类实现自定义View –MyImageView类.在使用View的Activity类中完成OnTouchListener接口,实现对MotionEvent事件的监听与处理 ...

最新文章

  1. python文本编码转换_Python: 转换文本编码
  2. 熔断的意义和适用场景,你真的清楚吗?
  3. 颜水成发了个「简单到令人尴尬」的视觉模型,证明Transformer威力源自其整体架构...
  4. 总结JavaScript(Iframe、window.open、window.showModalDialog)父窗口与子窗口之间的操作
  5. P3085 [USACO13OPEN]Yin and Yang G 点分治
  6. jsr303 自定义消息_JSR 303从I18N属性文件加载消息
  7. C#制作、打包、签名、发布Activex全过程
  8. leetcode131. 分割回文串(回溯)
  9. python实战项目前后端分离flask_Flask Vue 构建前后端分离的应用
  10. Javascript中的事件冒泡
  11. 一个未知高度垂直居中的简单方法
  12. Python深入理解yield
  13. 智汇华云 | 异步?NO! 同步?NO! 华云数据新专利解决云平台容灾难题
  14. html背景框颜色,DIV+CSS颜色边框背景等样式 - roucheng
  15. 克拉默法则(Cramer's Rule)的证明
  16. 用matlab解线性规划题目,用MATLAB软件解线性规划范例
  17. 安装软件出现错误处理:internal error2503/2502
  18. js处理时间戳为各种格式/js判断公历/农历/周历节日和节气
  19. net面试整试题及参考答案【转】
  20. 2014新浪校招笔试题:取水果

热门文章

  1. Android实现身份证识别
  2. 天翼云服务器迁移阿里云_云迁移策略:如何建立专家团队
  3. BT下载的原理 和疑问
  4. 容器和云原生(一):初识容器化和云原生
  5. 如何解决下载链接在微信中无法打开的问题的?
  6. 《那些年啊,那些事——一个程序员的奋斗史》——43
  7. VM16虚拟机去虚拟化心得2
  8. android_day01
  9. 从单机到2000万 QPS 并发的 Redis 高性能缓存实践之路
  10. CAJViewer显示乱码的解决方法