android 自定义热点区,Android 自定义View之中国地图热点区域分布
一丶效果图
二丶需求功能点技术点
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之中国地图热点区域分布相关推荐
- Android 自定义View之中国地图热点区域分布
本文出自:http://blog.csdn.net/dt235201314/article/details/78133932 一丶效果图 二丶需求功能点技术点 1.业务想要的大致模样 呈现地图及省份, ...
- jquery中国地图热点提示信息,可作链接特效
这是一个做jquery做的中国地址,鼠标放在每个地市上面都有一个不同的提示信息,也可以在城市上面做不同的链接 非常实用的jquery特效-网页特效代码,我们在平时有些网站中看到全国分站的网站,都用这么 ...
- android覆盖扩散动画,[Android]多层波纹扩散动画——自定义View绘制
之前整理过一些属性动画的基本操作,这一段时间的动画相关需求都安然度过了.直到这次-- 一.另一种动画需求 多数交互中的动画都是让单个页面元素动起来,这种就很适合用属性动画实现.但是对于 多个元素.非页 ...
- android小球移动代码,Android自定义圆形View实现小球跟随手指移动效果
本文实例为大家分享了Android实现小球跟随手指移动效果的具体代码,供大家参考,具体内容如下 一. 需求功能 手指在屏幕上滑动,红色的小球始终跟随手指移动. 实现的思路: 1)自定义View,在on ...
- android 画布实现签名,Android 自定义View手写签名并保存图片
1.自定义View--支撑设置画笔色彩,画笔宽度,画板色彩,铲除画板,查看是否有签名,保存画板图片(仿制粘贴可直接使用) /***CreatedbyYyyyQon2020/3/5. *电子签名*/pu ...
- android canvas绘制圆角_Android自定义View撸一个渐变的温度指示器(TmepView)
秦子帅明确目标,每天进步一点点..... 作者 | andy 地址 | blog.csdn.net/Andy_l1/article/details/82910061 1.概述 自定义View对需要 ...
- 我的Android进阶之旅------Android自定义View来实现解析lrc歌词并同步滚动、上下拖动、缩放歌词的功能...
前言 一LRC歌词文件简介 1什么是LRC歌词文件 2LRC歌词文件的格式 LRC歌词文件的标签类型 1标识标签 2时间标签 二解析LRC歌词 1读取出歌词文件 2解析得到的歌词内容 1表示每行歌词内 ...
- Android WiFi热点完全研究(自定义创建、跳转系统界面设置、读取配置、切换,Android6.0适配)...
前言: WiFi热点设置页面的安全性选项在Android 4.x上有"无"."WPA PSK"."WPA2 PSK"三个选项,在Androi ...
- Android中实现Bitmap在自定义View中的放大与拖动
一基本实现思路: 基于View类实现自定义View –MyImageView类.在使用View的Activity类中完成OnTouchListener接口,实现对MotionEvent事件的监听与处理 ...
最新文章
- python文本编码转换_Python: 转换文本编码
- 熔断的意义和适用场景,你真的清楚吗?
- 颜水成发了个「简单到令人尴尬」的视觉模型,证明Transformer威力源自其整体架构...
- 总结JavaScript(Iframe、window.open、window.showModalDialog)父窗口与子窗口之间的操作
- P3085 [USACO13OPEN]Yin and Yang G 点分治
- jsr303 自定义消息_JSR 303从I18N属性文件加载消息
- C#制作、打包、签名、发布Activex全过程
- leetcode131. 分割回文串(回溯)
- python实战项目前后端分离flask_Flask Vue 构建前后端分离的应用
- Javascript中的事件冒泡
- 一个未知高度垂直居中的简单方法
- Python深入理解yield
- 智汇华云 | 异步?NO! 同步?NO! 华云数据新专利解决云平台容灾难题
- html背景框颜色,DIV+CSS颜色边框背景等样式 - roucheng
- 克拉默法则(Cramer's Rule)的证明
- 用matlab解线性规划题目,用MATLAB软件解线性规划范例
- 安装软件出现错误处理:internal error2503/2502
- js处理时间戳为各种格式/js判断公历/农历/周历节日和节气
- net面试整试题及参考答案【转】
- 2014新浪校招笔试题:取水果