目录
gson框架
implementation 'com.google.code.gson:gson:2.8.6'
效果图
定义按钮
<Button
android:id="@+id/button"
android:layout_width="120dp"
android:layout_height="60dp"
android:text="选择地区"/>
逻辑文件
Button button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AlertDialog.Builder builder=new AlertDialog.Builder(Info.this);
View view = LayoutInflater.from(Info.this).inflate(R.layout.addressdialog, null);
builder.setView(view);
LinearLayout addressdialog_linearlayout = (LinearLayout)view.findViewById(R.id.addressdialog_linearlayout);
final ScrollerNumberPicker provincePicker = (ScrollerNumberPicker)view.findViewById(R.id.province);
final ScrollerNumberPicker cityPicker = (ScrollerNumberPicker)view.findViewById(R.id.city);
final ScrollerNumberPicker counyPicker = (ScrollerNumberPicker)view.findViewById(R.id.couny);
final AlertDialog dialog = builder.show();
addressdialog_linearlayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
button.setText(provincePicker.getSelectedText()+cityPicker.getSelectedText()+counyPicker.getSelectedText());
save.setVisibility(View.VISIBLE);
Log.i("kkkk",provincePicker.getSelectedText()+cityPicker.getSelectedText()+counyPicker.getSelectedText());
dialog.dismiss();
}
});
}
});
自定义的dialog样式
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!--顶部导航-->
<LinearLayout
android:id="@+id/myaddress_linerlayout"
android:layout_width="match_parent"
android:layout_height="45dp"
android:orientation="horizontal"
android:gravity="center"
android:background="#1290DC">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="vertical"
android:gravity="left|center">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="3dp"
android:layout_marginBottom="5dp"
android:layout_marginLeft="15dp"
android:text="选择地区"
android:textColor="#fff"
android:textSize="17dp"/>
</LinearLayout>
<LinearLayout
android:id="@+id/addressdialog_linearlayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="vertical"
android:gravity="center|right">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="3dp"
android:layout_marginBottom="5dp"
android:layout_marginRight="15dp"
android:text="确定"
android:textColor="#fff"
android:textSize="17dp"/>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_below="@+id/myaddress_linerlayout"
android:layout_width="match_parent"
android:layout_height="180dp"
android:orientation="horizontal"
android:gravity="center"
android:background="#ffff">
<com.czhoujunlv.drug.city.CityPicker
android:id="@+id/citypicker"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:orientation="vertical"/>
</LinearLayout>
</RelativeLayout>
自定义view类CityPicker
/**
* 城市Picker
*
* @author
*
*/
public class CityPicker extends LinearLayout {
/** 滑动控件 */
private ScrollerNumberPicker provincePicker;
private ScrollerNumberPicker cityPicker;
private ScrollerNumberPicker counyPicker;
/** 选择监听 */
private OnSelectingListener onSelectingListener;
/** 刷新界面 */
private static final int REFRESH_VIEW = 0x001;
/** 临时日期 */
private int tempProvinceIndex = -1;
private int temCityIndex = -1;
private int tempCounyIndex = -1;
private Context context;
private List<Cityinfo> province_list = new ArrayList<Cityinfo>();
private HashMap<String, List<Cityinfo>> city_map = new HashMap<String, List<Cityinfo>>();
private HashMap<String, List<Cityinfo>> couny_map = new HashMap<String, List<Cityinfo>>();
private CitycodeUtil citycodeUtil;
private String city_code_string;
private String city_string;
public CityPicker(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
getaddressinfo();
// TODO Auto-generated constructor stub
}
public CityPicker(Context context) {
super(context);
this.context = context;
getaddressinfo();
// TODO Auto-generated constructor stub
}
// 获取城市信息
private void getaddressinfo() {
// TODO Auto-generated method stub
// 读取城市信息string
JSONParser parser = new JSONParser();
String area_str = FileUtil.readAssets(context, "area.json");
province_list = parser.getJSONParserResult(area_str, "area0");
city_map = parser.getJSONParserResultArray(area_str, "area1");
couny_map = parser.getJSONParserResultArray(area_str, "area2");
}
public static class JSONParser {
public ArrayList<String> province_list_code = new ArrayList<String>();
public ArrayList<String> city_list_code = new ArrayList<String>();
public List<Cityinfo> getJSONParserResult(String JSONString, String key) {
List<Cityinfo> list = new ArrayList<Cityinfo>();
JsonObject result = new JsonParser().parse(JSONString)
.getAsJsonObject().getAsJsonObject(key);
Iterator<?> iterator = result.entrySet().iterator();
while (iterator.hasNext()) {
@SuppressWarnings("unchecked")
Entry<String, JsonElement> entry = (Entry<String, JsonElement>) iterator
.next();
Cityinfo cityinfo = new Cityinfo();
cityinfo.setCity_name(entry.getValue().getAsString());
cityinfo.setId(entry.getKey());
province_list_code.add(entry.getKey());
list.add(cityinfo);
}
System.out.println(province_list_code.size());
return list;
}
public HashMap<String, List<Cityinfo>> getJSONParserResultArray(
String JSONString, String key) {
HashMap<String, List<Cityinfo>> hashMap = new HashMap<String, List<Cityinfo>>();
JsonObject result = new JsonParser().parse(JSONString)
.getAsJsonObject().getAsJsonObject(key);
Iterator<?> iterator = result.entrySet().iterator();
while (iterator.hasNext()) {
@SuppressWarnings("unchecked")
Entry<String, JsonElement> entry = (Entry<String, JsonElement>) iterator
.next();
List<Cityinfo> list = new ArrayList<Cityinfo>();
JsonArray array = entry.getValue().getAsJsonArray();
for (int i = 0; i < array.size(); i++) {
Cityinfo cityinfo = new Cityinfo();
cityinfo.setCity_name(array.get(i).getAsJsonArray().get(0)
.getAsString());
cityinfo.setId(array.get(i).getAsJsonArray().get(1)
.getAsString());
city_list_code.add(array.get(i).getAsJsonArray().get(1)
.getAsString());
list.add(cityinfo);
}
hashMap.put(entry.getKey(), list);
}
return hashMap;
}
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
LayoutInflater.from(getContext()).inflate(R.layout.city_picker, this);
citycodeUtil = CitycodeUtil.getSingleton();
// 获取控件引用
provincePicker = (ScrollerNumberPicker) findViewById(R.id.province);
cityPicker = (ScrollerNumberPicker) findViewById(R.id.city);
counyPicker = (ScrollerNumberPicker) findViewById(R.id.couny);
provincePicker.setData(citycodeUtil.getProvince(province_list));
provincePicker.setDefault(1);
cityPicker.setData(citycodeUtil.getCity(city_map, citycodeUtil
.getProvince_list_code().get(1)));
cityPicker.setDefault(1);
counyPicker.setData(citycodeUtil.getCouny(couny_map, citycodeUtil
.getCity_list_code().get(1)));
counyPicker.setDefault(1);
provincePicker.setOnSelectListener(new ScrollerNumberPicker.OnSelectListener() {
@Override
public void endSelect(int id, String text) {
// TODO Auto-generated method stub
Log.i("kkkk" ,id + "text----->" + text);
if (text.equals("") || text == null)
return;
if (tempProvinceIndex != id) {
System.out.println("endselect");
String selectDay = cityPicker.getSelectedText();
if (selectDay == null || selectDay.equals(""))
return;
String selectMonth = counyPicker.getSelectedText();
if (selectMonth == null || selectMonth.equals(""))
return;
// 城市数组
cityPicker.setData(citycodeUtil.getCity(city_map,
citycodeUtil.getProvince_list_code().get(id)));
cityPicker.setDefault(1);
counyPicker.setData(citycodeUtil.getCouny(couny_map,
citycodeUtil.getCity_list_code().get(1)));
counyPicker.setDefault(1);
int lastDay = Integer.valueOf(provincePicker.getListSize());
if (id > lastDay) {
provincePicker.setDefault(lastDay - 1);
}
}
tempProvinceIndex = id;
Message message = new Message();
message.what = REFRESH_VIEW;
handler.sendMessage(message);
}
@Override
public void selecting(int id, String text) {
// TODO Auto-generated method stub
}
});
cityPicker.setOnSelectListener(new ScrollerNumberPicker.OnSelectListener() {
@Override
public void endSelect(int id, String text) {
// TODO Auto-generated method stub
if (text.equals("") || text == null)
return;
if (temCityIndex != id) {
String selectDay = provincePicker.getSelectedText();
if (selectDay == null || selectDay.equals(""))
return;
String selectMonth = counyPicker.getSelectedText();
if (selectMonth == null || selectMonth.equals(""))
return;
counyPicker.setData(citycodeUtil.getCouny(couny_map,
citycodeUtil.getCity_list_code().get(id)));
counyPicker.setDefault(1);
int lastDay = Integer.valueOf(cityPicker.getListSize());
if (id > lastDay) {
cityPicker.setDefault(lastDay - 1);
}
}
temCityIndex = id;
Message message = new Message();
message.what = REFRESH_VIEW;
handler.sendMessage(message);
}
@Override
public void selecting(int id, String text) {
// TODO Auto-generated method stub
}
});
counyPicker.setOnSelectListener(new ScrollerNumberPicker.OnSelectListener() {
@Override
public void endSelect(int id, String text) {
// TODO Auto-generated method stub
if (text.equals("") || text == null)
return;
if (tempCounyIndex != id) {
String selectDay = provincePicker.getSelectedText();
if (selectDay == null || selectDay.equals(""))
return;
String selectMonth = cityPicker.getSelectedText();
if (selectMonth == null || selectMonth.equals(""))
return;
// 城市数组
city_code_string = citycodeUtil.getCouny_list_code()
.get(id);
int lastDay = Integer.valueOf(counyPicker.getListSize());
if (id > lastDay) {
counyPicker.setDefault(lastDay - 1);
}
}
tempCounyIndex = id;
Message message = new Message();
message.what = REFRESH_VIEW;
handler.sendMessage(message);
}
@Override
public void selecting(int id, String text) {
// TODO Auto-generated method stub
}
});
}
@SuppressLint("HandlerLeak")
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
switch (msg.what) {
case REFRESH_VIEW:
if (onSelectingListener != null)
onSelectingListener.selected(true);
break;
default:
break;
}
}
};
public void setOnSelectingListener(OnSelectingListener onSelectingListener) {
this.onSelectingListener = onSelectingListener;
}
public String getCity_code_string() {
return city_code_string;
}
public String getCity_string() {
city_string = provincePicker.getSelectedText()
+ cityPicker.getSelectedText() + counyPicker.getSelectedText();
return city_string;
}
public interface OnSelectingListener {
public void selected(boolean selected);
}
}
数据来源(area.json)
文件下载以及放置位置
自定义view(ScrollerNumberPicker类)
/**
*
* 滑动选择
*
* @author
*
*/
public class ScrollerNumberPicker extends View {
/** 控件宽度 */
private float controlWidth;
/** 控件高度 */
private float controlHeight;
/** 是否滑动中 */
private boolean isScrolling = false;
/** 选择的内容 */
private ArrayList<ItemObject> itemList = new ArrayList<ItemObject>();
/** 设置数据 */
private ArrayList<String> dataList = new ArrayList<String>();
/** 按下的坐标 */
private int downY;
/** 按下的时间 */
private long downTime = 0;
/** 短促移动 */
private long goonTime = 200;
/** 短促移动距离 */
private int goonDistence = 100;
/** 画线画笔 */
private Paint linePaint;
/** 线的默认颜色 */
private int lineColor = 0xff000000;
/** 默认字体 */
private float normalFont = 14.0f;
/** 选中的时候字体 */
private float selectedFont = 22.0f;
/** 单元格高度 */
private int unitHeight = 50;
/** 显示多少个内容 */
private int itemNumber = 7;
/** 默认字体颜色 */
private int normalColor = 0xff000000;
/** 选中时候的字体颜色 */
private int selectedColor = 0xffff0000;
/** 蒙板高度 */
private float maskHight = 48.0f;
/** 选择监听 */
private OnSelectListener onSelectListener;
/** 是否可用 */
private boolean isEnable = true;
/** 刷新界面 */
private static final int REFRESH_VIEW = 0x001;
/** 移动距离 */
private static final int MOVE_NUMBER = 5;
/** 是否允许选空 */
private boolean noEmpty = false;
/** 正在修改数据,避免ConcurrentModificationException异常 */
private boolean isClearing = false;
public ScrollerNumberPicker(Context context, AttributeSet attrs,
int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
init(context, attrs);
initData();
}
public ScrollerNumberPicker(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
init(context, attrs);
initData();
}
public ScrollerNumberPicker(Context context) {
super(context);
// TODO Auto-generated constructor stub
initData();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
if (!isEnable)
return true;
int y = (int) event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
isScrolling = true;
downY = (int) event.getY();
downTime = System.currentTimeMillis();
break;
case MotionEvent.ACTION_MOVE:
actionMove(y - downY);
onSelectListener();
break;
case MotionEvent.ACTION_UP:
// 移动距离的绝对值
int move = (y - downY);
move = move > 0 ? move : move * (-1);
// 判断段时间移动的距离
if (System.currentTimeMillis() - downTime < goonTime
&& move > goonDistence) {
goonMove(y - downY);
} else {
actionUp(y - downY);
}
noEmpty();
isScrolling = false;
break;
default:
break;
}
return true;
}
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
drawLine(canvas);
drawList(canvas);
drawMask(canvas);
}
private synchronized void drawList(Canvas canvas) {
if (isClearing)
return;
try {
for (ItemObject itemObject : itemList) {
itemObject.drawSelf(canvas);
}
} catch (Exception e) {
// TODO: handle exception
}
}
@Override
protected void onLayout(boolean changed, int left, int top, int right,
int bottom) {
// TODO Auto-generated method stub
super.onLayout(changed, left, top, right, bottom);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// TODO Auto-generated method stub
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
controlWidth = getWidth();
if (controlWidth != 0) {
setMeasuredDimension(getWidth(), itemNumber * unitHeight);
controlWidth = getWidth();
}
}
/**
* 继续移动一定距离
*/
private synchronized void goonMove(final int move) {
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
int distence = 0;
while (distence < unitHeight * MOVE_NUMBER) {
try {
Thread.sleep(5);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
actionThreadMove(move > 0 ? distence : distence * (-1));
distence += 10;
}
actionUp(move > 0 ? distence - 10 : distence * (-1) + 10);
noEmpty();
}
}).start();
}
/**
* 不能为空,必须有选项
*/
private void noEmpty() {
if (!noEmpty)
return;
for (ItemObject item : itemList) {
if (item.isSelected())
return;
}
int move = (int) itemList.get(0).moveToSelected();
if (move < 0) {
defaultMove(move);
} else {
defaultMove((int) itemList.get(itemList.size() - 1)
.moveToSelected());
}
for (ItemObject item : itemList) {
if (item.isSelected()) {
if (onSelectListener != null)
onSelectListener.endSelect(item.id, item.itemText);
break;
}
}
}
/**
* 初始化数据
*/
private void initData() {
isClearing = true;
itemList.clear();
for (int i = 0; i < dataList.size(); i++) {
ItemObject itmItemObject = new ItemObject();
itmItemObject.id = i;
itmItemObject.itemText = dataList.get(i);
itmItemObject.x = 0;
itmItemObject.y = i * unitHeight;
itemList.add(itmItemObject);
}
isClearing = false;
}
/**
* 移动的时候
*
* @param move
*/
private void actionMove(int move) {
for (ItemObject item : itemList) {
item.move(move);
}
invalidate();
}
/**
* 移动,线程中调用
*
* @param move
*/
private void actionThreadMove(int move) {
for (ItemObject item : itemList) {
item.move(move);
}
Message rMessage = new Message();
rMessage.what = REFRESH_VIEW;
handler.sendMessage(rMessage);
}
/**
* 松开的时候
*
* @param move
*/
private void actionUp(int move) {
int newMove = 0;
if (move > 0) {
for (int i = 0; i < itemList.size(); i++) {
if (itemList.get(i).isSelected()) {
newMove = (int) itemList.get(i).moveToSelected();
if (onSelectListener != null)
onSelectListener.endSelect(itemList.get(i).id,
itemList.get(i).itemText);
break;
}
}
} else {
for (int i = itemList.size() - 1; i >= 0; i--) {
if (itemList.get(i).isSelected()) {
newMove = (int) itemList.get(i).moveToSelected();
if (onSelectListener != null)
onSelectListener.endSelect(itemList.get(i).id,
itemList.get(i).itemText);
break;
}
}
}
for (ItemObject item : itemList) {
item.newY(move + 0);
}
slowMove(newMove);
Message rMessage = new Message();
rMessage.what = REFRESH_VIEW;
handler.sendMessage(rMessage);
}
/**
* 缓慢移动
*
* @param move
*/
private synchronized void slowMove(final int move) {
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
// 判断*
int m = move > 0 ? move : move * (-1);
int i = move > 0 ? 1 : (-1);
// 移动速度
int speed = 1;
while (true) {
m = m - speed;
if (m <= 0) {
for (ItemObject item : itemList) {
item.newY(m * i);
}
Message rMessage = new Message();
rMessage.what = REFRESH_VIEW;
handler.sendMessage(rMessage);
try {
Thread.sleep(2);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
break;
}
for (ItemObject item : itemList) {
item.newY(speed * i);
}
Message rMessage = new Message();
rMessage.what = REFRESH_VIEW;
handler.sendMessage(rMessage);
try {
Thread.sleep(2);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
for (ItemObject item : itemList) {
if (item.isSelected()) {
if (onSelectListener != null)
onSelectListener.endSelect(item.id, item.itemText);
break;
}
}
}
}).start();
}
/**
* 移动到默认位置
*
* @param move
*/
private void defaultMove(int move) {
for (ItemObject item : itemList) {
item.newY(move);
}
Message rMessage = new Message();
rMessage.what = REFRESH_VIEW;
handler.sendMessage(rMessage);
}
/**
* 滑动监听
*/
private void onSelectListener() {
if (onSelectListener == null)
return;
for (ItemObject item : itemList) {
if (item.isSelected()) {
onSelectListener.selecting(item.id, item.itemText);
}
}
}
/**
* 绘制线条
*
* @param canvas
*/
private void drawLine(Canvas canvas) {
if (linePaint == null) {
linePaint = new Paint();
linePaint.setColor(lineColor);
linePaint.setAntiAlias(true);
linePaint.setStrokeWidth(1f);
}
canvas.drawLine(0, controlHeight / 2 - unitHeight / 2 + 2,
controlWidth, controlHeight / 2 - unitHeight / 2 + 2, linePaint);
canvas.drawLine(0, controlHeight / 2 + unitHeight / 2 - 2,
controlWidth, controlHeight / 2 + unitHeight / 2 - 2, linePaint);
}
/**
* 绘制遮盖板
*
* @param canvas
*/
private void drawMask(Canvas canvas) {
LinearGradient lg = new LinearGradient(0, 0, 0, maskHight, 0x00f2f2f2,
0x00f2f2f2, TileMode.MIRROR);
Paint paint = new Paint();
paint.setShader(lg);
canvas.drawRect(0, 0, controlWidth, maskHight, paint);
LinearGradient lg2 = new LinearGradient(0, controlHeight - maskHight,
0, controlHeight, 0x00f2f2f2, 0x00f2f2f2, TileMode.MIRROR);
Paint paint2 = new Paint();
paint2.setShader(lg2);
canvas.drawRect(0, controlHeight - maskHight, controlWidth,
controlHeight, paint2);
}
/**
* 初始化,获取设置的属性
*
* @param context
* @param attrs
*/
private void init(Context context, AttributeSet attrs) {
TypedArray attribute = context.obtainStyledAttributes(attrs,
R.styleable.NumberPicker);
unitHeight = (int) attribute.getDimension(
R.styleable.NumberPicker_unitHight, 32);
normalFont = attribute.getDimension(
R.styleable.NumberPicker_normalTextSize, 14.0f);
selectedFont = attribute.getDimension(
R.styleable.NumberPicker_selecredTextSize, 22.0f);
itemNumber = attribute.getInt(R.styleable.NumberPicker_itemNumber, 7);
normalColor = attribute.getColor(
R.styleable.NumberPicker_normalTextColor, 0xff000000);
selectedColor = attribute.getColor(
R.styleable.NumberPicker_selecredTextColor, 0xffff0000);
lineColor = attribute.getColor(R.styleable.NumberPicker_lineColor,
0xff000000);
maskHight = attribute.getDimension(
R.styleable.NumberPicker_maskHight, 48.0f);
noEmpty = attribute.getBoolean(R.styleable.NumberPicker_noEmpty,
false);
isEnable = attribute.getBoolean(R.styleable.NumberPicker_isEnable,
true);
attribute.recycle();
controlHeight = itemNumber * unitHeight;
}
/**
* 设置数据
*
* @param data
*/
public void setData(ArrayList<String> data) {
this.dataList = data;
initData();
}
/**
* 获取返回项
*
* @return
*/
public int getSelected() {
for (ItemObject item : itemList) {
if (item.isSelected())
return item.id;
}
return -1;
}
/**
* 获取返回的内容
*
* @return
*/
public String getSelectedText() {
for (ItemObject item : itemList) {
if (item.isSelected())
return item.itemText;
}
return "";
}
/**
* 是否正在滑动
*
* @return
*/
public boolean isScrolling() {
return isScrolling;
}
/**
* 是否可用
*
* @return
*/
public boolean isEnable() {
return isEnable;
}
/**
* 设置是否可用
*
* @param isEnable
*/
public void setEnable(boolean isEnable) {
this.isEnable = isEnable;
}
/**
* 设置默认选项
*
* @param index
*/
public void setDefault(int index) {
float move = itemList.get(index).moveToSelected();
defaultMove((int) move);
}
/**
* 获取列表大小
*
* @return
*/
public int getListSize() {
if (itemList == null)
return 0;
return itemList.size();
}
/**
* 获取某项的内容
*
* @param index
* @return
*/
public String getItemText(int index) {
if (itemList == null)
return "";
return itemList.get(index).itemText;
}
/**
* 监听
*
* @param onSelectListener
*/
public void setOnSelectListener(OnSelectListener onSelectListener) {
this.onSelectListener = onSelectListener;
}
@SuppressLint("HandlerLeak")
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
switch (msg.what) {
case REFRESH_VIEW:
invalidate();
break;
default:
break;
}
}
};
/**
* 单条内容
*
* @author zoudong
*/
private class ItemObject {
/** id */
public int id = 0;
/** 内容 */
public String itemText = "";
/** x坐标 */
public int x = 0;
/** y坐标 */
public int y = 0;
/** 移动距离 */
public int move = 0;
/** 字体画笔 */
private Paint textPaint;
/** 字体范围矩形 */
private Rect textRect;
public ItemObject() {
super();
}
/**
* 绘制自身
*
* @param canvas
*/
public void drawSelf(Canvas canvas) {
if (textPaint == null) {
textPaint = new Paint();
textPaint.setAntiAlias(true);
}
if (textRect == null)
textRect = new Rect();
// 判断是否被选择
if (isSelected()) {
textPaint.setColor(selectedColor);
// 获取距离标准位置的距离
float moveToSelect = moveToSelected();
moveToSelect = moveToSelect > 0 ? moveToSelect : moveToSelect
* (-1);
// 计算当前字体大小
float textSize = (float) normalFont
+ ((float) (selectedFont - normalFont) * (1.0f - (float) moveToSelect
/ (float) unitHeight));
textPaint.setTextSize(textSize);
} else {
textPaint.setColor(normalColor);
textPaint.setTextSize(normalFont);
}
// 返回包围整个字符串的最小的一个Rect区域
textPaint.getTextBounds(itemText, 0, itemText.length(), textRect);
// 判断是否可视
if (!isInView())
return;
// 绘制内容
canvas.drawText(itemText, x + controlWidth / 2 - textRect.width()
/ 2, y + move + unitHeight / 2 + textRect.height() / 2,
textPaint);
}
public boolean isInView() {
if (y + move > controlHeight
|| (y + move + unitHeight / 2 + textRect.height() / 2) < 0)
return false;
return true;
}
/**
* 移动距离
*
* @param _move
*/
public void move(int _move) {
this.move = _move;
}
public void newY(int _move) {
this.move = 0;
this.y = y + _move;
}
/**
* 判断是否在选择区域内
*
* @return
*/
public boolean isSelected() {
if ((y + move) >= controlHeight / 2 - unitHeight / 2 + 2
&& (y + move) <= controlHeight / 2 + unitHeight / 2 - 2)
return true;
if ((y + move + unitHeight) >= controlHeight / 2 - unitHeight / 2
+ 2
&& (y + move + unitHeight) <= controlHeight / 2
+ unitHeight / 2 - 2)
return true;
if ((y + move) <= controlHeight / 2 - unitHeight / 2 + 2
&& (y + move + unitHeight) >= controlHeight / 2
+ unitHeight / 2 - 2)
return true;
return false;
}
/**
* 获取移动到标准位置需要的距离
*/
public float moveToSelected() {
return (controlHeight / 2 - unitHeight / 2) - (y + move);
}
}
/**
* 选择监听监听
*
* @author zoudong
*
*/
public interface OnSelectListener {
/**
* 结束选择
*
* @param id
* @param text
*/
public void endSelect(int id, String text);
/**
* 选中的内容
*
* @param id
* @param text
*/
public void selecting(int id, String text);
}
}
省市县的布局文件(city_picker.xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:su="http://schemas.android.com/apk/res-auto"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:orientation="horizontal" >
<com.czhoujunlv.drug.city.ScrollerNumberPicker
android:id="@+id/province"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="1dp"
android:layout_marginRight="1dp"
android:layout_weight="1"
su:itemNumber="3"
su:lineColor="#ffff6000"
su:maskHight="32dp"
su:noEmpty="true"
su:normalTextColor="#777"
su:normalTextSize="12sp"
su:selecredTextColor="#ff000000"
su:selecredTextSize="13sp"
su:unitHight="50dp" />
<com.czhoujunlv.drug.city.ScrollerNumberPicker
android:id="@+id/city"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="1dp"
android:layout_marginRight="1dp"
android:layout_weight="1"
su:itemNumber="3"
su:lineColor="#ffff6000"
su:maskHight="32dp"
su:noEmpty="true"
su:normalTextColor="#777"
su:normalTextSize="12sp"
su:selecredTextColor="#ff000000"
su:selecredTextSize="13sp"
su:unitHight="50dp" />
<com.czhoujunlv.drug.city.ScrollerNumberPicker
android:id="@+id/couny"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="1dp"
android:layout_marginRight="1dp"
android:layout_weight="1"
su:itemNumber="3"
su:lineColor="#ffff6000"
su:maskHight="32dp"
su:noEmpty="true"
su:normalTextColor="#777"
su:normalTextSize="12sp"
su:selecredTextColor="#ff000000"
su:selecredTextSize="13sp"
su:unitHight="50dp" />
</LinearLayout>