Android 城市选择万能控件

Android 城市选择万能控件,选择城市,选择汽车品牌等等,支持按照a-z、# 排序等的选择控件,废话不多说直接上效果图:


(开的Android模拟器录得gif,有点糙,凑合看吧,程序猿不是艺术家!!!)

github Demo下载地址 如果觉得好,欢迎start、fork

具体可实现功能:
本选择模块支持泛型的省份等(按照a-z、# 排序的实体及自定义headview的展示等)
泛型ObjectModle
String sortLetters;//显示数据拼音的首字母
Object object;//显示的实体
像某大型汽车app的汽车品牌,城市定位,学生排名等效果都能实现,只需要稍作修改

接下来讲解一下右边的支持a-z、# 排序及支持自定义的选择控件

package com.selectmodule.select;import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.graphics.drawable.ColorDrawable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.TextView;import com.selectmodule.R;/*** Created by Administrator on 2016/11/14.** @todo A-Z、# 选择控件* 支持设置默认字母显示颜色及选中显示颜色* 支持字体的大小* @auther madreain*/public class SideBar extends View {// 触摸事件private OnTouchingLetterChangedListener onTouchingLetterChangedListener;// 26个字母public static String[] b = {"A", "B", "C", "D", "E", "F", "G", "H", "I","J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V","W", "X", "Y", "Z", "#"};private int choose = -1;// 选中private Paint paint = new Paint();private TextView mTextDialog;//设置选中的颜色private String selectColor;//设置默认的颜色private String defaultColor;//设置字体的大小private int textSize;public void setTextView(TextView mTextDialog) {this.mTextDialog = mTextDialog;}public SideBar(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);}public SideBar(Context context, AttributeSet attrs) {super(context, attrs);}public SideBar(Context context) {super(context);}public void setDefaultColor(String defaultColor) {this.defaultColor = defaultColor;}public void setSelectColor(String selectColor) {this.selectColor = selectColor;}public void setTextSize(int textSize) {this.textSize = textSize;}//设置显示的刷选内容public void setB(String[] b) {this.b = b;}/*** 重写这个方法*/protected void onDraw(Canvas canvas) {super.onDraw(canvas);// 获取焦点改变背景颜色.int height = getHeight();// 获取对应高度int width = getWidth(); // 获取对应宽度int singleHeight = height / b.length;// 获取每一个字母的高度for (int i = 0; i < b.length; i++) {if (defaultColor != null) {paint.setColor(Color.parseColor(defaultColor));} else {paint.setColor(Color.rgb(67, 196, 148));}// paint.setColor(Color.WHITE);paint.setTypeface(Typeface.DEFAULT_BOLD);paint.setAntiAlias(true);if (textSize > 0) {paint.setTextSize(textSize);} else {paint.setTextSize(40);}// 选中的状态if (i == choose) {if (selectColor != null) {paint.setColor(Color.parseColor(selectColor));} else {paint.setColor(Color.parseColor("#ffffffff"));}paint.setFakeBoldText(true);}// x坐标等于中间-字符串宽度的一半.float xPos = width / 2 - paint.measureText(b[i]) / 2;float yPos = singleHeight * i + singleHeight;canvas.drawText(b[i], xPos, yPos, paint);paint.reset();// 重置画笔}}@Overridepublic boolean dispatchTouchEvent(MotionEvent event) {final int action = event.getAction();final float y = event.getY();// 点击y坐标final int oldChoose = choose;final OnTouchingLetterChangedListener listener = onTouchingLetterChangedListener;final int c = (int) (y / getHeight() * b.length);// 点击y坐标所占总高度的比例*b数组的长度就等于点击b中的个数.switch (action) {case MotionEvent.ACTION_UP:setBackgroundDrawable(new ColorDrawable(0x00000000));choose = -1;//invalidate();if (mTextDialog != null) {mTextDialog.setVisibility(View.INVISIBLE);}break;default:setBackgroundResource(R.drawable.sidebar_background);if (oldChoose != c) {if (c >= 0 && c < b.length) {if (listener != null) {listener.onTouchingLetterChanged(b[c]);}if (mTextDialog != null) {mTextDialog.setText(b[c]);mTextDialog.setVisibility(View.VISIBLE);}choose = c;invalidate();}}break;}return true;}/*** 向外公开的方法** @param onTouchingLetterChangedListener*/public void setOnTouchingLetterChangedListener(OnTouchingLetterChangedListener onTouchingLetterChangedListener) {this.onTouchingLetterChangedListener = onTouchingLetterChangedListener;}/*** 接口** @author madreain*/public interface OnTouchingLetterChangedListener {public void onTouchingLetterChanged(String s);}}

为了支持泛型数据,采用了ObjectModle 传入String sortLetters;(显示数据拼音的首字母) 及需要传入的实体Object object;(传入需要显示的实体),通过按照首字母来进行数据的排序及展示

package com.selectmodule.select;/*** Created by Administrator on 2016/11/14.** @auther madreain*/public class ObjectModle {private String sortLetters;  //显示数据拼音的首字母private Object object;//传入需要显示的实体public ObjectModle(String sortLetters, Object object) {this.sortLetters = sortLetters;this.object = object;}public ObjectModle() {}public String getSortLetters() {return sortLetters;}public void setSortLetters(String sortLetters) {this.sortLetters = sortLetters;}public Object getObject() {return object;}public void setObject(Object object) {this.object = object;}
}

数据的传入及排序代码块

   /*** 为ListView填充数据** @param date* @return*/private List<ObjectModle> filledData(MBUserModel[] date) {List<ObjectModle> mSortList = new ArrayList<ObjectModle>();for (int i = 0; i < date.length; i++) {ObjectModle sortModel = new ObjectModle();//汉字转换成拼音String sortString = date[i].getRemarkpinyinstart();sortModel.setObject(date[i]);// TODO: 2016/11/15
//            if (sortString.matches("位")) {//                sortModel.setSortLetters(sortString.toUpperCase());
//            } else  if (sortString.matches("[A-Z]")) {//                sortModel.setSortLetters(sortString.toUpperCase());
//            } else {//                sortModel.setSortLetters("#");
//            }// 正则表达式,判断首字母是否是英文字母if (sortString.matches("[A-Z]")) {sortModel.setSortLetters(sortString.toUpperCase());} else {sortModel.setSortLetters("#");}mSortList.add(sortModel);}return mSortList;}

github Demo下载地址

Android 城市选择万能控件相关推荐

  1. android日期选择区间控件_Android日期时间选择器实现以及自定义大小

    本文主要讲两个内容:1.如何将DatePicker和TimePicker放在一个dialog里面:2.改变他们的宽度: 问题1:其实现思路就是自定义一个Dialog,然后往里面同时放入DatePick ...

  2. Android常用酷炫控件(开源项目)github地址汇总

    转载一个很牛逼的控件收集帖... 第一部分 个性化控件(View) 主要介绍那些不错个性化的 View,包括 ListView.ActionBar.Menu.ViewPager.Gallery.Gri ...

  3. Android开源库集合(控件)

    RecycleView: RecycleView功能增强 https://github.com/Malinskiy/SuperRecyclerView RecycleView功能增强(拖拽,滑动删除, ...

  4. Android Switch和ToggleButton控件

    1. Switch类 Switch类被用来展示状态. android:checked设置是否打开 自定义Switch, android:track设置背景 android:thumb设置选择背景 an ...

  5. 从零开始学android:Android中的基本控件(上)

    从零开始学android:Android中的基本控件(上) 本章内容较多,下面只贴代码,大家只需要贴到自己eclipse里就知道作用^^! View组件简介 Android中的View组件包含了几乎所 ...

  6. android自定义刻度线,Android自定义控件之刻度尺控件

    今天我做的是一个自定义刻度尺控件,由于项目需求需要使用刻度尺那样滑动选择,由于对自定义控件的认识还不够深入,于是花了一周多时间才把这个控件给整出来,也是呕心沥血的经历啊,也让我对自定义控件有了自己的认 ...

  7. 视频教程-Android Material Design 新控件-Android

    Android Material Design 新控件 刘志远,北京邮电大学硕士研究生, 北京育华志远科技有限公司创始人, 育华志远教育品牌负责人,育华志远课程体系打造者. 率领团队为互联网行业培训千 ...

  8. Android 滑动拼图验证码控件

    Android 滑动拼图验证码控件 简介: 很多软件为了安全防止恶意攻击,会在登录/注册时进行人机验证,常见的人机验证方式有:谷歌点击复选框进行验证,输入验证码验证,短信验证码,语音验证,文字按顺序选 ...

  9. android studio自定义边框,Android Studio给各种控件加边框的操作方法

    Android Studio给Textview,EditText控件加边框 如图所示,给一些edittext,TextView,还有一些控件组,进度条加上一个粉红色的边框. 看着很好看,其实非常简单, ...

最新文章

  1. 计算机内部使用什么方法技术,计算机内部使用什么技术
  2. Linux 修改 IP地址 和 网关
  3. 【学术相关】中国计算机学会推荐中文科技期刊目录
  4. 实验四 图的实现与应用
  5. .net 识别一维码_天若OCR文字识别 v5.0 原创好用的OCR及翻译小工具
  6. Linux中常用命令(文件与目录)
  7. java 拷贝大文件_java高效实现大文件拷贝功能
  8. python全套完整教程-Python全套教程
  9. Atitit.  Js 冒泡事件阻止 事件捕获   事件传递  事件代理
  10. 已知空间中ABC3点坐标与到D点的距离,求D点坐标
  11. win98老机子安装linux,在win98下怎么安装linux?
  12. 软件测试职业比赛,我院首届软件测试职业技能大赛圆满落幕
  13. matlab qpsk实验,MATLAB-QPSK调制与解调
  14. mysql mcafee audit_ libaudit
  15. C++11(及现代C++风格)和快速迭代式开发 -- 刘未鹏
  16. python入门知识点学习笔记(二)
  17. Android中绘制圆角矩形图片及任意形状图片
  18. 关于(广义)代数特征值问题的一点注记
  19. python 生成16位integer
  20. linux配置和查看主机名

热门文章

  1. Python机器学习框架介绍
  2. 【maven】help插件
  3. Eclipse Web项目运行显示正在摧毁协议处理器
  4. 【转】下载量最高的 100 个 Laravel 扩展包推荐
  5. ARM64 内存64位宽与32位位宽 速度对比
  6. 最近线上发生的几个坑
  7. 用 Python 做动态二维码哄女友开心
  8. Google Earth Engine(GEE)——缨帽变换
  9. 基于IC卡技术的城市信息平台的建设
  10. MS2109 HDMI转USB 高清视频传输方案