一晃离上次写博客差不多都过了半年了,现在工作中用到了一些实用的东西,想和大家分享一下。
现在实现的是一个基于开源项目WheelView的时间、地址联动选择的对话框,先看看效果图,文章末尾有源码下载地址:
选择时间:
选择地点:
因为项目中要实现如图上的效果,无奈WheelView的默认没有,所以就修改了一点其中的代码和风格,就实现了这种效果。
步骤如下:
1、要实现选中字体变大,所以就得得到显示文字的TextView的引用,所以这里在源代码“AbstractWheelTextAdapter”中添加了记录显示文字的TextView的集合、字体的最小显示、最大显示值以及记录当前选中条目的索引:
- <span style="white-space:pre"> </span>private int currentIndex = 0;
- private static int maxsize = 24;
- private static int minsize = 14;
- private ArrayList<View> arrayList = new ArrayList<View>();
- <span style="white-space:pre"> </span>protected AbstractWheelTextAdapter(Context context, int itemResource) {
- this(context, itemResource, NO_RESOURCE, 0, maxsize, minsize);
- }
- <pre name="code" class="java"><span style="white-space:pre"> </span>protected AbstractWheelTextAdapter(Context context, int itemResource, int itemTextResource, int currentIndex,
- int maxsize, int minsize) {
- this.context = context;
- itemResourceId = itemResource;
- itemTextResourceId = itemTextResource;
- this.currentIndex = currentIndex;
- this.maxsize = maxsize;
- this.minsize = minsize;
- inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- }
其中currentIndex为初始化时选中字体变大的item的索引。
getView函数改为了:
- <span style="white-space:pre"> </span>@Override
- public View getItem(int index, View convertView, ViewGroup parent) {
- if (index >= 0 && index < getItemsCount()) {
- if (convertView == null) {
- convertView = getView(itemResourceId, parent);
- }
- TextView textView = getTextView(convertView, itemTextResourceId);
- if (!arrayList.contains(textView)) { //保存显示文字的TextView的引用,方便在外部调用
- arrayList.add(textView);
- }
- if (textView != null) {
- CharSequence text = getItemText(index);
- if (text == null) {
- text = "";
- }
- textView.setText(text);
- if (index == currentIndex) { //把当前选中item字体改大,其余的变小
- textView.setTextSize(maxsize);
- } else {
- textView.setTextSize(minsize);
- }
- if (itemResourceId == TEXT_VIEW_ITEM_RESOURCE) {
- configureTextView(textView);
- }
- }
- return convertView;
- }
- return null;
- }
2、样式的修改:
在WheelView中修改渐变颜色,中部为白色,向两边慢慢变暗
- /** Top and bottom shadows colors */
- private static final int[] SHADOWS_COLORS = new int[] { 0xeeffffff, 0xeaffffff, 0x33ffffff };
- <shape xmlns:android="http://schemas.android.com/apk/res/android">
- <gradient
- android:startColor="#22ffffff"
- android:centerColor="#00ffffff"
- android:endColor="#22ffffff"
- android:angle="90" />
- </shape>
wheel_bg.xml改为了空
- <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
- </layer-list>
就实现了图片中的效果,这样对源码的修改就完成了。
3、选择时间对话框的实现,代码如下:
布局:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/ly_myinfo_changebirth"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:background="#00000000"
- android:gravity="center"
- android:orientation="vertical" >
- <LinearLayout
- android:id="@+id/ly_myinfo_changebirth_child"
- android:layout_width="300dip"
- android:layout_height="wrap_content"
- android:layout_marginLeft="27dip"
- android:layout_marginRight="27dip"
- android:background="@drawable/bg_dialog_selector"
- android:orientation="vertical" >
- <TextView
- android:id="@+id/tv_share_title"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginBottom="14dip"
- android:layout_marginLeft="18dip"
- android:layout_marginTop="18dip"
- android:gravity="center_vertical"
- android:text="选择日期"
- android:textColor="#000000"
- android:textSize="18sp" />
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="160dip"
- android:orientation="horizontal"
- android:layout_marginLeft="20dip"
- android:layout_marginRight="20dip"
- android:gravity="center_vertical">
- <com.ywl5320.pickaddress.wheel.widget.views.WheelView
- android:id="@+id/wv_birth_year"
- android:layout_width="0dip"
- android:layout_weight="1"
- android:layout_height="match_parent"
- android:layout_gravity="center_vertical"
- />
- <com.ywl5320.pickaddress.wheel.widget.views.WheelView
- android:id="@+id/wv_birth_month"
- android:layout_width="0dip"
- android:layout_weight="1"
- android:layout_height="match_parent"
- android:layout_gravity="center_vertical"
- />
- <com.ywl5320.pickaddress.wheel.widget.views.WheelView
- android:id="@+id/wv_birth_day"
- android:layout_width="0dip"
- android:layout_weight="1"
- android:layout_height="match_parent"
- android:layout_gravity="center_vertical"
- />
- </LinearLayout>
- <RelativeLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginTop="25dip"
- android:layout_marginBottom="21dip">
- <TextView
- android:id="@+id/btn_myinfo_sure"
- android:layout_width="77dip"
- android:layout_height="33dip"
- android:layout_alignParentRight="true"
- android:layout_marginRight="15dip"
- android:text="确认"
- android:gravity="center"
- android:textSize="16sp" />
- <TextView
- android:id="@+id/btn_myinfo_cancel"
- android:layout_width="77dip"
- android:layout_height="33dip"
- android:layout_toLeftOf="@+id/btn_myinfo_sure"
- android:text="取消"
- android:gravity="center"
- android:textSize="16sp" />
- </RelativeLayout>
- </LinearLayout>
- </LinearLayout>
- <style name="ShareDialog" parent="@android:Theme.Dialog">
- <item name="android:windowBackground">@android:color/transparent</item>
- <item name="android:windowFrame">@null</item>
- <item name="android:windowNoTitle">true</item>
- <item name="android:windowIsFloating">false</item>
- <item name="android:windowIsTranslucent">true</item>
- <item name="android:windowContentOverlay">@null</item>
- <item name="android:backgroundDimEnabled">true</item>
- </style>
- package com.ywl5320.pickaddress;
- import java.util.ArrayList;
- import java.util.Calendar;
- import android.app.Dialog;
- import android.content.Context;
- import android.os.Bundle;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.TextView;
- import com.ywl5320.pickaddress.wheel.widget.adapters.AbstractWheelTextAdapter;
- import com.ywl5320.pickaddress.wheel.widget.views.OnWheelChangedListener;
- import com.ywl5320.pickaddress.wheel.widget.views.OnWheelScrollListener;
- import com.ywl5320.pickaddress.wheel.widget.views.WheelView;
- /**
- * 日期选择对话框
- *
- * @author ywl
- *
- */
- public class ChangeBirthDialog extends Dialog implements android.view.View.OnClickListener {
- private Context context;
- private WheelView wvYear;
- private WheelView wvMonth;
- private WheelView wvDay;
- private View vChangeBirth;
- private View vChangeBirthChild;
- private TextView btnSure;
- private TextView btnCancel;
- private ArrayList<String> arry_years = new ArrayList<String>();
- private ArrayList<String> arry_months = new ArrayList<String>();
- private ArrayList<String> arry_days = new ArrayList<String>();
- private CalendarTextAdapter mYearAdapter;
- private CalendarTextAdapter mMonthAdapter;
- private CalendarTextAdapter mDaydapter;
- private int month; //选中当前年有几个月
- private int day; //选中当前月有几天(分了闰年的)
- private int currentYear = getYear(); //得到当前年份
- private int currentMonth = 1;
- private int currentDay = 1;
- private int maxTextSize = 24; //字体最大值
- private int minTextSize = 14; //字体最小值
- private boolean issetdata = false; //判断是否设置了默认时间,没有就设置为当前时间
- private String selectYear; //选中的年
- private String selectMonth; //选中的月
- private String selectDay; //选中的日
- private OnBirthListener onBirthListener;
- public ChangeBirthDialog(Context context) {
- super(context, R.style.ShareDialog);
- this.context = context;
- }
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.dialog_myinfo_changebirth);
- wvYear = (WheelView) findViewById(R.id.wv_birth_year);
- wvMonth = (WheelView) findViewById(R.id.wv_birth_month);
- wvDay = (WheelView) findViewById(R.id.wv_birth_day);
- vChangeBirth = findViewById(R.id.ly_myinfo_changebirth);
- vChangeBirthChild = findViewById(R.id.ly_myinfo_changebirth_child);
- btnSure = (TextView) findViewById(R.id.btn_myinfo_sure);
- btnCancel = (TextView) findViewById(R.id.btn_myinfo_cancel);
- vChangeBirth.setOnClickListener(this);
- vChangeBirthChild.setOnClickListener(this);
- btnSure.setOnClickListener(this);
- btnCancel.setOnClickListener(this);
- if (!issetdata) {
- initData();
- }
- initYears();
- <span style="white-space:pre"> </span>//初始化年,显示可见条目数量,年份集合,当前设置年份、<span style="font-family: Arial, Helvetica, sans-serif;">字体大小</span>
- mYearAdapter = new CalendarTextAdapter(context, arry_years, setYear(currentYear), maxTextSize, minTextSize);
- <span style="white-space:pre"> </span>//可见5条
- wvYear.setVisibleItems(5);
- <span style="white-space:pre"> </span>//设置适配器
- wvYear.setViewAdapter(mYearAdapter);
- <span style="white-space:pre"> </span>//根据当前传入的年份,设置显示年份
- wvYear.setCurrentItem(setYear(currentYear));
- initMonths(month);
- mMonthAdapter = new CalendarTextAdapter(context, arry_months, setMonth(currentMonth), maxTextSize, minTextSize);
- wvMonth.setVisibleItems(5);
- wvMonth.setViewAdapter(mMonthAdapter);
- wvMonth.setCurrentItem(setMonth(currentMonth));
- initDays(day);
- mDaydapter = new CalendarTextAdapter(context, arry_days, currentDay - 1, maxTextSize, minTextSize);
- wvDay.setVisibleItems(5);
- wvDay.setViewAdapter(mDaydapter);
- wvDay.setCurrentItem(currentDay - 1);
- <span style="white-space:pre"> </span>//为年份选中添加change事件,根据选中年份,联动设置月份
- wvYear.addChangingListener(new OnWheelChangedListener() {
- @Override
- public void onChanged(WheelView wheel, int oldValue, int newValue) {
- // TODO Auto-generated method stub
- String currentText = (String) mYearAdapter.getItemText(wheel.getCurrentItem());
- selectYear = currentText;
- setTextviewSize(currentText, mYearAdapter);
- currentYear = Integer.parseInt(currentText);
- setYear(currentYear);
- initMonths(month);
- mMonthAdapter = new CalendarTextAdapter(context, arry_months, 0, maxTextSize, minTextSize);
- wvMonth.setVisibleItems(5);
- wvMonth.setViewAdapter(mMonthAdapter);
- wvMonth.setCurrentItem(0);
- }
- });
- <span style="white-space:pre"> </span>//添加滚动事件,调用adapter中的显示文字集合来改变字体大小
- wvYear.addScrollingListener(new OnWheelScrollListener() {
- @Override
- public void onScrollingStarted(WheelView wheel) {
- // TODO Auto-generated method stub
- }
- @Override
- public void onScrollingFinished(WheelView wheel) {
- // TODO Auto-generated method stub
- String currentText = (String) mYearAdapter.getItemText(wheel.getCurrentItem());
- setTextviewSize(currentText, mYearAdapter);
- }
- });
- wvMonth.addChangingListener(new OnWheelChangedListener() {
- @Override
- public void onChanged(WheelView wheel, int oldValue, int newValue) {
- // TODO Auto-generated method stub
- String currentText = (String) mMonthAdapter.getItemText(wheel.getCurrentItem());
- selectMonth = currentText;
- setTextviewSize(currentText, mMonthAdapter);
- setMonth(Integer.parseInt(currentText));
- initDays(day);
- mDaydapter = new CalendarTextAdapter(context, arry_days, 0, maxTextSize, minTextSize);
- wvDay.setVisibleItems(5);
- wvDay.setViewAdapter(mDaydapter);
- wvDay.setCurrentItem(0);
- }
- });
- wvMonth.addScrollingListener(new OnWheelScrollListener() {
- @Override
- public void onScrollingStarted(WheelView wheel) {
- // TODO Auto-generated method stub
- }
- @Override
- public void onScrollingFinished(WheelView wheel) {
- // TODO Auto-generated method stub
- String currentText = (String) mMonthAdapter.getItemText(wheel.getCurrentItem());
- setTextviewSize(currentText, mMonthAdapter);
- }
- });
- wvDay.addChangingListener(new OnWheelChangedListener() {
- @Override
- public void onChanged(WheelView wheel, int oldValue, int newValue) {
- // TODO Auto-generated method stub
- String currentText = (String) mDaydapter.getItemText(wheel.getCurrentItem());
- setTextviewSize(currentText, mDaydapter);
- selectDay = currentText;
- }
- });
- wvDay.addScrollingListener(new OnWheelScrollListener() {
- @Override
- public void onScrollingStarted(WheelView wheel) {
- // TODO Auto-generated method stub
- }
- @Override
- public void onScrollingFinished(WheelView wheel) {
- // TODO Auto-generated method stub
- String currentText = (String) mDaydapter.getItemText(wheel.getCurrentItem());
- setTextviewSize(currentText, mDaydapter);
- }
- });
- }
- <span style="white-space:pre"> </span>
- <span style="white-space:pre"> </span>//初始化年份,可以把1950设置为一个变量,方便动态设置
- public void initYears() {
- for (int i = getYear(); i > 1950; i--) {
- arry_years.add(i + "");
- }
- }
- <span style="white-space:pre"> </span>//初始化月份
- public void initMonths(int months) {
- arry_months.clear();
- for (int i = 1; i <= months; i++) {
- arry_months.add(i + "");
- }
- }
- <span style="white-space:pre"> </span>//出事话天日
- public void initDays(int days) {
- arry_days.clear();
- for (int i = 1; i <= days; i++) {
- arry_days.add(i + "");
- }
- }
- private class CalendarTextAdapter extends AbstractWheelTextAdapter {
- ArrayList<String> list;
- protected CalendarTextAdapter(Context context, ArrayList<String> list, int currentItem, int maxsize, int minsize) {
- super(context, R.layout.item_birth_year, NO_RESOURCE, currentItem, maxsize, minsize);
- this.list = list;
- setItemTextResource(R.id.tempValue);
- }
- @Override
- public View getItem(int index, View cachedView, ViewGroup parent) {
- View view = super.getItem(index, cachedView, parent);
- return view;
- }
- @Override
- public int getItemsCount() {
- return list.size();
- }
- @Override
- protected CharSequence getItemText(int index) {
- return list.get(index) + "";
- }
- }
- <span style="white-space:pre"> </span>//暴露给activity的回调借口,用于获取选择的结果
- public void setBirthdayListener(OnBirthListener onBirthListener) {
- this.onBirthListener = onBirthListener;
- }
- @Override
- public void onClick(View v) {
- if (v == btnSure) {
- if (onBirthListener != null) {
- onBirthListener.onClick(selectYear, selectMonth, selectDay);
- }
- } else if (v == btnSure) {
- } else if (v == vChangeBirthChild) {
- return;
- } else {
- dismiss();
- }
- dismiss();
- }
- public interface OnBirthListener {
- public void onClick(String year, String month, String day);
- }
- /**
- * 设置字体大小
- *
- * @param curriteItemText
- * @param adapter
- */
- public void setTextviewSize(String curriteItemText, CalendarTextAdapter adapter) {
- ArrayList<View> arrayList = adapter.getTestViews();
- int size = arrayList.size();
- String currentText;
- for (int i = 0; i < size; i++) {
- TextView textvew = (TextView) arrayList.get(i);
- currentText = textvew.getText().toString();
- if (curriteItemText.equals(currentText)) {
- textvew.setTextSize(maxTextSize);
- } else {
- textvew.setTextSize(minTextSize);
- }
- }
- }
- public int getYear() {
- Calendar c = Calendar.getInstance();
- return c.get(Calendar.YEAR);
- }
- public int getMonth() {
- Calendar c = Calendar.getInstance();
- return c.get(Calendar.MONTH) + 1;
- }
- public int getDay() {
- Calendar c = Calendar.getInstance();
- return c.get(Calendar.DATE);
- }
- public void initData() {
- setDate(getYear(), getMonth(), getDay());
- this.currentDay = 1;
- this.currentMonth = 1;
- }
- /**
- * 设置年月日
- *
- * @param year
- * @param month
- * @param day
- */
- public void setDate(int year, int month, int day) {
- selectYear = year + "";
- selectMonth = month + "";
- selectDay = day + "";
- issetdata = true;
- this.currentYear = year;
- this.currentMonth = month;
- this.currentDay = day;
- if (year == getYear()) {
- this.month = getMonth();
- } else {
- this.month = 12;
- }
- calDays(year, month);
- }
- /**
- * 设置年份
- *
- * @param year
- */
- public int setYear(int year) {
- int yearIndex = 0;
- if (year != getYear()) {
- this.month = 12;
- } else {
- this.month = getMonth();
- }
- for (int i = getYear(); i > 1950; i--) {
- if (i == year) {
- return yearIndex;
- }
- yearIndex++;
- }
- return yearIndex;
- }
- /**
- * 设置月份
- *
- * @param year
- * @param month
- * @return
- */
- public int setMonth(int month) {
- int monthIndex = 0;
- calDays(currentYear, month);
- for (int i = 1; i < this.month; i++) {
- if (month == i) {
- return monthIndex;
- } else {
- monthIndex++;
- }
- }
- return monthIndex;
- }
- /**
- * 计算每月多少天
- *
- * @param month
- * @param leayyear
- */
- public void calDays(int year, int month) {
- boolean leayyear = false;
- if (year % 4 == 0 && year % 100 != 0) {
- leayyear = true;
- } else {
- leayyear = false;
- }
- for (int i = 1; i <= 12; i++) {
- switch (month) {
- case 1:
- case 3:
- case 5:
- case 7:
- case 8:
- case 10:
- case 12:
- this.day = 31;
- break;
- case 2:
- if (leayyear) {
- this.day = 29;
- } else {
- this.day = 28;
- }
- break;
- case 4:
- case 6:
- case 9:
- case 11:
- this.day = 30;
- break;
- }
- }
- if (year == getYear() && month == getMonth()) {
- this.day = getDay();
- }
- }
- }
- http://download.csdn.net/detail/ywl5320/8545059