仿支付宝账单时间选择器
项目中需要(http://www.cocoachina.com/bbs/read.php?tid-1724339.html)
项目中需要仿支付宝的时间选择器的效果,这里有两种方案,一种android原生控件DatePiker,一种自定义wheelView,实现的效果基本一致,原生的更方便简洁一点,一下pull出部分代码
MainActivity
package performance.com.timepiker_test;
import android.app.Activity;
import android.content.Context;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.RequiresApi;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.CalendarView;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
public class MainActivity extends Activity implements DatePicker.OnDateChangedListener, View.OnClickListener {
private EditText mEditTextstart, mEditTextend;
private LinearLayout mMain;
private ArrayList arry_years = new ArrayList();
private ArrayList arry_months = new ArrayList();
private ArrayList arry_days = new ArrayList();
private int maxTextSize = 24;
private int minTextSize = 14;
private String currentYear = getYear();
private String currentMonth = getMonth();
private String currentDay = getDay();
private boolean issetdata = true;
private String selectYear;
private String selectMonth;
private String selectDay;
private String month;
private String day;
private CalendarTextAdapter mYearAdapter;
private CalendarTextAdapter mMonthAdapter;
private CalendarTextAdapter mDaydapter;
private WheelView wvMonth, wvYear, wvDay;
private String mCurrentTextYear;
private String mCurrentTextMonth;
private String mYear;
private String mMonth;
private String mDay;
private TextView mTips;
private SimpleDateFormat mSdfDate;
private CustomDatePicker mDatePicker;
private long mStringToDate;
private LinearLayout mLinearLayout;
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mStringToDate = getStringToDate(“2014年01月01日”);
Calendar now = Calendar.getInstance();
mEditTextstart = findViewById(R.id.edit1);
mEditTextend = findViewById(R.id.edit2);
Button button1 = findViewById(R.id.button1);
Button button2 = findViewById(R.id.button2);
button1.setOnClickListener(this);
button2.setOnClickListener(this);
mDatePicker = findViewById(R.id.customDatePiker);
mLinearLayout = findViewById(R.id.ll_wheel);
/DatePiker时间轮询器/
mDatePicker.updateDate(2014, 8, 9);
mDatePicker.setDividerColor(0xffcccccc);
//设置最大日期 最小日期
mDatePicker.setMaxDate(now.getTime().getTime());
mDatePicker.setMinDate(mStringToDate);
mDatePicker.getCalendarView().setOnDateChangeListener(new CalendarView.OnDateChangeListener() {
@Override
public void onSelectedDayChange(@NonNull CalendarView calendarView, int i, int i1, int i2) {
Log.e(“TAG”,”打印:”+i+”-“+(i1+1)+”-“+i2);
if(mEditTextstart.isFocused()){
mEditTextstart.setText(i+”-“+(i1+1)+”-“+i2);
}else{
mEditTextend.setText(i+”-“+(i1+1)+”-“+i2);
}
}
});
mSdfDate = new SimpleDateFormat(“yyyy - MM - dd”);
wvYear = findViewById(R.id.wv_birth_year);
wvMonth = findViewById(R.id.wv_birth_month);
wvDay = findViewById(R.id.wv_birth_day);
mTips = findViewById(R.id.tips);
mYear = getYear();
if (Integer.parseInt(getMonth()) < 10) {
mMonth = “0” + getMonth();
} else {
mMonth = getMonth();
}
if (Integer.parseInt(getDay()) < 10) {
mDay = “0” + getDay();
} else {
mDay = getDay();
}
mEditTextstart.setText(getYear() + “-” + mMonth + “-” + mDay);
if(mEditTextend.isFocused()){
mEditTextend.setText(mYear+"-"+mMonth+"-"+mDay);
}
if (!issetdata) {
initData();
}
initYears();
mYearAdapter = new CalendarTextAdapter(this, arry_years, setYear(currentYear), maxTextSize, minTextSize);
wvYear.setVisibleItems(5);
wvYear.setViewAdapter(mYearAdapter);
wvYear.setCurrentItem(setYear(currentYear));
initMonths(Integer.parseInt(month));
mMonthAdapter = new CalendarTextAdapter(this, arry_months, setMonth(currentMonth), maxTextSize, minTextSize);
wvMonth.setVisibleItems(5);
wvMonth.setViewAdapter(mMonthAdapter);
wvMonth.setCurrentItem(setMonth(currentMonth));
initDays(Integer.parseInt(day));
mDaydapter = new CalendarTextAdapter(this, arry_days, Integer.parseInt(currentDay) - 1, maxTextSize, minTextSize);
wvDay.setVisibleItems(5);
wvDay.setViewAdapter(mDaydapter);
wvDay.setCurrentItem(Integer.parseInt(currentDay) - 1);
Calendar calendar = Calendar.getInstance();
long timeInMillis = calendar.getTimeInMillis();
calendar.setTimeInMillis(timeInMillis);
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 = currentText.substring(0, currentText.length() - 1).toString();
setYear(currentYear);
initMonths(Integer.parseInt(month));
mMonthAdapter = new CalendarTextAdapter(getApplicationContext(), arry_months, 0, maxTextSize, minTextSize);
wvMonth.setVisibleItems(5);
wvMonth.setViewAdapter((WheelViewAdapter) mMonthAdapter);
wvMonth.setCurrentItem(0);
calDays(currentYear, month);
}
});
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
mCurrentTextYear = (String) mYearAdapter.getItemText(wheel.getCurrentItem());
mYear = mCurrentTextYear.substring(0, mCurrentTextYear.length() - 1);
setTextviewSize(mCurrentTextYear, mYearAdapter);
if (mEditTextstart.isFocused()) {
mEditTextstart.setText(mYear + "-01-01");
} else {
mEditTextend.setText(mYear + "-01-01");
}
}
});
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(currentText.substring(0, 1));
calDays(currentYear, String.valueOf(wheel.getCurrentItem() + 1));
initDays(Integer.parseInt(day));
mDaydapter = new CalendarTextAdapter(getApplicationContext(), 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
mCurrentTextMonth = (String) mMonthAdapter.getItemText(wheel.getCurrentItem());
mMonth = mCurrentTextMonth.substring(0, mCurrentTextMonth.length() - 1);
if (Integer.parseInt(mMonth) < 10) {
mMonth = "0" + mMonth;
}
setTextviewSize(mCurrentTextMonth, mMonthAdapter);
if (!mDay.equals("01")) {
mDay = "01";
}
if (mEditTextstart.isFocused()) {
if (mYear != null) {
mEditTextstart.setText(mYear + "-" + mMonth + "-" + mDay);
} else {
mEditTextstart.setText(getYear() + "-" + mMonth + "-" + mDay);
}
} else {
if (mYear != null) {
mEditTextend.setText(mYear + "-" + mMonth + "-" + mDay);
} else {
mEditTextend.setText(getYear() + "-" + mMonth + "-" + getDay());
}
}
if (mEditTextstart.getText().toString() != "" && mEditTextend.getText().toString() != "") {
String start = mEditTextstart.getText().toString();
String finish = mEditTextend.getText().toString();
// SimpleDateFormat dfs = new SimpleDateFormat(“yyyy-MM-dd”);
try {
SimpleDateFormat dfs = new SimpleDateFormat(“yyyy-MM-dd”);
Date begin = null;
Date end = null;
begin = dfs.parse(start);
end = dfs.parse(finish);
long l = begin.getTime() - end.getTime();
long day = l / (24 * 60 * 60 * 1000);
Log.e("TAG", "打印:" + day);
if (day > 180) {
mTips.setVisibility(View.VISIBLE);
} else {
mTips.setVisibility(View.GONE);
}
} catch (ParseException e) {
Log.e("TAG", "打印try:" + e.toString());
}
}
}
});
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 currentTextDay = (String) mDaydapter.getItemText(wheel.getCurrentItem());
mDay = currentTextDay.substring(0, currentTextDay.length() - 1);
if (Integer.parseInt(mDay) < 10) {
mDay = "0" + mDay;
}
// if(!mMonth.equals(“01”)){
// mMonth=”01”;
// }
setTextviewSize(currentTextDay, mDaydapter);
if (mEditTextstart.isFocused()) {
mEditTextstart.setText(mYear + “-” + mMonth + “-” + mDay);
} else {
mEditTextend.setText(mYear + “-” + mMonth + “-” + mDay);
}
if (mEditTextstart.getText().toString() != “” && mEditTextend.getText().toString() != “”) {
String start = mEditTextstart.getText().toString();
String finish = mEditTextend.getText().toString();
// SimpleDateFormat dfs = new SimpleDateFormat(“yyyy-MM-dd”);
try {
SimpleDateFormat dfs = new SimpleDateFormat(“yyyy-MM-dd”);
Date begin = null;
Date end = null;
begin = dfs.parse(start);
end = dfs.parse(finish);
long l = begin.getTime() - end.getTime();
long day = l / (24 * 60 * 60 * 1000);
Log.e("TAG", "打印:" + day);
if (day > 180) {
mTips.setVisibility(View.VISIBLE);
} else {
mTips.setVisibility(View.GONE);
}
} catch (ParseException e) {
Log.e("TAG", "打印try:" + e.toString());
}
}
}
});
}
/**
* 设置字体大小
*
* @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 String getYear() {
Calendar c = Calendar.getInstance();
return c.get(Calendar.YEAR) + "";
}
public String getMonth() {
Calendar c = Calendar.getInstance();
return c.get(Calendar.MONTH) + 1 + "";
}
public String 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
*/
public int setYear(String year) {
int yearIndex = 0;
if (!year.equals(getYear())) {
this.month = 12 + "";
} else {
this.month = getMonth();
}
for (int i = Integer.parseInt(getYear()); i >= 2014; i--) {
yearIndex++;
}
return yearIndex;
}
/**
* 设置年月日
*
* @param year
* @param month
* @param day
*/
public void setDate(String year, String month, String 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 month
* @param month
* @return
*/
public int setMonth(String month) {
int monthIndex = 0;
calDays(currentYear, month);
for (int i = 1; i < Integer.parseInt(this.month); i++) {
if (Integer.parseInt(month) == i) {
return monthIndex;
} else {
monthIndex++;
}
}
return monthIndex;
}
public void initYears() {
for (int i = 2013; i <= Integer.parseInt(getYear()); i++) {
arry_years.add(i + "年");
}
}
public void initMonths(int months) {
arry_months.clear();
for (int i = 1; i <= months; i++) {
arry_months.add(i + "月");
}
}
public void initDays(int days) {
arry_days.clear();
for (int i = 1; i <= days; i++) {
arry_days.add(i + "日");
}
}
/**
* 计算每月多少天
*
* @param month
* @param year
*/
public void calDays(String year, String month) {
boolean leayyear = false;
if (Integer.parseInt(year) % 4 == 0 && Integer.parseInt(year) % 100 != 0) {
leayyear = true;
} else {
leayyear = false;
}
for (int i = 1; i <= 12; i++) {
switch (Integer.parseInt(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.equals(getYear()) && month.equals(getMonth())) {
this.day = getDay();
}
}
/*将字符串转为时间戳*/
public static long getStringToDate(String time) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
Date date = new Date();
try{
date = sdf.parse(time);
} catch(ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return date.getTime();
}
@Override
public void onDateChanged(DatePicker datePicker, int i, int i1, int i2) {
Log.e("TAG","点击了");
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.button1:
mDatePicker.setVisibility(View.VISIBLE);
mLinearLayout.setVisibility(View.GONE);
break;
case R.id.button2:
mLinearLayout.setVisibility(View.VISIBLE);
mDatePicker.setVisibility(View.GONE);
break;
}
}
private class CalendarTextAdapter extends performance.com.timepiker_test.AbstractWheelTextAdapter1 {
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) + "";
}
}
}
自定义Datepiker_CustomDatePicker
package performance.com.timepiker_test;
import android.content.Context;
import android.graphics.drawable.ColorDrawable;
import android.os.Build;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.widget.DatePicker;
import android.widget.LinearLayout;
import android.widget.NumberPicker;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
public class CustomDatePicker extends DatePicker
{
private List mPickers;
public CustomDatePicker(Context context)
{
super(context);
findNumberPicker();
}
public CustomDatePicker(Context context, AttributeSet attrs)
{
super(context, attrs);
findNumberPicker();
}
public CustomDatePicker(Context context, AttributeSet attrs, int defStyleAttr)
{
super(context, attrs, defStyleAttr);
findNumberPicker();
}
/**
* 得到控件里面的numberpicker组件
*/
private void findNumberPicker()
{
mPickers = new ArrayList();
LinearLayout llFirst = (LinearLayout) getChildAt(0);
LinearLayout mSpinners = (LinearLayout) llFirst.getChildAt(0);
for (int i = 0; i < mSpinners.getChildCount(); i++)
{
NumberPicker picker = (NumberPicker) mSpinners.getChildAt(i);
mPickers.add(i, picker);
}
}
/**
* 设置时间
* @param strDate yyyy-mm-dd
*/
public void setDate(String strDate)
{
int day, month, year;
if (!TextUtils.isEmpty(strDate))
{
String[] dateValues = strDate.split(“-“);
if (dateValues.length == 3)
{
year = Integer.parseInt(dateValues[0]);
month = Integer.parseInt(dateValues[1]) - 1;
day = Integer.parseInt(dateValues[2]);
updateDate(year, month, day);
return;
}
}
//error
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
day = calendar.get(Calendar.DAY_OF_MONTH);
month = calendar.get(Calendar.MONTH);
year = calendar.get(Calendar.YEAR);
updateDate(year, month, day);
}
/**
* 获得时间
* @return yyyy-mm-dd
*/
public String getDate()
{
StringBuilder sbDate = new StringBuilder();
sbDate.append(format2Digits(getYear())).append(“-“)
.append(format2Digits(getMonth()+1)).append(“-“)
.append(format2Digits(getDayOfMonth()));
return sbDate.toString();
}
private String format2Digits(int value)
{
return String.format(“%02d”,value);
}
/**
* 设置picker间隔
*
* @param margin
*/
public void setPickerMargin(int margin)
{
for (NumberPicker picker : mPickers)
{
LinearLayout.LayoutParams lps = (LinearLayout.LayoutParams) picker.getLayoutParams();
lps.setMargins(margin, 0, margin, 0);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1)
{
lps.setMarginStart(margin);
lps.setMarginEnd(margin);
}
picker.setLayoutParams(lps);
}
}
/**
* 设置时间选择器的分割线颜色
*/
public void setDividerColor(int color)
{
for (int i = 0; i < mPickers.size(); i++)
{
NumberPicker picker = mPickers.get(i);
try
{
Field pf = NumberPicker.class.getDeclaredField("mSelectionDivider");
pf.setAccessible(true);
pf.set(picker, new ColorDrawable(color));
}
catch (NoSuchFieldException e)
{
e.printStackTrace();
}
catch (IllegalAccessException e)
{
e.printStackTrace();
}
}
}
}