From 9590a8924e3fbad72f3985a9f84fa472969d1a0d Mon Sep 17 00:00:00 2001
From: xuxiuxi <xuxiuxi@454eff88-639b-444f-9e54-f578c98de674>
Date: 星期三, 03 五月 2017 11:11:48 +0800
Subject: [PATCH] 

---
 VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/widget/WheelViewDialog.java     |  302 +++++++
 VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/widget/IWheelView.java          |   96 ++
 VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/adapter/ArrayWheelAdapter.java  |   53 +
 VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/widget/WheelView.java           |  707 ++++++++++++++++++
 VisitFace/DemoForBsk/app/src/main/res/layout/dialog_country.xml                                           |   10 
 VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/graphics/WheelDrawable.java     |   70 +
 VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/common/WheelData.java           |   71 +
 VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/graphics/CommonDrawable.java    |  101 ++
 VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/graphics/DrawableFactory.java   |   41 +
 VisitFace/DemoForBsk/app/src/main/res/layout/dialog_date_select.xml                                       |    8 
 VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/common/WheelConstants.java      |  127 +++
 VisitFace/DemoForBsk/app/src/main/res/layout/dialog_select.xml                                            |   13 
 VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/AddDialog.java                            |    4 
 VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/SelectDialog.java                         |    4 
 VisitFace/DemoForBsk/app/src/main/res/layout/dialog_add.xml                                               |    4 
 VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/adapter/SimpleWheelAdapter.java |   50 +
 VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/common/WheelViewException.java  |   40 +
 VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/adapter/BaseWheelAdapter.java   |  168 ++++
 VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/util/WheelUtils.java            |  100 ++
 VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/widget/WheelItem.java           |  111 ++
 VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/CountryDialog.java                        |    2 
 VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/MyWheelView.java                          |   24 
 VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/widget/NestedScrollView.java    |   63 +
 VisitFace/DemoForBsk/app/src/main/res/layout/dialog_row.xml                                               |    2 
 VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/graphics/HoloDrawable.java      |   68 +
 25 files changed, 2,218 insertions(+), 21 deletions(-)

diff --git a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/AddDialog.java b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/AddDialog.java
index 7c07784..b8746a7 100644
--- a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/AddDialog.java
+++ b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/AddDialog.java
@@ -18,8 +18,8 @@
 import com.lidroid.xutils.ViewUtils;
 import com.lidroid.xutils.view.annotation.ViewInject;
 import com.lidroid.xutils.view.annotation.event.OnClick;
-import com.wx.wheelview.adapter.BaseWheelAdapter;
-import com.wx.wheelview.widget.WheelView;
+import cn.com.basic.face.dialog.wheelview.adapter.BaseWheelAdapter;
+import cn.com.basic.face.dialog.wheelview.widget.WheelView;
 
 import java.util.ArrayList;
 import java.util.List;
diff --git a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/CountryDialog.java b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/CountryDialog.java
index 4dee775..e2eb339 100644
--- a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/CountryDialog.java
+++ b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/CountryDialog.java
@@ -18,7 +18,7 @@
 import com.lidroid.xutils.ViewUtils;
 import com.lidroid.xutils.view.annotation.ViewInject;
 import com.lidroid.xutils.view.annotation.event.OnClick;
-import com.wx.wheelview.widget.WheelView;
+import cn.com.basic.face.dialog.wheelview.widget.WheelView;
 
 import java.util.ArrayList;
 import java.util.HashMap;
diff --git a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/MyWheelView.java b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/MyWheelView.java
new file mode 100644
index 0000000..bf5ae60
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/MyWheelView.java
@@ -0,0 +1,24 @@
+package cn.com.basic.face.dialog;
+
+import android.content.Context;
+import android.util.AttributeSet;
+
+import cn.com.basic.face.dialog.wheelview.widget.WheelView;
+
+public class MyWheelView extends WheelView {
+    public MyWheelView(Context context) {
+        super(context);
+    }
+
+    public MyWheelView(Context context, WheelViewStyle style) {
+        super(context, style);
+    }
+
+    public MyWheelView(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    public MyWheelView(Context context, AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+    }
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/SelectDialog.java b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/SelectDialog.java
index cedd08e..18166fe 100644
--- a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/SelectDialog.java
+++ b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/SelectDialog.java
@@ -22,8 +22,8 @@
 import com.lidroid.xutils.ViewUtils;
 import com.lidroid.xutils.view.annotation.ViewInject;
 import com.lidroid.xutils.view.annotation.event.OnClick;
-import com.wx.wheelview.adapter.BaseWheelAdapter;
-import com.wx.wheelview.widget.WheelView;
+import cn.com.basic.face.dialog.wheelview.adapter.BaseWheelAdapter;
+import cn.com.basic.face.dialog.wheelview.widget.WheelView;
 
 import java.util.ArrayList;
 import java.util.List;
diff --git a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/adapter/ArrayWheelAdapter.java b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/adapter/ArrayWheelAdapter.java
new file mode 100644
index 0000000..43b126c
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/adapter/ArrayWheelAdapter.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2016 venshine.cn@gmail.com
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package cn.com.basic.face.dialog.wheelview.adapter;
+
+import android.content.Context;
+import android.view.View;
+import android.view.ViewGroup;
+
+import cn.com.basic.face.dialog.wheelview.adapter.*;
+import cn.com.basic.face.dialog.wheelview.widget.WheelItem;
+
+/**
+ * 婊氳疆鏁扮粍閫傞厤鍣�
+ *
+ * @author venshine
+ */
+public class ArrayWheelAdapter<T> extends cn.com.basic.face.dialog.wheelview.adapter.BaseWheelAdapter<T> {
+
+    private Context mContext;
+
+    public ArrayWheelAdapter(Context context) {
+        mContext = context;
+    }
+
+    @Override
+    public View bindView(int position, View convertView, ViewGroup parent) {
+        if (convertView == null) {
+            convertView = new WheelItem(mContext);
+        }
+        WheelItem wheelItem = (WheelItem) convertView;
+        T item = getItem(position);
+        if (wheelItem instanceof CharSequence) {
+            wheelItem.setText((CharSequence) item);
+        } else {
+            wheelItem.setText(item.toString());
+        }
+        return convertView;
+    }
+
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/adapter/BaseWheelAdapter.java b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/adapter/BaseWheelAdapter.java
new file mode 100644
index 0000000..c1624ba
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/adapter/BaseWheelAdapter.java
@@ -0,0 +1,168 @@
+/*
+ * Copyright (C) 2016 venshine.cn@gmail.com
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package cn.com.basic.face.dialog.wheelview.adapter;
+
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+
+import cn.com.basic.face.dialog.wheelview.util.WheelUtils;
+import cn.com.basic.face.dialog.wheelview.widget.IWheelView;
+
+import java.util.List;
+
+/**
+ * 婊氳疆鎶借薄鏁版嵁閫傞厤鍣�
+ *
+ * @author venshine
+ */
+public abstract class BaseWheelAdapter<T> extends BaseAdapter {
+
+    protected List<T> mList = null;
+
+    protected boolean mLoop = IWheelView.LOOP;
+
+    protected int mWheelSize = IWheelView.WHEEL_SIZE;
+
+    protected boolean mClickable = IWheelView.CLICKABLE;
+
+    private int mCurrentPositon = -1;
+
+    protected abstract View bindView(int position, View convertView, ViewGroup parent);
+
+    /**
+     * 璁剧疆褰撳墠鍒诲害
+     *
+     * @param position
+     */
+    public final void setCurrentPosition(int position) {
+        mCurrentPositon = position;
+    }
+
+    @Override
+    public final int getCount() {
+        if (mLoop) {
+            return Integer.MAX_VALUE;
+        }
+        return !WheelUtils.isEmpty(mList) ? (mList.size() + mWheelSize - 1) : 0;
+    }
+
+    @Override
+    public final long getItemId(int position) {
+        return !WheelUtils.isEmpty(mList) ? position % mList.size() : position;
+    }
+
+    @Override
+    public final T getItem(int position) {
+        return !WheelUtils.isEmpty(mList) ? mList.get(position % mList.size()) : null;
+    }
+
+    @Override
+    public boolean areAllItemsEnabled() {
+        return mClickable ? false : true;
+    }
+
+    @Override
+    public boolean isEnabled(int position) {
+        if (mClickable) {
+            if (mLoop) {
+                if (position % mList.size() == mCurrentPositon) {
+                    return true;
+                }
+            } else {
+                if (position == (mCurrentPositon + mWheelSize / 2)) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public final View getView(int position, View convertView, ViewGroup parent) {
+        if (mLoop) {
+            position = position % mList.size();
+        } else {
+            if (position < mWheelSize / 2) {
+                position = -1;
+            } else if (position >= mWheelSize / 2 + mList.size()) {
+                position = -1;
+            } else {
+                position = position - mWheelSize / 2;
+            }
+        }
+        View view;
+        if (position == -1) {
+            view = bindView(0, convertView, parent);
+        } else {
+            view = bindView(position, convertView, parent);
+        }
+        if (!mLoop) {
+            if (position == -1) {
+                view.setVisibility(View.INVISIBLE);
+            } else {
+                view.setVisibility(View.VISIBLE);
+            }
+        }
+        return view;
+    }
+
+    public final BaseWheelAdapter setClickable(boolean clickable) {
+        if (clickable != mClickable) {
+            mClickable = clickable;
+            super.notifyDataSetChanged();
+        }
+        return this;
+    }
+
+    public final BaseWheelAdapter setLoop(boolean loop) {
+        if (loop != mLoop) {
+            mLoop = loop;
+            super.notifyDataSetChanged();
+        }
+        return this;
+    }
+
+    public final BaseWheelAdapter setWheelSize(int wheelSize) {
+        mWheelSize = wheelSize;
+        super.notifyDataSetChanged();
+        return this;
+    }
+
+    public final BaseWheelAdapter setData(List<T> list) {
+        mList = list;
+        super.notifyDataSetChanged();
+        return this;
+    }
+
+    /**
+     * 鏁版嵁宸叉敼鍙橈紝閲嶇粯鍙鍖哄煙
+     */
+    @Override
+    @Deprecated
+    public final void notifyDataSetChanged() {
+        super.notifyDataSetChanged();
+    }
+
+    /**
+     * 鏁版嵁澶辨晥锛岄噸缁樻帶浠�
+     */
+    @Override
+    @Deprecated
+    public final void notifyDataSetInvalidated() {
+        super.notifyDataSetInvalidated();
+    }
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/adapter/SimpleWheelAdapter.java b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/adapter/SimpleWheelAdapter.java
new file mode 100644
index 0000000..6b5bda0
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/adapter/SimpleWheelAdapter.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2016 venshine.cn@gmail.com
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package cn.com.basic.face.dialog.wheelview.adapter;
+
+import android.content.Context;
+import android.view.View;
+import android.view.ViewGroup;
+
+import cn.com.basic.face.dialog.wheelview.adapter.*;
+import cn.com.basic.face.dialog.wheelview.common.WheelData;
+import cn.com.basic.face.dialog.wheelview.widget.WheelItem;
+
+/**
+ * 婊氳疆鍥剧墖鍜屾枃鏈�傞厤鍣�
+ *
+ * @author venshine
+ */
+public class SimpleWheelAdapter extends cn.com.basic.face.dialog.wheelview.adapter.BaseWheelAdapter<WheelData> {
+
+    private Context mContext;
+
+    public SimpleWheelAdapter(Context context) {
+        mContext = context;
+    }
+
+    @Override
+    public View bindView(int position, View convertView, ViewGroup parent) {
+        if (convertView == null) {
+            convertView = new WheelItem(mContext);
+        }
+        WheelItem item = (WheelItem) convertView;
+        item.setImage(mList.get(position).getId());
+        item.setText(mList.get(position).getName());
+        return convertView;
+    }
+
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/common/WheelConstants.java b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/common/WheelConstants.java
new file mode 100644
index 0000000..432f943
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/common/WheelConstants.java
@@ -0,0 +1,127 @@
+/*
+ * Copyright (C) 2016 venshine.cn@gmail.com
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package cn.com.basic.face.dialog.wheelview.common;
+
+import android.graphics.Color;
+
+/**
+ * 婊氳疆甯搁噺绫�
+ *
+ * @author venshine
+ */
+public class WheelConstants {
+
+    /**
+     * 婊氳疆tag
+     */
+    public static final String TAG = "com.wx.wheelview";
+
+    /**
+     * 婊氳疆姣忎竴椤圭殑鍐呰竟璺�
+     */
+    public static final int WHEEL_ITEM_PADDING = 20;
+
+    /**
+     * 婊氳疆姣忎竴椤圭殑鍐呴儴鎺т欢澶栬竟璺�
+     */
+    public static final int WHEEL_ITEM_MARGIN = 20;
+
+    /**
+     * 婊氳疆姣忎竴椤圭殑鍥剧墖TAG
+     */
+    public static final int WHEEL_ITEM_IMAGE_TAG = 100;
+
+    /**
+     * 婊氳疆姣忎竴椤圭殑鏂囨湰TAG
+     */
+    public static final int WHEEL_ITEM_TEXT_TAG = 101;
+
+    /**
+     * 骞虫粦婊氬姩鎸佺画鏃堕棿
+     */
+    public static final int WHEEL_SMOOTH_SCROLL_DURATION = 50;
+
+    /**
+     * 榛樿鑳屾櫙
+     */
+    public static final int WHEEL_BG = Color.WHITE;
+
+    /**
+     * common鐨偆榛樿鑳屾櫙
+     */
+    public static final int WHEEL_SKIN_COMMON_BG = Color.parseColor("#dddddd");
+
+    /**
+     * holo鐨偆榛樿鑳屾櫙
+     */
+    public static final int WHEEL_SKIN_HOLO_BG = Color.WHITE;
+
+    /**
+     * holo鐨偆榛樿閫変腑妗嗛鑹�
+     */
+    public static final int WHEEL_SKIN_HOLO_BORDER_COLOR = Color.parseColor("#83cde6");
+
+    /**
+     * 婊氳疆item楂樺害
+     */
+    public static final int WHEEL_ITEM_HEIGHT = 45;
+
+    /**
+     * 婊氳疆榛樿鏂囨湰棰滆壊
+     */
+    public static final int WHEEL_TEXT_COLOR = Color.BLACK;
+
+    /**
+     * 婊氳疆榛樿鏂囨湰澶у皬
+     */
+    public static final int WHEEL_TEXT_SIZE = 16;
+
+    /**
+     * 婊氳疆榛樿鏂囨湰閫忔槑搴�
+     */
+    public static final float WHEEL_TEXT_ALPHA = 0.7f;
+
+    /**
+     * common鐨偆榛樿閫変腑妗嗛鑹�
+     */
+    public static final int WHEEL_SKIN_COMMON_COLOR = Color.parseColor("#f0cfcfcf");
+
+    /**
+     * common鐨偆閫変腑妗哾ivider棰滆壊
+     */
+    public static final int WHEEL_SKIN_COMMON_DIVIDER_COLOR = Color.parseColor("#b5b5b5");
+
+    /**
+     * common鐨偆宸﹀彸杈规棰滆壊
+     */
+    public static final int WHEEL_SKIN_COMMON_BORDER_COLOR = Color.parseColor("#666666");
+
+    /**
+     * 婊氳疆婊戝姩鏃跺睍绀洪�変腑椤�
+     */
+    public static final int WHEEL_SCROLL_HANDLER_WHAT = 0x0100;
+
+    /**
+     * 婊氳疆婊戝姩鏃跺睍绀洪�変腑椤瑰欢杩熸椂闂�
+     */
+    public static final int WHEEL_SCROLL_DELAY_DURATION = 300;
+
+    /**
+     * dialog榛樿棰滆壊
+     */
+    public static final int DIALOG_WHEEL_COLOR = WHEEL_SKIN_HOLO_BORDER_COLOR;
+
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/common/WheelData.java b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/common/WheelData.java
new file mode 100644
index 0000000..e89523a
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/common/WheelData.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2016 venshine.cn@gmail.com
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package cn.com.basic.face.dialog.wheelview.common;
+
+import java.io.Serializable;
+
+/**
+ * 婊氳疆鏁版嵁
+ *
+ * @author venshine
+ */
+public class WheelData implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 璧勬簮id
+     */
+    private int id;
+
+    /**
+     * 鏁版嵁鍚嶇О
+     */
+    private String name;
+
+    public WheelData() {
+    }
+
+    public WheelData(int id, String name) {
+        this.id = id;
+        this.name = name;
+    }
+
+    public int getId() {
+        return id;
+    }
+
+    public void setId(int id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    @Override
+    public String toString() {
+        final StringBuilder sb = new StringBuilder("WheelData{");
+        sb.append("id=").append(id);
+        sb.append(", name='").append(name).append('\'');
+        sb.append('}');
+        return sb.toString();
+    }
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/common/WheelViewException.java b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/common/WheelViewException.java
new file mode 100644
index 0000000..9d7bd04
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/common/WheelViewException.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2016 venshine.cn@gmail.com
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package cn.com.basic.face.dialog.wheelview.common;
+
+/**
+ * 婊氳疆寮傚父绫�
+ *
+ * @author venshine
+ */
+public class WheelViewException extends RuntimeException {
+
+    public WheelViewException() {
+        super();
+    }
+
+    public WheelViewException(String detailMessage) {
+        super(detailMessage);
+    }
+
+    public WheelViewException(String detailMessage, Throwable throwable) {
+        super(detailMessage, throwable);
+    }
+
+    public WheelViewException(Throwable throwable) {
+        super(throwable);
+    }
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/graphics/CommonDrawable.java b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/graphics/CommonDrawable.java
new file mode 100644
index 0000000..c43ce33
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/graphics/CommonDrawable.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2016 venshine.cn@gmail.com
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package cn.com.basic.face.dialog.wheelview.graphics;
+
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.drawable.GradientDrawable;
+
+import cn.com.basic.face.dialog.wheelview.common.WheelConstants;
+import cn.com.basic.face.dialog.wheelview.graphics.*;
+import cn.com.basic.face.dialog.wheelview.widget.WheelView;
+
+/**
+ * common婊氳疆鏍峰紡
+ *
+ * @author venshine
+ */
+public class CommonDrawable extends cn.com.basic.face.dialog.wheelview.graphics.WheelDrawable {
+
+    private static final int[] SHADOWS_COLORS =
+            {
+                    0xFF111111,
+                    0x00AAAAAA,
+                    0x00AAAAAA
+            };  // 闃村奖鑹插��
+
+    private GradientDrawable mTopShadow = new GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM,
+            SHADOWS_COLORS);    // 椤堕儴闃村奖
+
+    private GradientDrawable mBottomShadow = new GradientDrawable(GradientDrawable.Orientation.BOTTOM_TOP,
+            SHADOWS_COLORS);    // 搴曢儴闃村奖
+
+    private Paint mCommonBgPaint, mCommonPaint, mCommonDividerPaint, mCommonBorderPaint;
+
+    private int mWheelSize, mItemH;
+
+    public CommonDrawable(int width, int height, WheelView.WheelViewStyle style, int wheelSize, int itemH) {
+        super(width, height, style);
+        mWheelSize = wheelSize;
+        mItemH = itemH;
+        init();
+    }
+
+    private void init() {
+        mCommonBgPaint = new Paint();
+        mCommonBgPaint.setColor(mStyle.backgroundColor != -1 ? mStyle.backgroundColor : WheelConstants
+                .WHEEL_SKIN_COMMON_BG);
+
+        mCommonPaint = new Paint();
+        mCommonPaint.setColor(WheelConstants.WHEEL_SKIN_COMMON_COLOR);
+
+        mCommonDividerPaint = new Paint();
+        mCommonDividerPaint.setColor(WheelConstants.WHEEL_SKIN_COMMON_DIVIDER_COLOR);
+        mCommonDividerPaint.setStrokeWidth(2);
+
+        mCommonBorderPaint = new Paint();
+        mCommonBorderPaint.setStrokeWidth(6);
+        mCommonBorderPaint.setColor(WheelConstants.WHEEL_SKIN_COMMON_BORDER_COLOR);
+
+    }
+
+    @Override
+    public void draw(Canvas canvas) {
+        // draw background
+        canvas.drawRect(0, 0, mWidth, mHeight, mCommonBgPaint);
+
+        // draw select border
+        if (mItemH != 0) {
+            canvas.drawRect(0, mItemH * (mWheelSize / 2), mWidth, mItemH
+                    * (mWheelSize / 2 + 1), mCommonPaint);
+            canvas.drawLine(0, mItemH * (mWheelSize / 2), mWidth, mItemH
+                    * (mWheelSize / 2), mCommonDividerPaint);
+            canvas.drawLine(0, mItemH * (mWheelSize / 2 + 1), mWidth, mItemH
+                    * (mWheelSize / 2 + 1), mCommonDividerPaint);
+
+            // top, bottom
+            mTopShadow.setBounds(0, 0, mWidth, mItemH);
+            mTopShadow.draw(canvas);
+
+            mBottomShadow.setBounds(0, mHeight - mItemH, mWidth, mHeight);
+            mBottomShadow.draw(canvas);
+
+            // left,right
+            canvas.drawLine(0, 0, 0, mHeight, mCommonBorderPaint);
+            canvas.drawLine(mWidth, 0, mWidth, mHeight, mCommonBorderPaint);
+        }
+    }
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/graphics/DrawableFactory.java b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/graphics/DrawableFactory.java
new file mode 100644
index 0000000..aaed69e
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/graphics/DrawableFactory.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2016 venshine.cn@gmail.com
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package cn.com.basic.face.dialog.wheelview.graphics;
+
+import android.graphics.drawable.Drawable;
+
+import cn.com.basic.face.dialog.wheelview.graphics.*;
+import cn.com.basic.face.dialog.wheelview.graphics.HoloDrawable;
+import cn.com.basic.face.dialog.wheelview.graphics.WheelDrawable;
+import cn.com.basic.face.dialog.wheelview.widget.WheelView;
+
+/**
+ * @author venshine
+ */
+public class DrawableFactory {
+
+    public static Drawable createDrawable(WheelView.Skin skin, int width, int height, WheelView.WheelViewStyle
+            style, int wheelSize, int itemH) {
+        if (skin.equals(WheelView.Skin.Common)) {
+            return new cn.com.basic.face.dialog.wheelview.graphics.CommonDrawable(width, height, style, wheelSize, itemH);
+        } else if (skin.equals(WheelView.Skin.Holo)) {
+            return new HoloDrawable(width, height, style, wheelSize, itemH);
+        } else {
+            return new WheelDrawable(width, height, style);
+        }
+    }
+
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/graphics/HoloDrawable.java b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/graphics/HoloDrawable.java
new file mode 100644
index 0000000..73ed844
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/graphics/HoloDrawable.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2016 venshine.cn@gmail.com
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package cn.com.basic.face.dialog.wheelview.graphics;
+
+import android.graphics.Canvas;
+import android.graphics.Paint;
+
+import cn.com.basic.face.dialog.wheelview.common.WheelConstants;
+import cn.com.basic.face.dialog.wheelview.graphics.WheelDrawable;
+import cn.com.basic.face.dialog.wheelview.widget.WheelView;
+
+/**
+ * holo婊氳疆鏍峰紡
+ *
+ * @author venshine
+ */
+public class HoloDrawable extends WheelDrawable {
+
+    private Paint mHoloBgPaint, mHoloPaint;
+
+    private int mWheelSize, mItemH;
+
+    public HoloDrawable(int width, int height, WheelView.WheelViewStyle style, int wheelSize, int itemH) {
+        super(width, height, style);
+        mWheelSize = wheelSize;
+        mItemH = itemH;
+        init();
+    }
+
+    private void init() {
+        mHoloBgPaint = new Paint();
+        mHoloBgPaint.setColor(mStyle.backgroundColor != -1 ? mStyle.backgroundColor : WheelConstants
+                .WHEEL_SKIN_HOLO_BG);
+
+        mHoloPaint = new Paint();
+        mHoloPaint.setStrokeWidth(mStyle.holoBorderWidth != -1 ? mStyle.holoBorderWidth : 3);
+        mHoloPaint.setColor(mStyle.holoBorderColor != -1 ? mStyle.holoBorderColor : WheelConstants
+                .WHEEL_SKIN_HOLO_BORDER_COLOR);
+    }
+
+
+    @Override
+    public void draw(Canvas canvas) {
+        // draw background
+        canvas.drawRect(0, 0, mWidth, mHeight, mHoloBgPaint);
+
+        // draw select border
+        if (mItemH != 0) {
+            canvas.drawLine(0, mItemH * (mWheelSize / 2), mWidth, mItemH
+                    * (mWheelSize / 2), mHoloPaint);
+            canvas.drawLine(0, mItemH * (mWheelSize / 2 + 1), mWidth, mItemH
+                    * (mWheelSize / 2 + 1), mHoloPaint);
+        }
+    }
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/graphics/WheelDrawable.java b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/graphics/WheelDrawable.java
new file mode 100644
index 0000000..4ba54a6
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/graphics/WheelDrawable.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2016 venshine.cn@gmail.com
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package cn.com.basic.face.dialog.wheelview.graphics;
+
+import android.graphics.Canvas;
+import android.graphics.ColorFilter;
+import android.graphics.Paint;
+import android.graphics.drawable.Drawable;
+
+import cn.com.basic.face.dialog.wheelview.common.WheelConstants;
+import cn.com.basic.face.dialog.wheelview.widget.WheelView;
+
+/**
+ * 婊氳疆鏍峰紡
+ *
+ * @author venshine
+ */
+public class WheelDrawable extends Drawable {
+
+    protected int mWidth;   // 鎺т欢瀹�
+
+    protected int mHeight;  // 鎺т欢楂�
+
+    protected WheelView.WheelViewStyle mStyle;
+
+    private Paint mBgPaint;
+
+    public WheelDrawable(int width, int height, WheelView.WheelViewStyle style) {
+        mWidth = width;
+        mHeight = height;
+        mStyle = style;
+        init();
+    }
+
+    private void init() {
+        mBgPaint = new Paint();
+        mBgPaint.setColor(mStyle.backgroundColor != -1 ? mStyle.backgroundColor : WheelConstants.WHEEL_BG);
+    }
+
+    @Override
+    public void draw(Canvas canvas) {
+        canvas.drawRect(0, 0, mWidth, mHeight, mBgPaint);
+    }
+
+    @Override
+    public void setAlpha(int alpha) {
+    }
+
+    @Override
+    public void setColorFilter(ColorFilter colorFilter) {
+    }
+
+    @Override
+    public int getOpacity() {
+        return 0;
+    }
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/util/WheelUtils.java b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/util/WheelUtils.java
new file mode 100644
index 0000000..95065f8
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/util/WheelUtils.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2016 venshine.cn@gmail.com
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package cn.com.basic.face.dialog.wheelview.util;
+
+import android.content.Context;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import java.util.Collection;
+
+/**
+ * 婊氳疆宸ュ叿绫�
+ *
+ * @author venshine
+ */
+public class WheelUtils {
+
+    private static final String TAG = "WheelView";
+
+    /**
+     * 鎵撳嵃鏃ュ織
+     *
+     * @param msg
+     */
+    public static void log(String msg) {
+        if (!TextUtils.isEmpty(msg)) {
+            Log.d(TAG, msg);
+        }
+    }
+
+    /**
+     * 鍒ゆ柇闆嗗悎鏄惁涓虹┖
+     *
+     * @param c
+     * @param <V>
+     * @return
+     */
+    public static <V> boolean isEmpty(Collection<V> c) {
+        return (c == null || c.size() == 0);
+    }
+
+    /**
+     * 閬嶅巻鏌ユ壘TextView
+     *
+     * @param view
+     * @return
+     */
+    public static TextView findTextView(View view) {
+        if (view instanceof TextView) {
+            return (TextView) view;
+        } else {
+            if (view instanceof ViewGroup) {
+                return findTextView(((ViewGroup) view).getChildAt(0));
+            } else {
+                return null;
+            }
+        }
+    }
+
+    /**
+     * dip杞崲鍒皃x
+     *
+     * @param context
+     * @param dp
+     * @return
+     */
+    public static int dip2px(Context context, float dp) {
+        final float scale = context.getResources().getDisplayMetrics().density;
+        return (int) (dp * scale + 0.5f);
+    }
+
+    /**
+     * sp杞崲鍒皃x
+     *
+     * @param context
+     * @param sp
+     * @return
+     */
+    public static int sp2px(Context context, float sp) {
+        final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
+        return (int) (sp * fontScale + 0.5f);
+    }
+
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/widget/IWheelView.java b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/widget/IWheelView.java
new file mode 100644
index 0000000..3c32a61
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/widget/IWheelView.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2016 venshine.cn@gmail.com
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package cn.com.basic.face.dialog.wheelview.widget;
+
+import cn.com.basic.face.dialog.wheelview.adapter.BaseWheelAdapter;
+import cn.com.basic.face.dialog.wheelview.widget.*;
+
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * 婊氳疆鎶借薄鎺ュ彛
+ *
+ * @author venshine
+ */
+public interface IWheelView<T> {
+
+    /**
+     * 婊氳疆鏁版嵁鏄惁寰幆锛岄粯璁や笉寰幆
+     */
+    boolean LOOP = false;
+
+    /**
+     * 婊氳疆榛樿鏁伴噺
+     */
+    int WHEEL_SIZE = 3;
+
+    /**
+     * 婊氳疆閫変腑鍒诲害鏄惁鍙偣鍑�
+     */
+    boolean CLICKABLE = false;
+
+    /**
+     * 璁剧疆婊氳疆閫変腑鍒诲害鏄惁鍙偣鍑�
+     *
+     * @param clickable
+     */
+    void setWheelClickable(boolean clickable);
+
+    /**
+     * 璁剧疆婊氳疆鏄惁寰幆婊氬姩
+     *
+     * @param loop
+     */
+    void setLoop(boolean loop);
+
+    /**
+     * 璁剧疆婊氳疆涓暟
+     *
+     * @param wheelSize
+     */
+    void setWheelSize(int wheelSize);
+
+    /**
+     * 璁剧疆婊氳疆鏁版嵁
+     *
+     * @param list
+     */
+    void setWheelData(List<T> list);
+
+    /**
+     * 璁剧疆婊氳疆鏁版嵁婧愰�傞厤鍣�
+     *
+     * @param adapter
+     */
+    void setWheelAdapter(BaseWheelAdapter<T> adapter);
+
+    /**
+     * 杩炴帴鍓疻heelView
+     *
+     * @param wheelView
+     */
+    void join(cn.com.basic.face.dialog.wheelview.widget.WheelView wheelView);
+
+    /**
+     * 鍓疻heelView鏁版嵁
+     *
+     * @param map
+     */
+    void joinDatas(HashMap<String, List<T>> map);
+
+
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/widget/NestedScrollView.java b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/widget/NestedScrollView.java
new file mode 100644
index 0000000..061cd56
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/widget/NestedScrollView.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2016 venshine.cn@gmail.com
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package cn.com.basic.face.dialog.wheelview.widget;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.MotionEvent;
+import android.view.View;
+import android.widget.ScrollView;
+
+import cn.com.basic.face.dialog.wheelview.common.WheelConstants;
+import cn.com.basic.face.dialog.wheelview.widget.*;
+
+/**
+ * 宓屽ScrollView
+ *
+ * @author venshine
+ */
+public class NestedScrollView extends ScrollView {
+
+    public NestedScrollView(Context context) {
+        super(context);
+        init();
+    }
+
+    public NestedScrollView(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        init();
+    }
+
+    public NestedScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+        init();
+    }
+
+    private void init() {
+        setOnTouchListener(new OnTouchListener() {
+            @Override
+            public boolean onTouch(View v, MotionEvent event) {
+                cn.com.basic.face.dialog.wheelview.widget.WheelView wv = (cn.com.basic.face.dialog.wheelview.widget.WheelView) findViewWithTag(WheelConstants.TAG);
+                if (wv != null) {
+                    wv.getParent().requestDisallowInterceptTouchEvent(false);
+                }
+                return false;
+            }
+        });
+    }
+
+
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/widget/WheelItem.java b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/widget/WheelItem.java
new file mode 100644
index 0000000..c4bafd5
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/widget/WheelItem.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2016 venshine.cn@gmail.com
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package cn.com.basic.face.dialog.wheelview.widget;
+
+import android.content.Context;
+import android.graphics.Color;
+import android.text.TextUtils;
+import android.util.AttributeSet;
+import android.view.Gravity;
+import android.view.View;
+import android.widget.FrameLayout;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import cn.com.basic.face.dialog.wheelview.common.WheelConstants;
+import cn.com.basic.face.dialog.wheelview.util.WheelUtils;
+
+/**
+ * 婊氳疆Item甯冨眬锛屽寘鍚浘鐗囧拰鏂囨湰
+ *
+ * @author venshine
+ */
+public class WheelItem extends FrameLayout {
+
+    private ImageView mImage;
+    private TextView mText;
+
+    public WheelItem(Context context) {
+        super(context);
+        init();
+    }
+
+    public WheelItem(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        init();
+    }
+
+    public WheelItem(Context context, AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+        init();
+    }
+
+    /**
+     * 鍒濆鍖�
+     */
+    private void init() {
+        LinearLayout layout = new LinearLayout(getContext());
+        LayoutParams layoutParams = new LayoutParams(LayoutParams.MATCH_PARENT, WheelUtils.dip2px(getContext(),
+                WheelConstants
+                        .WHEEL_ITEM_HEIGHT));
+        layout.setOrientation(LinearLayout.HORIZONTAL);
+        layout.setPadding(WheelConstants.WHEEL_ITEM_PADDING, WheelConstants.WHEEL_ITEM_PADDING, WheelConstants
+                .WHEEL_ITEM_PADDING, WheelConstants.WHEEL_ITEM_PADDING);
+        layout.setGravity(Gravity.CENTER);
+        addView(layout, layoutParams);
+
+        // 鍥剧墖
+        mImage = new ImageView(getContext());
+        mImage.setTag(WheelConstants.WHEEL_ITEM_IMAGE_TAG);
+        mImage.setVisibility(View.GONE);
+        LayoutParams imageParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
+        imageParams.rightMargin = WheelConstants.WHEEL_ITEM_MARGIN;
+        layout.addView(mImage, imageParams);
+
+        // 鏂囨湰
+        mText = new TextView(getContext());
+        mText.setTag(WheelConstants.WHEEL_ITEM_TEXT_TAG);
+        mText.setEllipsize(TextUtils.TruncateAt.END);
+        mText.setSingleLine();
+        mText.setIncludeFontPadding(false);
+        mText.setGravity(Gravity.CENTER);
+        mText.setTextColor(Color.BLACK);
+        LayoutParams textParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
+        layout.addView(mText, textParams);
+    }
+
+    /**
+     * 璁剧疆鏂囨湰
+     *
+     * @param text
+     */
+    public void setText(CharSequence text) {
+        mText.setText(text);
+    }
+
+    /**
+     * 璁剧疆鍥剧墖璧勬簮
+     *
+     * @param resId
+     */
+    public void setImage(int resId) {
+        mImage.setVisibility(View.VISIBLE);
+        mImage.setImageResource(resId);
+    }
+
+
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/widget/WheelView.java b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/widget/WheelView.java
new file mode 100644
index 0000000..16edfbb
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/widget/WheelView.java
@@ -0,0 +1,707 @@
+/*
+ * Copyright (C) 2016 venshine.cn@gmail.com
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package cn.com.basic.face.dialog.wheelview.widget;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.os.Build;
+import android.os.Handler;
+import android.os.Message;
+import android.text.TextUtils;
+import android.util.AttributeSet;
+import android.util.TypedValue;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.ViewTreeObserver;
+import android.widget.AbsListView;
+import android.widget.AdapterView;
+import android.widget.ListAdapter;
+import android.widget.ListView;
+import android.widget.TextView;
+
+import cn.com.basic.face.dialog.wheelview.adapter.ArrayWheelAdapter;
+import cn.com.basic.face.dialog.wheelview.adapter.BaseWheelAdapter;
+import cn.com.basic.face.dialog.wheelview.adapter.SimpleWheelAdapter;
+import cn.com.basic.face.dialog.wheelview.common.WheelConstants;
+import cn.com.basic.face.dialog.wheelview.common.WheelViewException;
+import cn.com.basic.face.dialog.wheelview.graphics.DrawableFactory;
+import cn.com.basic.face.dialog.wheelview.util.WheelUtils;
+import cn.com.basic.face.dialog.wheelview.widget.IWheelView;
+
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * 婊氳疆鎺т欢
+ *
+ * @author venshine
+ */
+public class WheelView<T> extends ListView implements IWheelView<T> {
+
+    private int mItemH = 0; // 姣忎竴椤归珮搴�
+    private int mWheelSize = WHEEL_SIZE;    // 婊氳疆涓暟
+    private boolean mLoop = LOOP;   // 鏄惁寰幆婊氬姩
+    private List<T> mList = null;   // 婊氳疆鏁版嵁鍒楄〃
+    private int mCurrentPositon = -1;    // 璁板綍婊氳疆褰撳墠鍒诲害
+    private String mExtraText;  // 娣诲姞婊氳疆閫変腑浣嶇疆闄勫姞鏂囨湰
+    private int mExtraTextColor;    // 闄勫姞鏂囨湰棰滆壊
+    private int mExtraTextSize; // 闄勫姞鏂囨湰澶у皬
+    private int mExtraMargin;   // 闄勫姞鏂囨湰澶栬竟璺�
+    private int mSelection = 0; // 閫変腑浣嶇疆
+    private boolean mClickable = CLICKABLE; // 鏄惁鍙偣鍑�
+
+    private Paint mTextPaint;   // 闄勫姞鏂囨湰鐢荤瑪
+
+    private Skin mSkin = Skin.None; // 鐨偆椋庢牸
+
+    private WheelViewStyle mStyle;  // 婊氳疆鏍峰紡
+
+    private WheelView mJoinWheelView;   // 鍓疻heelView
+
+    private HashMap<String, List<T>> mJoinMap;    // 鍓粴杞暟鎹垪琛�
+
+    private BaseWheelAdapter<T> mWheelAdapter;
+
+    private OnWheelItemSelectedListener<T> mOnWheelItemSelectedListener;
+
+    private OnWheelItemClickListener<T> mOnWheelItemClickListener;
+
+    private Handler mHandler = new Handler() {
+        @Override
+        public void handleMessage(Message msg) {
+            if (msg.what == WheelConstants.WHEEL_SCROLL_HANDLER_WHAT) {
+                if (mOnWheelItemSelectedListener != null) {
+                    mOnWheelItemSelectedListener.onItemSelected
+                            (getCurrentPosition(), getSelectionItem());
+                }
+                if (mJoinWheelView != null) {
+                    if (!mJoinMap.isEmpty()) {
+                        mJoinWheelView.resetDataFromTop(mJoinMap.get(mList.get
+                                (getCurrentPosition()))
+                        );
+                    } else {
+                        throw new WheelViewException("JoinList is error.");
+                    }
+                }
+            }
+        }
+    };
+
+    private OnItemClickListener mOnItemClickListener = new OnItemClickListener() {
+        @Override
+        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+            if (mOnWheelItemClickListener != null) {
+                mOnWheelItemClickListener.onItemClick(getCurrentPosition(), getSelectionItem());
+            }
+        }
+    };
+
+    private OnTouchListener mTouchListener = new OnTouchListener() {
+        @Override
+        public boolean onTouch(View v, MotionEvent event) {
+            v.getParent().requestDisallowInterceptTouchEvent(true);
+            return false;
+        }
+    };
+
+    private OnScrollListener mOnScrollListener = new OnScrollListener() {
+        @Override
+        public void onScrollStateChanged(AbsListView view, int scrollState) {
+            if (scrollState == SCROLL_STATE_IDLE) {
+                View itemView = getChildAt(0);
+                if (itemView != null) {
+                    float deltaY = itemView.getY();
+                    if (deltaY == 0 || mItemH == 0) {
+                        return;
+                    }
+                    if (Math.abs(deltaY) < mItemH / 2) {
+                        int d = getSmoothDistance(deltaY);
+                        smoothScrollBy(d, WheelConstants
+                                .WHEEL_SMOOTH_SCROLL_DURATION);
+                    } else {
+                        int d = getSmoothDistance(mItemH + deltaY);
+                        smoothScrollBy(d, WheelConstants
+                                .WHEEL_SMOOTH_SCROLL_DURATION);
+                    }
+                }
+            }
+        }
+
+        @Override
+        public void onScroll(AbsListView view, int firstVisibleItem, int
+                visibleItemCount, int totalItemCount) {
+            if (visibleItemCount != 0) {
+                refreshCurrentPosition(false);
+            }
+        }
+    };
+
+    public WheelView(Context context) {
+        super(context);
+        init();
+    }
+
+    public WheelView(Context context, WheelViewStyle style) {
+        super(context);
+        setStyle(style);
+        init();
+    }
+
+    public WheelView(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        init();
+    }
+
+    public WheelView(Context context, AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+        init();
+    }
+
+    /**
+     * 璁剧疆婊氳疆婊戝姩鍋滄鏃朵簨浠讹紝鐩戝惉婊氳疆閫変腑椤�
+     *
+     * @param onWheelItemSelectedListener
+     */
+    public void setOnWheelItemSelectedListener(OnWheelItemSelectedListener<T>
+                                                       onWheelItemSelectedListener) {
+        mOnWheelItemSelectedListener = onWheelItemSelectedListener;
+    }
+
+    /**
+     * 璁剧疆婊氳疆閫変腑椤圭偣鍑讳簨浠�
+     *
+     * @param onWheelItemClickListener
+     */
+    public void setOnWheelItemClickListener(OnWheelItemClickListener<T> onWheelItemClickListener) {
+        mOnWheelItemClickListener = onWheelItemClickListener;
+    }
+
+    /**
+     * 鍒濆鍖�
+     */
+    private void init() {
+        if (mStyle == null) {
+            mStyle = new WheelViewStyle();
+        }
+
+        mTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
+
+        setTag(WheelConstants.TAG);
+        setVerticalScrollBarEnabled(false);
+        setScrollingCacheEnabled(false);
+        setCacheColorHint(Color.TRANSPARENT);
+        setFadingEdgeLength(0);
+        setOverScrollMode(OVER_SCROLL_NEVER);
+        setDividerHeight(0);
+        setOnItemClickListener(mOnItemClickListener);
+        setOnScrollListener(mOnScrollListener);
+        setOnTouchListener(mTouchListener);
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+            setNestedScrollingEnabled(true);
+        }
+        addOnGlobalLayoutListener();
+    }
+
+    private void addOnGlobalLayoutListener() {
+        getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver
+                .OnGlobalLayoutListener() {
+            @Override
+            public void onGlobalLayout() {
+                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
+                    getViewTreeObserver().removeOnGlobalLayoutListener(this);
+                } else {
+                    getViewTreeObserver().removeGlobalOnLayoutListener(this);
+                }
+                if (getChildCount() > 0 && mItemH == 0) {
+                    mItemH = getChildAt(0).getHeight();
+                    if (mItemH != 0) {
+                        ViewGroup.LayoutParams params = getLayoutParams();
+                        params.height = mItemH * mWheelSize;
+                        refreshVisibleItems(getFirstVisiblePosition(),
+                                getCurrentPosition() + mWheelSize / 2,
+                                mWheelSize / 2);
+                        setBackground();
+                    } else {
+                        throw new WheelViewException("wheel item is error.");
+                    }
+                }
+            }
+        });
+    }
+
+    /**
+     * 鑾峰緱婊氳疆鏍峰紡
+     *
+     * @return
+     */
+    public WheelViewStyle getStyle() {
+        return mStyle;
+    }
+
+    /**
+     * 璁剧疆婊氳疆鏍峰紡
+     *
+     * @param style
+     */
+    public void setStyle(WheelViewStyle style) {
+        mStyle = style;
+    }
+
+    /**
+     * 璁剧疆鑳屾櫙
+     */
+    private void setBackground() {
+        Drawable drawable = DrawableFactory.createDrawable(mSkin, getWidth(),
+                mItemH * mWheelSize, mStyle, mWheelSize, mItemH);
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
+            setBackground(drawable);
+        } else {
+            setBackgroundDrawable(drawable);
+        }
+    }
+
+    /**
+     * 鑾峰緱鐨偆椋庢牸
+     *
+     * @return
+     */
+    public Skin getSkin() {
+        return mSkin;
+    }
+
+    /**
+     * 璁剧疆鐨偆椋庢牸
+     *
+     * @param skin
+     */
+    public void setSkin(Skin skin) {
+        mSkin = skin;
+    }
+
+    /**
+     * 璁剧疆婊氳疆涓暟
+     *
+     * @param wheelSize
+     */
+    @Override
+    public void setWheelSize(int wheelSize) {
+        if ((wheelSize & 1) == 0) {
+            throw new WheelViewException("wheel size must be an odd number.");
+        }
+        mWheelSize = wheelSize;
+        if (mWheelAdapter != null) {
+            mWheelAdapter.setWheelSize(wheelSize);
+        }
+    }
+
+    /**
+     * 璁剧疆婊氳疆鏄惁寰幆婊氬姩
+     *
+     * @param loop
+     */
+    @Override
+    public void setLoop(boolean loop) {
+        if (loop != mLoop) {
+            mLoop = loop;
+            setSelection(0);
+            if (mWheelAdapter != null) {
+                mWheelAdapter.setLoop(loop);
+            }
+        }
+    }
+
+    /**
+     * 璁剧疆婊氳疆閫変腑椤规槸鍚﹀彲鐐瑰嚮
+     *
+     * @param clickable
+     */
+    @Override
+    public void setWheelClickable(boolean clickable) {
+        if (clickable != mClickable) {
+            mClickable = clickable;
+            if (mWheelAdapter != null) {
+                mWheelAdapter.setClickable(clickable);
+            }
+        }
+    }
+
+    /**
+     * 閲嶇疆鏁版嵁
+     *
+     * @param list
+     */
+    public void resetDataFromTop(final List<T> list) {
+        if (WheelUtils.isEmpty(list)) {
+            throw new WheelViewException("join map data is error.");
+        }
+        WheelView.this.postDelayed(new Runnable() {
+            @Override
+            public void run() {
+                setWheelData(list);
+                WheelView.super.setSelection(0);
+                refreshCurrentPosition(true);
+            }
+        }, 10);
+    }
+
+    /**
+     * 鑾峰彇婊氳疆浣嶇疆
+     *
+     * @return
+     */
+    public int getSelection() {
+        return mSelection;
+    }
+
+    /**
+     * 璁剧疆婊氳疆浣嶇疆
+     *
+     * @param selection
+     */
+    @Override
+    public void setSelection(final int selection) {
+        mSelection = selection;
+        setVisibility(View.INVISIBLE);
+        WheelView.this.postDelayed(new Runnable() {
+            @Override
+            public void run() {
+                WheelView.super.setSelection(getRealPosition(selection));
+                refreshCurrentPosition(false);
+                setVisibility(View.VISIBLE);
+            }
+        }, 500);
+    }
+
+    /**
+     * 杩炴帴鍓疻heelView
+     *
+     * @param wheelView
+     */
+    @Override
+    public void join(WheelView wheelView) {
+        if (wheelView == null) {
+            throw new WheelViewException("wheelview cannot be null.");
+        }
+        mJoinWheelView = wheelView;
+    }
+
+    /**
+     * 鍓疻heelView鏁版嵁
+     *
+     * @param map
+     */
+    public void joinDatas(HashMap<String, List<T>> map) {
+        mJoinMap = map;
+    }
+
+    /**
+     * 鑾峰緱婊氳疆褰撳墠鐪熷疄浣嶇疆
+     *
+     * @param positon
+     * @return
+     */
+    private int getRealPosition(int positon) {
+        if (WheelUtils.isEmpty(mList)) {
+            return 0;
+        }
+        if (mLoop) {
+            int d = Integer.MAX_VALUE / 2 / mList.size();
+            return positon + d * mList.size() - mWheelSize / 2;
+        }
+        return positon;
+    }
+
+    /**
+     * 鑾峰彇褰撳墠婊氳疆浣嶇疆
+     *
+     * @return
+     */
+    public int getCurrentPosition() {
+        return mCurrentPositon;
+    }
+
+    /**
+     * 鑾峰彇褰撳墠婊氳疆浣嶇疆鐨勬暟鎹�
+     *
+     * @return
+     */
+    public T getSelectionItem() {
+        int position = getCurrentPosition();
+        position = position < 0 ? 0 : position;
+        if (mList != null && mList.size() > position) {
+            return mList.get(position);
+        }
+        return null;
+    }
+
+    /**
+     * 璁剧疆婊氳疆鏁版嵁閫傞厤鍣紝宸插純鐢紝鍏蜂綋浣跨敤{@link #setWheelAdapter(BaseWheelAdapter)}
+     *
+     * @param adapter
+     */
+    @Override
+    @Deprecated
+    public void setAdapter(ListAdapter adapter) {
+        if (adapter != null && adapter instanceof BaseWheelAdapter) {
+            setWheelAdapter((BaseWheelAdapter) adapter);
+        } else {
+            throw new WheelViewException("please invoke setWheelAdapter " +
+                    "method.");
+        }
+    }
+
+    /**
+     * 璁剧疆婊氳疆鏁版嵁婧愰�傞厤鍣�
+     *
+     * @param adapter
+     */
+    @Override
+    public void setWheelAdapter(BaseWheelAdapter<T> adapter) {
+        super.setAdapter(adapter);
+        mWheelAdapter = adapter;
+        mWheelAdapter.setData(mList).setWheelSize(mWheelSize).setLoop(mLoop).setClickable(mClickable);
+    }
+
+    /**
+     * 璁剧疆婊氳疆鏁版嵁
+     *
+     * @param list
+     */
+    @Override
+    public void setWheelData(List<T> list) {
+        if (WheelUtils.isEmpty(list)) {
+            throw new WheelViewException("wheel datas are error.");
+        }
+        mList = list;
+        if (mWheelAdapter != null) {
+            mWheelAdapter.setData(list);
+        }
+    }
+
+    /**
+     * 璁剧疆閫変腑琛岄檮鍔犳枃鏈�
+     *
+     * @param text
+     * @param textColor
+     * @param textSize
+     * @param margin
+     */
+    public void setExtraText(String text, int textColor, int textSize, int
+            margin) {
+        mExtraText = text;
+        mExtraTextColor = textColor;
+        mExtraTextSize = textSize;
+        mExtraMargin = margin;
+    }
+
+    /**
+     * 鑾峰緱婊氳疆鏁版嵁鎬绘暟
+     *
+     * @return
+     */
+    public int getWheelCount() {
+        return !WheelUtils.isEmpty(mList) ? mList.size() : 0;
+    }
+
+    /**
+     * 骞虫粦鐨勬粴鍔ㄨ窛绂�
+     *
+     * @param scrollDistance
+     * @return
+     */
+    private int getSmoothDistance(float scrollDistance) {
+        if (Math.abs(scrollDistance) <= 2) {
+            return (int) scrollDistance;
+        } else if (Math.abs(scrollDistance) < 12) {
+            return scrollDistance > 0 ? 2 : -2;
+        } else {
+            return (int) (scrollDistance / 6);  // 鍑忕紦骞虫粦婊戝姩閫熺巼
+        }
+    }
+
+    /**
+     * 鍒锋柊褰撳墠浣嶇疆
+     *
+     * @param join
+     */
+    private void refreshCurrentPosition(boolean join) {
+        if (getChildAt(0) == null || mItemH == 0) {
+            return;
+        }
+        int firstPosition = getFirstVisiblePosition();
+        if (mLoop && firstPosition == 0) {
+            return;
+        }
+        int position = 0;
+        if (Math.abs(getChildAt(0).getY()) <= mItemH / 2) {
+            position = firstPosition;
+        } else {
+            position = firstPosition + 1;
+        }
+        refreshVisibleItems(firstPosition, position + mWheelSize / 2,
+                mWheelSize / 2);
+        if (mLoop) {
+            position = (position + mWheelSize / 2) % getWheelCount();
+        }
+        if (position == mCurrentPositon && !join) {
+            return;
+        }
+        mCurrentPositon = position;
+        mWheelAdapter.setCurrentPosition(position);
+        mHandler.removeMessages(WheelConstants.WHEEL_SCROLL_HANDLER_WHAT);
+        mHandler.sendEmptyMessageDelayed(WheelConstants
+                .WHEEL_SCROLL_HANDLER_WHAT, WheelConstants
+                .WHEEL_SCROLL_DELAY_DURATION);
+    }
+
+    /**
+     * 鍒锋柊鍙婊氬姩鍒楄〃
+     *
+     * @param firstPosition
+     * @param curPosition
+     * @param offset
+     */
+    private void refreshVisibleItems(int firstPosition, int curPosition, int
+            offset) {
+        for (int i = curPosition - offset; i <= curPosition + offset; i++) {
+            View itemView = getChildAt(i - firstPosition);
+            if (itemView == null) {
+                continue;
+            }
+            if (mWheelAdapter instanceof ArrayWheelAdapter || mWheelAdapter
+                    instanceof SimpleWheelAdapter) {
+                TextView textView = (TextView) itemView.findViewWithTag
+                        (WheelConstants.WHEEL_ITEM_TEXT_TAG);
+                refreshTextView(i, curPosition, itemView, textView);
+            } else {    // 鑷畾涔夌被鍨�
+                TextView textView = WheelUtils.findTextView(itemView);
+                if (textView != null) {
+                    refreshTextView(i, curPosition, itemView, textView);
+                }
+            }
+        }
+    }
+
+    /**
+     * 鍒锋柊鏂囨湰
+     *
+     * @param position
+     * @param curPosition
+     * @param itemView
+     * @param textView
+     */
+    private void refreshTextView(int position, int curPosition, View
+            itemView, TextView textView) {
+        if (curPosition == position) { // 閫変腑
+            int textColor = mStyle.selectedTextColor != -1 ? mStyle
+                    .selectedTextColor : (mStyle.textColor != -1 ? mStyle
+                    .textColor : WheelConstants.WHEEL_TEXT_COLOR);
+            float defTextSize = mStyle.textSize != -1 ? mStyle.textSize : WheelConstants.WHEEL_TEXT_SIZE;
+            float textSize = mStyle.selectedTextSize != -1 ? mStyle
+                    .selectedTextSize : (mStyle.selectedTextZoom != -1 ? (defTextSize * mStyle.selectedTextZoom) :
+                    defTextSize);
+            setTextView(itemView, textView, textColor, textSize, 1.0f);
+        } else {    // 鏈�変腑
+            int textColor = mStyle.textColor != -1 ? mStyle.textColor :
+                    WheelConstants.WHEEL_TEXT_COLOR;
+            float textSize = mStyle.textSize != -1 ? mStyle.textSize :
+                    WheelConstants.WHEEL_TEXT_SIZE;
+            int delta = Math.abs(position - curPosition);
+            float alpha = (float) Math.pow(mStyle.textAlpha != -1 ? mStyle.textAlpha : WheelConstants
+                    .WHEEL_TEXT_ALPHA, delta);
+            setTextView(itemView, textView, textColor, textSize, alpha);
+        }
+    }
+
+    /**
+     * 璁剧疆TextView
+     *
+     * @param itemView
+     * @param textView
+     * @param textColor
+     * @param textSize
+     * @param textAlpha
+     */
+    private void setTextView(View itemView, TextView textView, int textColor, float textSize, float textAlpha) {
+        textView.setTextColor(textColor);
+        textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize);
+        itemView.setAlpha(textAlpha);
+    }
+
+    @Override
+    protected void dispatchDraw(Canvas canvas) {
+        super.dispatchDraw(canvas);
+        if (!TextUtils.isEmpty(mExtraText)) {
+            Rect targetRect = new Rect(0, mItemH * (mWheelSize / 2), getWidth
+                    (), mItemH * (mWheelSize / 2 + 1));
+            mTextPaint.setTextSize(mExtraTextSize);
+            mTextPaint.setColor(mExtraTextColor);
+            Paint.FontMetricsInt fontMetrics = mTextPaint.getFontMetricsInt();
+            int baseline = (targetRect.bottom + targetRect.top - fontMetrics
+                    .bottom - fontMetrics.top) / 2;
+            mTextPaint.setTextAlign(Paint.Align.CENTER);
+            canvas.drawText(mExtraText, targetRect.centerX() + mExtraMargin,
+                    baseline, mTextPaint);
+        }
+    }
+
+    public enum Skin { // 婊氳疆鐨偆
+        Common, Holo, None
+    }
+
+    public interface OnWheelItemSelectedListener<T> {
+        void onItemSelected(int position, T t);
+    }
+
+    public interface OnWheelItemClickListener<T> {
+        void onItemClick(int position, T t);
+    }
+
+    public static class WheelViewStyle {
+
+        public int backgroundColor = -1; // 鑳屾櫙棰滆壊
+        public int holoBorderColor = -1;   // holo鏍峰紡杈规棰滆壊
+        public int holoBorderWidth = -1;//holo鏍峰紡杈规瀹藉害
+        public int textColor = -1; // 鏂囨湰棰滆壊
+        public int selectedTextColor = -1; // 閫変腑鏂囨湰棰滆壊
+        public int textSize = -1;// 鏂囨湰澶у皬
+        public int selectedTextSize = -1;   // 閫変腑鏂囨湰澶у皬
+        public float textAlpha = -1;  // 鏂囨湰閫忔槑搴�(0f ~ 1f)
+        public float selectedTextZoom = -1; // 閫変腑鏂囨湰鏀惧ぇ鍊嶆暟
+
+        public WheelViewStyle() {
+        }
+
+        public WheelViewStyle(WheelViewStyle style) {
+            this.backgroundColor = style.backgroundColor;
+            this.holoBorderColor = style.holoBorderColor;
+            this.holoBorderWidth = style.holoBorderWidth;
+            this.textColor = style.textColor;
+            this.selectedTextColor = style.selectedTextColor;
+            this.textSize = style.textSize;
+            this.selectedTextSize = style.selectedTextSize;
+            this.textAlpha = style.textAlpha;
+            this.selectedTextZoom = style.selectedTextZoom;
+        }
+
+    }
+
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/widget/WheelViewDialog.java b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/widget/WheelViewDialog.java
new file mode 100644
index 0000000..e881dc4
--- /dev/null
+++ b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/dialog/wheelview/widget/WheelViewDialog.java
@@ -0,0 +1,302 @@
+/*
+ * Copyright (C) 2016 venshine.cn@gmail.com
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package cn.com.basic.face.dialog.wheelview.widget;
+
+import android.app.AlertDialog;
+import android.content.Context;
+import android.graphics.Color;
+import android.util.TypedValue;
+import android.view.Gravity;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import cn.com.basic.face.dialog.wheelview.adapter.ArrayWheelAdapter;
+import cn.com.basic.face.dialog.wheelview.common.WheelConstants;
+import cn.com.basic.face.dialog.wheelview.util.WheelUtils;
+import cn.com.basic.face.dialog.wheelview.widget.*;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 婊氳疆瀵硅瘽妗�
+ *
+ * @author venshine
+ */
+public class WheelViewDialog<T> implements View.OnClickListener {
+
+    private TextView mTitle;
+
+    private View mLine1, mLine2;
+
+    private cn.com.basic.face.dialog.wheelview.widget.WheelView<T> mWheelView;
+
+    private cn.com.basic.face.dialog.wheelview.widget.WheelView.WheelViewStyle mStyle;
+
+    private TextView mButton;
+
+    private AlertDialog mDialog;
+
+    private Context mContext;
+
+    private OnDialogItemClickListener mOnDialogItemClickListener;
+
+    private int mSelectedPos;
+
+    private T mSelectedText;
+
+    public WheelViewDialog(Context context) {
+        mContext = context;
+        init();
+    }
+
+    private void init() {
+        LinearLayout layout = new LinearLayout(mContext);
+        layout.setOrientation(LinearLayout.VERTICAL);
+        layout.setPadding(WheelUtils.dip2px(mContext, 20), 0, WheelUtils.dip2px(mContext, 20), 0);
+
+        mTitle = new TextView(mContext);
+        mTitle.setTextColor(WheelConstants.DIALOG_WHEEL_COLOR);
+        mTitle.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16);
+        mTitle.setGravity(Gravity.CENTER);
+        LinearLayout.LayoutParams titleParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
+                WheelUtils.dip2px(mContext, 50));
+        layout.addView(mTitle, titleParams);
+
+        mLine1 = new View(mContext);
+        mLine1.setBackgroundColor(WheelConstants.DIALOG_WHEEL_COLOR);
+        LinearLayout.LayoutParams lineParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
+                WheelUtils.dip2px(mContext, 2));
+        layout.addView(mLine1, lineParams);
+
+        mWheelView = new cn.com.basic.face.dialog.wheelview.widget.WheelView(mContext);
+        mWheelView.setSkin(cn.com.basic.face.dialog.wheelview.widget.WheelView.Skin.Holo);
+        mWheelView.setWheelAdapter(new ArrayWheelAdapter(mContext));
+        mStyle = new cn.com.basic.face.dialog.wheelview.widget.WheelView.WheelViewStyle();
+        mStyle.textColor = Color.GRAY;
+        mStyle.selectedTextZoom = 1.2f;
+        mWheelView.setStyle(mStyle);
+
+        mWheelView.setOnWheelItemSelectedListener(new cn.com.basic.face.dialog.wheelview.widget.WheelView.OnWheelItemSelectedListener<T>() {
+            @Override
+            public void onItemSelected(int position, T text) {
+                mSelectedPos = position;
+                mSelectedText = text;
+            }
+        });
+        ViewGroup.MarginLayoutParams wheelParams = new ViewGroup.MarginLayoutParams(LinearLayout.LayoutParams
+                .MATCH_PARENT,
+                LinearLayout.LayoutParams.WRAP_CONTENT);
+        layout.addView(mWheelView, wheelParams);
+
+        mLine2 = new View(mContext);
+        mLine2.setBackgroundColor(WheelConstants.DIALOG_WHEEL_COLOR);
+        LinearLayout.LayoutParams line2Params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
+                WheelUtils.dip2px(mContext, 1f));
+        layout.addView(mLine2, line2Params);
+
+        mButton = new TextView(mContext);
+        mButton.setTextColor(WheelConstants.DIALOG_WHEEL_COLOR);
+        mButton.setTextSize(TypedValue.COMPLEX_UNIT_SP, 12);
+        mButton.setGravity(Gravity.CENTER);
+        mButton.setClickable(true);
+        mButton.setOnClickListener(this);
+        mButton.setText("OK");
+        LinearLayout.LayoutParams buttonParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
+                WheelUtils.dip2px(mContext, 45));
+        layout.addView(mButton, buttonParams);
+
+        mDialog = new AlertDialog.Builder(mContext).create();
+        mDialog.setView(layout);
+        mDialog.setCanceledOnTouchOutside(false);
+    }
+
+    /**
+     * 鐐瑰嚮浜嬩欢
+     *
+     * @param onDialogItemClickListener
+     * @return
+     */
+    public WheelViewDialog setOnDialogItemClickListener(OnDialogItemClickListener onDialogItemClickListener) {
+        mOnDialogItemClickListener = onDialogItemClickListener;
+        return this;
+    }
+
+    /**
+     * 璁剧疆dialog澶栬棰滆壊
+     *
+     * @param color
+     * @return
+     */
+    public WheelViewDialog setDialogStyle(int color) {
+        mTitle.setTextColor(color);
+        mLine1.setBackgroundColor(color);
+        mLine2.setBackgroundColor(color);
+        mButton.setTextColor(color);
+        mStyle.selectedTextColor = color;
+        mStyle.holoBorderColor = color;
+        return this;
+    }
+
+    /**
+     * 璁剧疆鏍囬
+     *
+     * @param title
+     * @return
+     */
+    public WheelViewDialog setTitle(String title) {
+        mTitle.setText(title);
+        return this;
+    }
+
+    /**
+     * 璁剧疆鏍囬棰滆壊
+     *
+     * @param color
+     * @return
+     */
+    public WheelViewDialog setTextColor(int color) {
+        mTitle.setTextColor(color);
+        return this;
+    }
+
+    /**
+     * 璁剧疆鏍囬澶у皬
+     *
+     * @param size
+     * @return
+     */
+    public WheelViewDialog setTextSize(int size) {
+        mTitle.setTextSize(size);
+        return this;
+    }
+
+    /**
+     * 璁剧疆鎸夐挳鏂囨湰
+     *
+     * @param text
+     * @return
+     */
+    public WheelViewDialog setButtonText(String text) {
+        mButton.setText(text);
+        return this;
+    }
+
+    /**
+     * 璁剧疆鎸夐挳鏂囨湰棰滆壊
+     *
+     * @param color
+     * @return
+     */
+    public WheelViewDialog setButtonColor(int color) {
+        mButton.setTextColor(color);
+        return this;
+    }
+
+    /**
+     * 璁剧疆鎸夐挳鏂囨湰灏哄
+     *
+     * @param size
+     * @return
+     */
+    public WheelViewDialog setButtonSize(int size) {
+        mButton.setTextSize(size);
+        return this;
+    }
+
+    /**
+     * 璁剧疆鏁版嵁椤规樉绀轰釜鏁�
+     *
+     * @param count
+     */
+    public WheelViewDialog setCount(int count) {
+        mWheelView.setWheelSize(count);
+        return this;
+    }
+
+    /**
+     * 鏁版嵁椤规槸鍚﹀惊鐜樉绀�
+     *
+     * @param loop
+     */
+    public WheelViewDialog setLoop(boolean loop) {
+        mWheelView.setLoop(loop);
+        return this;
+    }
+
+    /**
+     * 璁剧疆鏁版嵁椤规樉绀轰綅缃�
+     *
+     * @param selection
+     */
+    public WheelViewDialog setSelection(int selection) {
+        mWheelView.setSelection(selection);
+        return this;
+    }
+
+    /**
+     * 璁剧疆鏁版嵁椤�
+     *
+     * @param arrays
+     */
+    public WheelViewDialog setItems(T[] arrays) {
+        return setItems(Arrays.asList(arrays));
+    }
+
+    /**
+     * 璁剧疆鏁版嵁椤�
+     *
+     * @param list
+     */
+    public WheelViewDialog setItems(List<T> list) {
+        mWheelView.setWheelData(list);
+        return this;
+    }
+
+    /**
+     * 鏄剧ず
+     */
+    public WheelViewDialog show() {
+        if (!mDialog.isShowing()) {
+            mDialog.show();
+        }
+        return this;
+    }
+
+    /**
+     * 闅愯棌
+     */
+    public WheelViewDialog dismiss() {
+        if (mDialog.isShowing()) {
+            mDialog.dismiss();
+        }
+        return this;
+    }
+
+    @Override
+    public void onClick(View v) {
+        dismiss();
+        if (null != mOnDialogItemClickListener) {
+            mOnDialogItemClickListener.onItemClick(mSelectedPos, mSelectedText);
+        }
+    }
+
+    public interface OnDialogItemClickListener<T> {
+        void onItemClick(int position, T s);
+    }
+}
diff --git a/VisitFace/DemoForBsk/app/src/main/res/layout/dialog_add.xml b/VisitFace/DemoForBsk/app/src/main/res/layout/dialog_add.xml
index 61ebd00..6529ce1 100644
--- a/VisitFace/DemoForBsk/app/src/main/res/layout/dialog_add.xml
+++ b/VisitFace/DemoForBsk/app/src/main/res/layout/dialog_add.xml
@@ -18,13 +18,13 @@
             android:padding="@dimen/w20dp"
             android:gravity="center"
             android:textColor="@android:color/white"
-            android:textSize="@dimen/text_size_big"
+            android:textSize="@dimen/w16dp"
             android:background="@color/colorPrimary"/>
         <EditText
             android:id="@+id/dialog_add_content"
             android:layout_width="@dimen/w200dp"
             android:layout_height="wrap_content"
-            android:textSize="@dimen/text_size_big"
+            android:textSize="@dimen/w16dp"
             android:textColor="@color/colorText_5"
             android:padding="@dimen/w22dp"
             android:gravity="center"
diff --git a/VisitFace/DemoForBsk/app/src/main/res/layout/dialog_country.xml b/VisitFace/DemoForBsk/app/src/main/res/layout/dialog_country.xml
index 6f3c40a..b6ab983 100644
--- a/VisitFace/DemoForBsk/app/src/main/res/layout/dialog_country.xml
+++ b/VisitFace/DemoForBsk/app/src/main/res/layout/dialog_country.xml
@@ -18,7 +18,7 @@
             android:gravity="center"
             android:text="@string/country"
             android:textColor="@android:color/white"
-            android:textSize="@dimen/text_size_big"
+            android:textSize="@dimen/w16dp"
             android:background="@color/colorPrimary"/>
         <LinearLayout
             android:layout_width="@dimen/w300dp"
@@ -26,12 +26,12 @@
             android:paddingLeft="@dimen/w10dp"
             android:paddingRight="@dimen/w10dp"
             android:orientation="horizontal">
-            <com.wx.wheelview.widget.WheelView
+            <cn.com.basic.face.dialog.wheelview.widget.WheelView
                 android:id="@+id/dialog_country_name_first_letter"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_weight="1"/>
-            <com.wx.wheelview.widget.WheelView
+            <cn.com.basic.face.dialog.wheelview.widget.WheelView
                 android:id="@+id/dialog_country_name"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
@@ -53,7 +53,7 @@
                 android:layout_height="match_parent"
                 android:gravity="center"
                 android:text="@string/confirm"
-                android:textSize="@dimen/text_size_big"/>
+                android:textSize="@dimen/w16dp"/>
             <View
                 android:layout_width="0.5dp"
                 android:layout_height="match_parent"
@@ -65,7 +65,7 @@
                 android:layout_height="match_parent"
                 android:gravity="center"
                 android:text="@string/cancel"
-                android:textSize="@dimen/text_size_big"/>
+                android:textSize="@dimen/w16dp"/>
         </LinearLayout>
     </LinearLayout>
 </LinearLayout>
\ No newline at end of file
diff --git a/VisitFace/DemoForBsk/app/src/main/res/layout/dialog_date_select.xml b/VisitFace/DemoForBsk/app/src/main/res/layout/dialog_date_select.xml
index 25d0bea..8c48479 100644
--- a/VisitFace/DemoForBsk/app/src/main/res/layout/dialog_date_select.xml
+++ b/VisitFace/DemoForBsk/app/src/main/res/layout/dialog_date_select.xml
@@ -27,7 +27,9 @@
             android:layout_height="@dimen/h50dp"
             android:gravity="center"
             android:text="@string/confirm"
-            android:textColor="#000000" />
+            android:textColor="#000000"
+            android:textSize="@dimen/w16dp"
+            />
         <TextView
             android:id="@+id/dialog_date_select_cancel"
             android:layout_weight="1"
@@ -35,6 +37,8 @@
             android:layout_height="@dimen/h50dp"
             android:gravity="center"
             android:text="@string/cancel"
-            android:textColor="#000000" />
+            android:textColor="#000000"
+            android:textSize="@dimen/w16dp"
+            />
     </LinearLayout>
 </LinearLayout>
\ No newline at end of file
diff --git a/VisitFace/DemoForBsk/app/src/main/res/layout/dialog_row.xml b/VisitFace/DemoForBsk/app/src/main/res/layout/dialog_row.xml
index 3762019..c87625e 100644
--- a/VisitFace/DemoForBsk/app/src/main/res/layout/dialog_row.xml
+++ b/VisitFace/DemoForBsk/app/src/main/res/layout/dialog_row.xml
@@ -10,5 +10,5 @@
         android:layout_margin="@dimen/w8dp"
         android:gravity="center"
         android:singleLine="true"
-        android:textSize="@dimen/text_size_big"/>
+        android:textSize="@dimen/w16dp"/>
 </RelativeLayout>
\ No newline at end of file
diff --git a/VisitFace/DemoForBsk/app/src/main/res/layout/dialog_select.xml b/VisitFace/DemoForBsk/app/src/main/res/layout/dialog_select.xml
index bffcd58..83ad706 100644
--- a/VisitFace/DemoForBsk/app/src/main/res/layout/dialog_select.xml
+++ b/VisitFace/DemoForBsk/app/src/main/res/layout/dialog_select.xml
@@ -18,12 +18,13 @@
             android:padding="@dimen/w20dp"
             android:gravity="center"
             android:textColor="@android:color/white"
-            android:textSize="@dimen/text_size_big"
+            android:textSize="@dimen/w16dp"
             android:background="@color/colorPrimary"/>
-        <com.wx.wheelview.widget.WheelView
+        <cn.com.basic.face.dialog.wheelview.widget.WheelView
             android:id="@+id/dialog_select_list_view"
             android:layout_width="@dimen/w200dp"
-            android:layout_height="wrap_content"/>
+            android:layout_height="wrap_content"
+            />
         <View
             android:layout_width="match_parent"
             android:layout_height="0.5dp"
@@ -39,7 +40,7 @@
                 android:layout_height="match_parent"
                 android:gravity="center"
                 android:text="@string/confirm"
-                android:textSize="@dimen/text_size_big"/>
+                android:textSize="@dimen/w16dp"/>
             <View
                 android:id="@+id/dialog_select_add_separator"
                 android:layout_width="0.5dp"
@@ -54,7 +55,7 @@
                 android:layout_height="match_parent"
                 android:gravity="center"
                 android:text="@string/add"
-                android:textSize="@dimen/text_size_big"
+                android:textSize="@dimen/w16dp"
                 android:visibility="gone"
                 />
             <View
@@ -68,7 +69,7 @@
                 android:layout_height="match_parent"
                 android:gravity="center"
                 android:text="@string/cancel"
-                android:textSize="@dimen/text_size_big"/>
+                android:textSize="@dimen/w16dp"/>
         </LinearLayout>
     </LinearLayout>
 </LinearLayout>
\ No newline at end of file

--
Gitblit v1.8.0