失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > Android基于开源项目的WheelView的时间 地址联动选择对话框

Android基于开源项目的WheelView的时间 地址联动选择对话框

时间:2020-07-25 16:34:16

相关推荐

Android基于开源项目的WheelView的时间 地址联动选择对话框

我的视频课程(基础):《(NDK)FFmpeg打造Android万能音频播放器》

我的视频课程(进阶):《(NDK)FFmpeg打造Android视频播放器》

一晃离上次写博客差不多都过了半年了,现在工作中用到了一些实用的东西,想和大家分享一下。

现在实现的是一个基于开源项目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>@Overridepublic 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;}

这样Adapter就修改完了。

2、样式的修改:

在WheelView中修改渐变颜色,中部为白色,向两边慢慢变暗

/** Top and bottom shadows colors */private static final int[] SHADOWS_COLORS = new int[] { 0xeeffffff, 0xeaffffff, 0x33ffffff };

wheel_val.xml文件改为了

<shape xmlns:android="/apk/res/android"><gradientandroid:startColor="#22ffffff"android:centerColor="#00ffffff"android:endColor="#22ffffff"android:angle="90" /></shape>

wheel_bg.xml改为了空

<layer-list xmlns:android="/apk/res/android"></layer-list>

就实现了图片中的效果,这样对源码的修改就完成了。

3、选择时间对话框的实现,代码如下:

布局:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/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" ><LinearLayoutandroid: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" ><TextViewandroid: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.WheelViewandroid: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.WheelViewandroid: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.WheelViewandroid:id="@+id/wv_birth_day"android:layout_width="0dip"android:layout_weight="1"android:layout_height="match_parent"android:layout_gravity="center_vertical"/></LinearLayout><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="25dip"android:layout_marginBottom="21dip"><TextViewandroid: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" /><TextViewandroid: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:

<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;}@Overrideprotected 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() {@Overridepublic void onChanged(WheelView wheel, int oldValue, int newValue) {// TODO Auto-generated method stubString 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() {@Overridepublic void onScrollingStarted(WheelView wheel) {// TODO Auto-generated method stub}@Overridepublic void onScrollingFinished(WheelView wheel) {// TODO Auto-generated method stubString currentText = (String) mYearAdapter.getItemText(wheel.getCurrentItem());setTextviewSize(currentText, mYearAdapter);}});wvMonth.addChangingListener(new OnWheelChangedListener() {@Overridepublic void onChanged(WheelView wheel, int oldValue, int newValue) {// TODO Auto-generated method stubString 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() {@Overridepublic void onScrollingStarted(WheelView wheel) {// TODO Auto-generated method stub}@Overridepublic void onScrollingFinished(WheelView wheel) {// TODO Auto-generated method stubString currentText = (String) mMonthAdapter.getItemText(wheel.getCurrentItem());setTextviewSize(currentText, mMonthAdapter);}});wvDay.addChangingListener(new OnWheelChangedListener() {@Overridepublic void onChanged(WheelView wheel, int oldValue, int newValue) {// TODO Auto-generated method stubString currentText = (String) mDaydapter.getItemText(wheel.getCurrentItem());setTextviewSize(currentText, mDaydapter);selectDay = currentText;}});wvDay.addScrollingListener(new OnWheelScrollListener() {@Overridepublic void onScrollingStarted(WheelView wheel) {// TODO Auto-generated method stub}@Overridepublic void onScrollingFinished(WheelView wheel) {// TODO Auto-generated method stubString 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);}@Overridepublic View getItem(int index, View cachedView, ViewGroup parent) {View view = super.getItem(index, cachedView, parent);return view;}@Overridepublic int getItemsCount() {return list.size();}@Overrideprotected CharSequence getItemText(int index) {return list.get(index) + "";}}

<span style="white-space:pre"></span>//暴露给activity的回调借口,用于获取选择的结果public void setBirthdayListener(OnBirthListener onBirthListener) {this.onBirthListener = onBirthListener;}@Overridepublic 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();}}}

4、选择地址过程基本一致,就不在这里赘述了,唯一区别就是获取地址源的时候,是通过解析json数据获取的,我会上传源码,无积分下载的。

好的这样就完成了这种看似高大上的效果 哈哈哈 源码下载

如果觉得《Android基于开源项目的WheelView的时间 地址联动选择对话框》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。