效果如下:
使用 布局文件如下:
com.ycuwq.datepicker.date.DatePicker是组合 里面的布局文件如下:
java里进行监听如下:
- YearPicker.OnYearSelectedListener
- MonthPicker.OnMonthSelectedListener
- DayPicker.OnDaySelectedListener
- HourPicker.OnHourSelectedListener
- MinutePicker.OnMinuteSelectedListener
属性列表如下:
//可见的行数
//文本大小
宽度
文本颜色
字体渐变,开启后越靠近边缘,字体越模糊
选中文本颜色
选中的文本大小
当前项位置
两个Item之间的高宽间隔
两个Item之间的高宽间隔
是否进行缩放效果
循环
幕布
幕布颜色
幕布边框
幕布边框的颜色
指示器文字的文本
指示器文字的文本大小
指示器文字的文本颜色
开始年份
结束年份
线条和矩形边框幕布设置
位置:com.ycuwq.datepicker.WheelPicker#onDraw(Canvas canvas)
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
mPaint.setTextAlign(Paint.Align.CENTER);
if (mIsShowCurtain) {
mPaint.setStyle(Paint.Style.FILL);
mPaint.setColor(mCurtainColor);
canvas.drawRect(mSelectedItemRect, mPaint);
}
if (mIsShowCurtainBorder) {
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setColor(mCurtainBorderColor);
canvas.drawLine(mSelectedItemRect.left
, mSelectedItemRect.top
, mSelectedItemRect.right
, mSelectedItemRect.top
, mPaint); //绘制直线
canvas.drawLine(mSelectedItemRect.left
, mSelectedItemRect.bottom
, mSelectedItemRect.right
, mSelectedItemRect.bottom
, mPaint); //绘制直线
// canvas.drawRect(mSelectedItemRect, mPaint);
// canvas.drawRect(mDrawnRect, mPaint);
}
int drawnSelectedPos = - mScrollOffsetY / mItemHeight;
mPaint.setStyle(Paint.Style.FILL);
//首尾各多绘制一个用于缓冲
for (int drawDataPos = drawnSelectedPos - mHalfVisibleItemCount - 1;
drawDataPos mDataList.size() - 1) {
continue;
}
}
T data = mDataList.get(position);
int itemDrawY = mFirstItemDrawY + (drawDataPos + mHalfVisibleItemCount) * mItemHeight + mScrollOffsetY;
//距离中心的Y轴距离
int distanceY = Math.abs(mCenterItemDrawnY - itemDrawY);
if (mIsTextGradual) {
//文字颜色渐变要在设置透明度上边,否则会被覆盖
//计算文字颜色渐变
if (distanceY < mItemHeight) { //距离中心的高度小于一个ItemHeight才会开启渐变
float colorRatio = 1 - (distanceY / (float) mItemHeight);
mSelectedItemPaint.setColor(mLinearGradient.getColor(colorRatio));
mTextPaint.setColor(mLinearGradient.getColor(colorRatio));
} else {
mSelectedItemPaint.setColor(mSelectedItemTextColor);
mTextPaint.setColor(mTextColor);
}
//计算透明度渐变
float alphaRatio;
if (itemDrawY > mCenterItemDrawnY) {
alphaRatio = (mDrawnRect.height() - itemDrawY) /
(float) (mDrawnRect.height() - (mCenterItemDrawnY));
} else {
alphaRatio = itemDrawY / (float) mCenterItemDrawnY;
}
alphaRatio = alphaRatio < 0 ? 0 :alphaRatio;
mSelectedItemPaint.setAlpha((int) (alphaRatio * 255));
mTextPaint.setAlpha((int) (alphaRatio * 255));
}
//开启此选项,会将越靠近中心的Item字体放大
if (mIsZoomInSelectedItem) {
if (distanceY < mItemHeight) {
float addedSize = (mItemHeight - distanceY) / (float) mItemHeight * (mSelectedItemTextSize - mTextSize);
mSelectedItemPaint.setTextSize(mTextSize + addedSize);
mTextPaint.setTextSize(mTextSize + addedSize);
} else {
mSelectedItemPaint.setTextSize(mTextSize);
mTextPaint.setTextSize(mTextSize);
}
} else {
mSelectedItemPaint.setTextSize(mTextSize);
mTextPaint.setTextSize(mTextSize);
}
String drawText = mDataFormat == null ? data.toString() : mDataFormat.format(data);
//在中间位置的Item作为被选中的。
if (distanceY < mItemHeight / 2) {
canvas.drawText(drawText, mFirstItemDrawX, itemDrawY, mSelectedItemPaint);
} else {
canvas.drawText(drawText, mFirstItemDrawX, itemDrawY, mTextPaint);
}
}
if (!TextUtils.isEmpty(mIndicatorText)) {
canvas.drawText(mIndicatorText, mFirstItemDrawX + mTextMaxWidth / 2F, mCenterItemDrawnY, mIndicatorPaint);
}
}
线条边框 矩形边框幕布
https://gitee.com/lc951/my-android
参考:https://github.com/ycuwq/DatePicker