wheelview 日期选择器地址选择器可以修改滚动的速度吗

Android(17)
首先这个选择器的原始版本来源于这里,这是仿小米做的一个效果:http://blog.csdn.net/zhongkejingwang/article/details/
然后上一张效果图,看效果图其实改动不大,因为改动的宗旨是让用户可以使用的更方便:
这个是我对这个版本的一些修改,为了更好的使用这个选择器而不必去话大量时间看代码,看实现原理,我暴露出了一些attrs里的属性,这些属性控制这个选择器的一些特性。
对原理我就不分析了,去看原作者的文章即可,我在这里说下我的改动:
首先,在初始化的时候,我加入了一些属性的获取和判断:
if (attrs != null) {
TypedArray tArray = context.obtainStyledAttributes(attrs, R.styleable.PickerView);
mColorText = tArray.getColor(R.styleable.PickerView_textColor, mColorText);
spacing = tArray.getFloat(R.styleable.PickerView_spacing, spacing);
mMaxTextAlpha = tArray.getFloat(R.styleable.PickerView_maxAlpha, mMaxTextAlpha);
mMinTextAlpha = tArray.getFloat(R.styleable.PickerView_minAlpha, mMinTextAlpha);
mMaxTextSize = tArray.getFloat(R.styleable.PickerView_maxTextSize, mMaxTextSize);
mMinTextSize = tArray.getFloat(R.styleable.PickerView_minTextSize, mMinTextSize);
tArray.recycle();
这个是定义在attrs.xml里的属性
&resources&
&declare-styleable name = &PickerView& &
&attr name = &spacing& format = &float& /&
&attr name = &minTextSize& format=&float& /&
&attr name = &maxTextSize& format=&float& /&
&attr name = &minAlpha& format=&float& /&
&attr name = &maxAlpha& format=&float& /&
&attr name = &textColor& format=&color& /&
&/declare-styleable&
&/resources&
其次是,我支持了Warp_content和Fill_parent,Match_parent的设置,在包裹内容时可以自行判断,设置默认的大小,我设置的是如果用户设置了文字的最大值,则为文字最大值的4倍,如果没有设置,则为一个默认值。
width = attrs.getAttributeValue(&/apk/res/android&, &layout_width&);
height = attrs.getAttributeValue(&/apk/res/android&, &layout_height&);
上面这两句话用来获取用户设置的宽高
final float scale = context.getResources().getDisplayMetrics().
if (width.equals(&-2&)) {
if (mMaxTextSize == 0) {
mViewHeight = (int) (160 * scale + 0.5f);
mViewWidth = (int) (80 * scale + 0.5f);
mViewHeight = (int)mMaxTextSize * 4;
mViewWidth = (int)mMaxTextSize * 2;
useDefault =
}else if(width.equals(&-1&)){
useDefault =
String[] split = width.split(&d&);
String[] split2 = height.split(&d&);
mViewHeight = (int) (Float.valueOf(split2[0]) * scale + 0.5f);
mViewWidth = (int) (Float.valueOf(split[0]) * scale + 0.5f);
useDefault =
然后这上面的是判断宽高的设定,接着我们在onmeasure里判断下,这样就能过滤掉Warp_content的设置:
if (useDefault) {
setMeasuredDimension(mViewWidth, mViewHeight);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
mViewHeight = getMeasuredHeight();
mViewWidth = getMeasuredWidth();
if ( mMinTextSize == 0) {
if (mMaxTextSize == 0 ) {
// 按照View的高度计算字体大小
mMaxTextSize = mViewHeight / 4.0f;
mMinTextSize = mMaxTextSize / 2f;
mMinTextSize = mMaxTextSize / 2f;
if (spacing == 0 || spacing & 2.5*mMaxTextSize) {
spacing = MARGIN_ALPHA * mMinTextS
看代码还可以知道,这里对没有设置最大最小字的时候重新设定了一下,而且设定了每个字的间隔,用户可以自定义,但要注意要大于最大字的2.5倍,这样主要是界面显示和滑动效果的需要。使用就在layout和MainActivity里,看一下就明白。
下载地址:
我已向原作者发起了合并的请求,欢迎大家继续fork和star。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:22486次
排名:千里之外
原创:33篇
评论:11条
Android研发工程师
我的联系方式
新浪微博:Sizon_wow
(1)(4)(2)(5)(8)(4)(10)Android基于wheelView的自定义日期选择器(可拓展式样) - Android
&&&&>>&& Android
Android基于wheelView的自定义日期选择器(可拓展样式)基于wheelView的自定义日期选择器
项目要求效果图:
要求 “6月20
星期五” 这一项作为一个整体可以滑动,”7时”、”48分”分别作为一个滑动整体。
百度了很多,试了NumberPicker等都不行,本来打算自己写。网友推荐了一个开源组件WheelView,下下来试了试,发现他已经定义的很完善了,在他的基础上拓展很容易。
现将基于wheelView自定义日期选择器记录如下:
一.首先要了解WheelView为我们提供了什么:
1. WheelView.java
可滚动的组件,
主要方法:
setAdapter(new StringWheelAdapter(dateList, 7)); //设置Adapter
setVisibleItems(3);
//设置显示几行数据
setCyclic(true);
//设置是否循环显示数据
addChangingListener(onDaysChangedListener)
//设置滑动监听器
2. WheelAdapter.java :
滑动组件的适配器的接口,子类适配器用于装载数据
public interface WheelAdapter {
* Gets items count
* the count of wheel items
public int getItemsCount();
* Gets a wheel item by index.
* index the item index
* the wheel item text or null
public String getItem(int index);
* Gets maximum item length. It is used to determine the wheel width.
* If -1 is returned there will be used the default wheel width.
* the maximum item length or -1
public int getMaximumLength();
3. OnWheelChangedListener.java : 滑动监听器接口
public interface OnWheelChangedListener {
* Callback method to be invoked when current item changed
* wheel the wheel view whose state has changed
* oldValue the old value of current item
* newValue the new value of current item
void onChanged(WheelView wheel, int oldValue, int newValue);
4.OnWheelScrollListener.java
:滚动监听器接口(暂时没用到)
5.NumericWheelAdapter.java
: 当滚动内容为纯数字时调用的适配器
package kankan.wheel.
import java.util.C
public class DateObject extends Object{
private int
private int
private int
private int
private int
private int
private String listI
* 日期对象的4个参数构造器,用于设置日期
public DateObject(int year2, int month2, int day2,int week2) {
this.year = year2;
int maxDayOfMonth = Calendar.getInstance().getActualMaximum(Calendar.DAY_OF_MONTH);
if(day2 & maxDayOfMonth){
this.month = month2 + 1;
this.day = day2 % maxDayOfM
this.month = month2;
this.day = day2;
this.week = week2 % 7 == 0 ? 7 : week2 % 7;
if(day == Calendar.getInstance().get(Calendar.DAY_OF_MONTH)){
this.listItem = String.format("%02d", this.month) +"月" + String.format("%02d", this.day)
this.listItem = String.format("%02d", this.month) +"月" + String.format("%02d", this.day)
"+ getDayOfWeekCN(week);
* 日期对象的2个参数构造器,用于设置时间
* isHourType true:传入的是 false: 传入的是minute
public DateObject(int hour2,int minute2,boolean isHourType) {
if(isHourType == true && hour2 != -1){
if(hour2 & 24){
this.hour = hour2 % 24;
this.hour = hour2;
this.listItem =
this.hour + "时";
}else if(isHourType == false && minute2 != -1){
if(minute2 & 60)
this.minute = minute2 % 60;
this.minute = minute2;
this.listItem =
this.minute + "分";
public int getHour() {
public void setHour(int hour) {
this.hour =
public int getMinute() {
public void setMinute(int minute) {
this.minute =
public int getWeek() {
public void setWeek(int week) {
this.week =
public int getYear() {
public void setYear(int year) {
this.year =
public int getMonth() {
public void setMonth(int month) {
this.month =
public int getDay() {
public void setDay(int day) {
this.day =
public String getListItem() {
return listI
public void setListItem(String listItem) {
this.listItem = listI
* 根据day_of_week得到汉字星期
public static String getDayOfWeekCN(int day_of_week){
String result = null;
switch(day_of_week){
result = "星期日";
result = "星期一";
result = "星期二";
result = "星期三";
result = "星期四";
result = "星期五";
result = "星期六";
7.StringWheelAdapter.java :一会儿将定义的滚动内容为字符串的适配器,当内容为字符串时我们就可以随意拓展滑动部分的内容
package kankan.wheel.
import java.util.ArrayL
* The simple String Array wheel adapter
public class StringWheelAdapter implements WheelAdapter {
/** The default items length */
public static final int DEFAULT_LENGTH = -1;
private ArrayList&DateObject&
private int
* Constructor
* items the items
* length the max items length
public StringWheelAdapter(ArrayList&DateObject& list, int length) {
this.list =
this.length =
public String getItem(int index) {
if (index &= 0 && index & list.size()) {
return list.get(index).getListItem();
return null;
public int getItemsCount() {
return list.size();
public int getMaximumLength() {
二.了解以后就可以使用他定义我们需要的了。
1.首先要做的是这个效果的部分:
package com.sxkeji.timeswitch.
import java.util.ArrayL
import java.util.C
import kankan.wheel.widget.DateO
import kankan.wheel.widget.OnWheelChangedL
import kankan.wheel.widget.StringWheelA
import kankan.wheel.widget.WheelV
import android.content.C
import android.util.AttributeS
import android.widget.LinearL
* 自定义的日期选择器
public class DatePicker extends LinearLayout {
private Calendar calendar = Calendar.getInstance();
private WheelView newD
private ArrayList&DateObject& dateL
private OnChangeListener onChangeL
private final int MARGIN_RIGHT = 20;
private DateObject dateO
public DatePicker(Context context) {
super(context);
init(context);
public DatePicker(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
private void init(Context context){
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH) + 1;
int day = calendar.get(Calendar.DAY_OF_MONTH);
int week = calendar.get(Calendar.DAY_OF_WEEK);
dateList = new ArrayList&DateObject&();
for (int i = 0; i & 7; i++) {
dateObject = new DateObject(year, month, day+i, week+i);
dateList.add(dateObject);
newDays = new WheelView(context);
LayoutParams newDays_param = new LayoutParams(300,LayoutParams.WRAP_CONTENT);
newDays_param.setMargins(0, 0, MARGIN_RIGHT, 0);
newDays.setLayoutParams(newDays_param);
newDays.setAdapter(new StringWheelAdapter(dateList, 7));
newDays.setVisibleItems(3);
newDays.setCyclic(true);
newDays.addChangingListener(onDaysChangedListener);
addView(newDays);
* 滑动改变监听器
private OnWheelChangedListener onDaysChangedListener = new OnWheelChangedListener(){
public void onChanged(WheelView mins, int oldValue, int newValue) {
calendar.set(Calendar.DAY_OF_MONTH, newValue + 1);
* 滑动改变监听器回调的接口
public interface OnChangeListener {
void onChange(int year, int month, int day, int day_of_week);
* 设置滑动改变监听器
* onChangeListener
public void setOnChangeListener(OnChangeListener onChangeListener){
this.onChangeListener = onChangeL
* 滑动最终调用的方法
private void change(){
if(onChangeListener!=null){
onChangeListener.onChange(
dateList.get(newDays.getCurrentItem()).getYear(),
dateList.get(newDays.getCurrentItem()).getMonth(),
dateList.get(newDays.getCurrentItem()).getDay(),
dateList.get(newDays.getCurrentItem()).getWeek());
* 根据day_of_week得到汉字星期
public static String getDayOfWeekCN(int day_of_week){
String result = null;
switch(day_of_week){
result = "星期日";
result = "星期一";
result = "星期二";
result = "星期三";
result = "星期四";
result = "星期五";
result = "星期六";
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
2.然后要做的是这个效果的部分
package com.sxkeji.timeswitch.
import java.util.ArrayL
import java.util.C
import kankan.wheel.widget.DateO
import kankan.wheel.widget.OnWheelChangedL
import kankan.wheel.widget.StringWheelA
import kankan.wheel.widget.WheelV
import android.content.C
import android.util.AttributeS
import android.widget.LinearL
* 自定义的时间选择器
public class TimePicker extends LinearLayout{
private Calendar calendar = Calendar.getInstance();
private WheelView hours,
private OnChangeListener onChangeL
private final int MARGIN_RIGHT = 15;
private ArrayList&DateObject& hourList,minuteL
private DateObject dateO
public TimePicker(Context context) {
super(context);
init(context);
public TimePicker(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
private void init(Context context){
int hour = calendar.get(Calendar.HOUR_OF_DAY);
int minute = calendar.get(Calendar.MINUTE);
hourList = new ArrayList&DateObject&();
minuteList = new ArrayList&DateObject&();
for (int i = 0; i & 24; i++) {
dateObject = new DateObject(hour+i,-1,true);
hourList.add(dateObject);
for (int j = 0; j & 60; j++) {
dateObject = new DateObject(-1,minute+j,false);
minuteList.add(dateObject);
hours = new WheelView(context);
LayoutParams lparams_hours = new LayoutParams(80,LayoutParams.WRAP_CONTENT);
lparams_hours.setMargins(0, 0, MARGIN_RIGHT, 0);
hours.setLayoutParams(lparams_hours);
hours.setAdapter(new StringWheelAdapter(hourList, 24));
hours.setVisibleItems(3);
hours.setCyclic(true);
hours.addChangingListener(onHoursChangedListener);
addView(hours);
mins = new WheelView(context);
mins.setLayoutParams(new LayoutParams(80,LayoutParams.WRAP_CONTENT));
mins.setAdapter(new StringWheelAdapter(minuteList,60));
mins.setVisibleItems(3);
mins.setCyclic(true);
mins.addChangingListener(onMinsChangedListener);
addView(mins);
private OnWheelChangedListener onHoursChangedListener = new OnWheelChangedListener(){
public void onChanged(WheelView hours, int oldValue, int newValue) {
calendar.set(Calendar.HOUR_OF_DAY, newValue);
private OnWheelChangedListener onMinsChangedListener = new OnWheelChangedListener(){
public void onChanged(WheelView mins, int oldValue, int newValue) {
calendar.set(Calendar.MINUTE, newValue);
* 滑动改变监听器回调的接口
public interface OnChangeListener {
void onChange(int hour, int munite);
* 设置滑动改变监听器
* onChangeListener
public void setOnChangeListener(OnChangeListener onChangeListener){
this.onChangeListener = onChangeL
* 滑动最终调用的方法
private void change(){
if(onChangeListener!=null){
onChangeListener.onChange(getHourOfDay(), getMinute());
* 获取小时
public int getHourOfDay(){
return hourList.get(hours.getCurrentItem()).getHour();
* 获取分钟
public int getMinute(){
return minuteList.get(mins.getCurrentItem()).getMinute();
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
3.z最后就可以直接使用了,我这里主界面是一个button,点击后弹出popupWindow显示日期选择器。布局文件及主Activity如下:
popupWindow布局文件:
&?xml version="1.0" encoding="utf-8"?&
xmlns:android="/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:background="#FFF"&
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#f5f5f5"/&
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="10dp"&
android:id="@+id/tv_cancel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="取消"
android:layout_marginLeft="10dp"
android:layout_alignParentLeft="true"
android:textColor="#000000"
android:textSize="20sp" /&
android:id="@+id/tv_ok"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="确定"
android:layout_marginRight="10dp"
android:layout_alignParentRight="true"
android:textColor="#000000"
android:textSize="20sp" /&
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#f5f5f5"/&
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_marginTop="10dp"
android:padding="20dp"&
android:id="@+id/dp_test"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="3"
android:gravity="center"
android:layout_gravity="center_horizontal"/&
android:id="@+id/tp_test"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:gravity="center"
android:layout_gravity="center_horizontal"/&
主界面布局文件:
&?xml version="1.0" encoding="utf-8"?&
xmlns:android="/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#FFF"
android:id="@+id/Rl_all"&
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_alignParentBottom="true"
android:padding="10dp"
android:gravity="center"&
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#f5f5f5"/&
android:id="@+id/btn_naozhong"
android:layout_width="30dp"
android:layout_height="30dp"
android:background="@drawable/naozhong"
Activity代码:
package com.sxkeji.timeswitch.
import java.util.C
import org.unism.wang.R;
import com.sxkeji.timeswitch.widget.DateP
import com.sxkeji.timeswitch.widget.TimeP
import android.app.A
import android.os.B
import android.view.G
import android.view.V
import android.view.View.OnClickL
import android.widget.B
import android.widget.LinearL
import android.widget.PopupW
import android.widget.RelativeL
import android.widget.TextV
import android.widget.T
public class MyPickerActivity extends Activity {
private DatePicker dp_
private TimePicker tp_
private TextView tv_ok,tv_
private Button btn_
private PopupW
private String selectDate,selectT
private int currentHour,currentMinute,currentDay,selectHour,selectMinute,selectD
private RelativeLayout Rl_
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Rl_all = (RelativeLayout) findViewById(R.id.Rl_all);
btn_naozhong = (Button) findViewById(R.id.btn_naozhong);
calendar = Calendar.getInstance();
btn_naozhong.setOnClickListener(new OnClickListener() {
public void onClick(View arg0) {
View view = View.inflate(MyPickerActivity.this, R.layout.dialog_select_time, null);
selectDate = calendar.get(Calendar.YEAR) + "年" + calendar.get(Calendar.MONTH) + "月"
+ calendar.get(Calendar.DAY_OF_MONTH) + "日"
+ DatePicker.getDayOfWeekCN(calendar.get(Calendar.DAY_OF_WEEK));
selectDay = currentDay = calendar.get(Calendar.DAY_OF_MONTH);
selectMinute = currentMinute = calendar.get(Calendar.MINUTE);
selectHour = currentHour = calendar.get(Calendar.HOUR_OF_DAY);
selectTime = currentHour + "点" + ((currentMinute & 10)?("0"+currentMinute):currentMinute) + "分";
dp_test = (DatePicker)view.findViewById(R.id.dp_test);
tp_test = (TimePicker)view.findViewById(R.id.tp_test);
tv_ok = (TextView) view.findViewById(R.id.tv_ok);
tv_cancel = (TextView) view.findViewById(R.id.tv_cancel);
dp_test.setOnChangeListener(dp_onchanghelistener);
tp_test.setOnChangeListener(tp_onchanghelistener);
pw = new PopupWindow(view, LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT, true);
pw.showAtLocation(Rl_all, 0, 0,
Gravity.END);
tv_ok.setOnClickListener(new OnClickListener() {
public void onClick(View arg0) {
if(selectDay == currentDay ){
if(selectHour & currentHour){
Toast.makeText(getApplicationContext(), "不能选择过去的时间\n
请重新选择", 0).show();
}else if( (selectHour == currentHour) && (selectMinute & currentMinute) ){
Toast.makeText(getApplicationContext(), "不能选择过去的时间\n
请重新选择", 0).show();
Toast.makeText(getApplicationContext(), selectDate+selectTime, 0).show();
pw.dismiss();
Toast.makeText(getApplicationContext(), selectDate+selectTime, 0).show();
pw.dismiss();
tv_cancel.setOnClickListener(new OnClickListener() {
public void onClick(View arg0) {
pw.dismiss();
DatePicker.OnChangeListener dp_onchanghelistener = new DatePicker.OnChangeListener() {
public void onChange(int year, int month, int day, int day_of_week) {
selectDay =
selectDate = year + "年" + month + "月" + day + "日" + DatePicker.getDayOfWeekCN(day_of_week);
TimePicker.OnChangeListener tp_onchanghelistener = new TimePicker.OnChangeListener() {
public void onChange(int hour, int minute) {
selectTime = hour + "点" + ((minute & 10)?("0"+minute):minute) + "分";
selectHour =
selectMinute =
最终效果图:
完整demo下载地址1000人阅读
android(14)
& & & & 以前写过一个基于WheelView的时间选择器其实WheelView不仅仅可以用来做时间控件,大家肯定也见过用它做的城市选择控件,身高选择控件等等。先看几个网上找到的图片:
& & & & &这只是几个控件,图上的每一个可以滑动的Veiw都是一个WheelView,大家完全可以把它当作一个ListView来看。用我们平时写ListView的思维去写它,在配合PopupWindow你会发你能实现各种各样的弹出的滚动控件。现其实其内部也是参考了ListView的源码,相当于重写了一个ListView。
& & & & 先看一下其基本用法:
&com.chs.widgets.wheelview.WheelView
android:id=&@+id/wl_ymd&
android:layout_width=&wrap_content&
android:layout_height=&wrap_content&
android:layout_marginRight=&15dp&/&
activity中:
WheelView wl_hour = (WheelView) view.findViewById(R.id.wl_hour);
NumericWheelAdapter numericAdapter1 = new NumericWheelAdapter(this, 0, 23,&%02d&);
numericAdapter1.setLabel(&
numericAdapter1.setTextSize(20);
wl_hour.setViewAdapter(numericAdapter1);
wl_hour.setCyclic(true);// 可循环滚动
wl_hour.addChangingListener(new OnWheelChangedListener() {
public void onChanged(WheelView wheel, int oldValue, int newValue) {
就这么几行代码,一个简单的0到23的滚动控件就实现了,当然我们也可以将它放在PopupWindow中,在屏幕任何地方弹出。
我们看一下WheelView代码的结构:
我们从上往下说先看adapter,其中AbstractWheelAdapter,AbstractWheelTextAdapter,WheelViewAdapter 这三个类是抽象类
和接口定义了一些公用的方法和一些必须实现的。就像我们平时用ListView的adapter时的getCount(),getView() 之类的方法。而我们
最常用到的就是另外两个ArrayWheelAdapter和NumericWheelAdapter了,它俩都是上面抽象类和接口的实现类。理论上讲我们也可以自
己自定义一个实现类,这就不先探讨了。因为上面两个adapter可以实现很多需求了。
先说NumericWheelAdapter。这个主要是处理数字的,当我们传入两个数值,一个开始值和一个结束值,它内部就会帮我们创建结束值
减开始值加1的item。
NumericWheelAdapter numericAdapter1 = new NumericWheelAdapter(this, 0, 23,&%02d&);最后一个值是format格式化。比如我们想让我们的1显示为01 就可以传入上面的格式化String。
再看ArrayWheelAdapter。
public ArrayWheelAdapter(Context context, T items[]) {
super(context);
//setEmptyItemResource(TEXT_VIEW_ITEM_RESOURCE);
this.items =
这个adapter就跟ListView的adapter一样了,我们可以传入任意类型的数组。 public View getView(int resource, ViewGroup parent) {
switch (resource) {
case NO_RESOURCE:
case TEXT_VIEW_ITEM_RESOURCE:
TextView textView = new TextView(context);
textView.setPadding(0,20,0,20);
return textV
return inflater.inflate(resource, parent, false);
}看上面的代码默认的布局是一个TextView我们也可以传入我们自己的布局这样一想是不是可以做各种各样的滚动视图啦。
接着看下面的onWheelViewChangedListener,onWheelViewClickedListener,onWheelViewScrollListener 这是三个事件的监听看名字就知道是滑动完成,点击,和滑动时的监听。我们可以实现来完成我们自己的业务逻辑。
ItemsRange和WheelViewRecycle是两个非常重要的类。ItemsRange是可见的范围,WheelViewRecycle则是保存我们创建出的View当视图不可见的时候可以重用View增加效率。
WheelScroller内部定义个手势的监听,在WheelView中将时间event传过来,可以处理我们滑动的时的各种状态。
最后就是我们的主View,WheelView了。这就是一个自定义的View啦。大体就是首先将一个LinearLayout布到里面,之后,将adapter中的itemView获取后放入LinearLayout中。
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (viewAdapter != null && viewAdapter.getItemsCount() & 0) {
updateView();//更新视图。重建项目和标签如果有必要,重新计算物品的大小
drawCenterRect(canvas);//为当前值绘制矩形 就是中间的线
drawItems(canvas);// 绘制item
if (drawShadows) drawShadows(canvas);//绘制头部和底部的阴影
OK结束。用的时候我们可以把它放在activity中也可以放在PopupWindow中在PopupWindow中我们就可以随便怎么弹出啦。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:10510次
排名:千里之外
原创:45篇
(7)(4)(2)(1)(1)(3)(4)(7)(8)(5)(1)(1)(2)(1)

我要回帖

更多关于 textview 滚动速度 的文章

 

随机推荐