Commit db27de12ce6c74ee408e24598e094682613dbece

Authored by xiongwei
1 parent e54c424ab1
Exists in master

完成大多数界面,时间选择器,地区选择器

Showing 67 changed files with 5511 additions and 34 deletions   Show diff stats
PersonalCenter/.idea/gradle.xml
... ... @@ -11,6 +11,7 @@
11 11 <option value="$PROJECT_DIR$" />
12 12 <option value="$PROJECT_DIR$/app" />
13 13 <option value="$PROJECT_DIR$/circledialog" />
  14 + <option value="$PROJECT_DIR$/pickerview" />
14 15 </set>
15 16 </option>
16 17 <option name="resolveModulePerSourceSet" value="false" />
... ...
PersonalCenter/.idea/modules.xml
... ... @@ -5,6 +5,7 @@
5 5 <module fileurl="file://$PROJECT_DIR$/PersonalCenter.iml" filepath="$PROJECT_DIR$/PersonalCenter.iml" />
6 6 <module fileurl="file://$PROJECT_DIR$/app/app.iml" filepath="$PROJECT_DIR$/app/app.iml" />
7 7 <module fileurl="file://$PROJECT_DIR$/circledialog/circledialog.iml" filepath="$PROJECT_DIR$/circledialog/circledialog.iml" />
  8 + <module fileurl="file://$PROJECT_DIR$/pickerview/pickerview.iml" filepath="$PROJECT_DIR$/pickerview/pickerview.iml" />
8 9 </modules>
9 10 </component>
10 11 </project>
11 12 \ No newline at end of file
... ...
PersonalCenter/app/build.gradle
... ... @@ -27,4 +27,5 @@ dependencies {
27 27 compile 'com.android.support:appcompat-v7:25.3.1'
28 28 testCompile 'junit:junit:4.12'
29 29 compile project(':circledialog')
  30 + compile project(':pickerview')
30 31 }
... ...
PersonalCenter/app/src/main/AndroidManifest.xml
... ... @@ -61,7 +61,7 @@
61 61  
62 62 </activity>
63 63 <activity
64   - android:name=".activity.ChangeEletronicCardPhone"
  64 + android:name=".activity.ChangeEletronicCardPhoneActivity"
65 65 android:launchMode="singleTask"
66 66 android:screenOrientation="landscape">
67 67  
... ... @@ -78,6 +78,30 @@
78 78 android:screenOrientation="landscape">
79 79  
80 80 </activity>
  81 + <activity
  82 + android:name=".activity.ElectronicCardEditInfoActivity"
  83 + android:launchMode="singleTask"
  84 + android:screenOrientation="landscape">
  85 +
  86 + </activity>
  87 + <activity
  88 + android:name=".activity.ElectronicCardInfoOKActivity"
  89 + android:launchMode="singleTask"
  90 + android:screenOrientation="landscape">
  91 +
  92 + </activity>
  93 + <activity
  94 + android:name=".activity.ElectronicCardLookInfoActivity"
  95 + android:launchMode="singleTask"
  96 + android:screenOrientation="landscape">
  97 +
  98 + </activity>
  99 + <activity
  100 + android:name=".activity.FeedBackActivity"
  101 + android:launchMode="singleTask"
  102 + android:screenOrientation="landscape">
  103 +
  104 + </activity>
81 105 </application>
82 106  
83 107 </manifest>
84 108 \ No newline at end of file
... ...
PersonalCenter/app/src/main/java/com/hjx/personalcenter/activity/ChangeEletronicCardPhone.java
... ... @@ -1,18 +0,0 @@
1   -package com.hjx.personalcenter.activity;
2   -
3   -import android.app.Activity;
4   -import android.os.Bundle;
5   -
6   -import com.hjx.personalcenter.R;
7   -
8   -/**
9   - * Created by h on 2017/8/9.
10   - */
11   -
12   -public class ChangeEletronicCardPhone extends Activity {
13   - @Override
14   - protected void onCreate(Bundle savedInstanceState) {
15   - super.onCreate(savedInstanceState);
16   - setContentView(R.layout.activity_electronicard_phone);
17   - }
18   -}
PersonalCenter/app/src/main/java/com/hjx/personalcenter/activity/ChangeEletronicCardPhoneActivity.java
... ... @@ -0,0 +1,18 @@
  1 +package com.hjx.personalcenter.activity;
  2 +
  3 +import android.app.Activity;
  4 +import android.os.Bundle;
  5 +
  6 +import com.hjx.personalcenter.R;
  7 +
  8 +/**
  9 + * Created by h on 2017/8/9.
  10 + */
  11 +
  12 +public class ChangeEletronicCardPhoneActivity extends Activity {
  13 + @Override
  14 + protected void onCreate(Bundle savedInstanceState) {
  15 + super.onCreate(savedInstanceState);
  16 + setContentView(R.layout.activity_electronicard_phone);
  17 + }
  18 +}
... ...
PersonalCenter/app/src/main/java/com/hjx/personalcenter/activity/ElectronicCardEditInfoActivity.java
... ... @@ -0,0 +1,95 @@
  1 +package com.hjx.personalcenter.activity;
  2 +
  3 +import android.app.Activity;
  4 +import android.graphics.Color;
  5 +import android.os.Bundle;
  6 +import android.view.View;
  7 +import android.widget.Button;
  8 +import android.widget.LinearLayout;
  9 +import android.widget.TextView;
  10 +
  11 +import com.bigkoo.pickerview.TimePickerView;
  12 +import com.hjx.personalcenter.R;
  13 +
  14 +import java.text.SimpleDateFormat;
  15 +import java.util.Calendar;
  16 +import java.util.Date;
  17 +
  18 +/**填写保卡信息 熊巍
  19 + * Created by h on 2017/8/11.
  20 + */
  21 +
  22 +public class ElectronicCardEditInfoActivity extends Activity implements View.OnClickListener {
  23 + private LinearLayout lineL_buy_time;
  24 + private TextView tv_buy_time;
  25 + private TimePickerView pvTime;
  26 +
  27 + @Override
  28 + protected void onCreate(Bundle savedInstanceState) {
  29 + super.onCreate(savedInstanceState);
  30 + setContentView(R.layout.activity_electroniccard_info);
  31 + initView();
  32 + initData();
  33 + initLister();
  34 + initTimePicker();
  35 + }
  36 +
  37 + private void initView() {
  38 + lineL_buy_time = (LinearLayout) findViewById(R.id.lineL_buy_time);
  39 + tv_buy_time = (TextView) findViewById(R.id.tv_buy_time);
  40 + }
  41 +
  42 + private void initData() {
  43 +
  44 + }
  45 +
  46 + private void initLister() {
  47 + lineL_buy_time.setOnClickListener(this);
  48 +
  49 + }
  50 + private void initTimePicker() {
  51 + //控制时间范围(如果不设置范围,则使用默认时间1900-2100年,此段代码可注释)
  52 + //因为系统Calendar的月份是从0-11的,所以如果是调用Calendar的set方法来设置时间,月份的范围也要是从0-11
  53 + Calendar selectedDate = Calendar.getInstance();
  54 + Calendar startDate = Calendar.getInstance();
  55 + startDate.set(2013, 0, 23);
  56 + Calendar endDate = Calendar.getInstance();
  57 + endDate.set(2019, 11, 28);
  58 + //时间选择器
  59 + pvTime = new TimePickerView.Builder(this, new TimePickerView.OnTimeSelectListener() {
  60 + @Override
  61 + public void onTimeSelect(Date date, View v) {//选中事件回调
  62 + // 这里回调过来的v,就是show()方法里面所添加的 View 参数,如果show的时候没有添加参数,v则为null
  63 + /*btn_Time.setText(getTime(date));*/
  64 + Button btn = (Button) v;
  65 + btn.setText(getTime(date));
  66 + }
  67 + })
  68 + //年月日时分秒 的显示与否,不设置则默认全部显示
  69 + .setType(new boolean[]{true, true, true, false, false, false})
  70 + .setLabel("", "", "", "", "", "")
  71 + .isCenterLabel(false)
  72 + .setDividerColor(Color.DKGRAY)
  73 + .setContentSize(21)
  74 + .setDate(selectedDate)
  75 + .setRangDate(startDate, endDate)
  76 + .setBackgroundId(0x00FFFFFF) //设置外部遮罩颜色
  77 + .setDecorView(null)
  78 + .build();
  79 + }
  80 + private String getTime(Date date) {//可根据需要自行截取数据显示
  81 + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  82 + return format.format(date);
  83 + }
  84 +
  85 + @Override
  86 + public void onClick(View v) {
  87 + switch (v.getId()){
  88 + case R.id.lineL_buy_time:
  89 + pvTime.show(v);//弹出时间选择器,传递参数过去,回调的时候则可以绑定此view
  90 + break;
  91 + }
  92 +
  93 +
  94 + }
  95 +}
... ...
PersonalCenter/app/src/main/java/com/hjx/personalcenter/activity/ElectronicCardInfoOKActivity.java
... ... @@ -0,0 +1,18 @@
  1 +package com.hjx.personalcenter.activity;
  2 +
  3 +import android.app.Activity;
  4 +import android.os.Bundle;
  5 +
  6 +import com.hjx.personalcenter.R;
  7 +
  8 +/**
  9 + * Created by h on 2017/8/11.
  10 + */
  11 +
  12 +public class ElectronicCardInfoOKActivity extends Activity{
  13 + @Override
  14 + protected void onCreate(Bundle savedInstanceState) {
  15 + super.onCreate(savedInstanceState);
  16 + setContentView(R.layout.activity_ok_cardinfo);
  17 + }
  18 +}
... ...
PersonalCenter/app/src/main/java/com/hjx/personalcenter/activity/ElectronicCardLookInfoActivity.java
... ... @@ -0,0 +1,18 @@
  1 +package com.hjx.personalcenter.activity;
  2 +
  3 +import android.app.Activity;
  4 +import android.os.Bundle;
  5 +
  6 +import com.hjx.personalcenter.R;
  7 +
  8 +/**
  9 + * Created by h on 2017/8/11.
  10 + */
  11 +
  12 +public class ElectronicCardLookInfoActivity extends Activity{
  13 + @Override
  14 + protected void onCreate(Bundle savedInstanceState) {
  15 + super.onCreate(savedInstanceState);
  16 + setContentView(R.layout.activity_electronic_look_cardinfo);
  17 + }
  18 +}
... ...
PersonalCenter/app/src/main/java/com/hjx/personalcenter/activity/FeedBackActivity.java
... ... @@ -0,0 +1,18 @@
  1 +package com.hjx.personalcenter.activity;
  2 +
  3 +import android.app.Activity;
  4 +import android.os.Bundle;
  5 +
  6 +import com.hjx.personalcenter.R;
  7 +
  8 +/**
  9 + * Created by h on 2017/8/11.
  10 + */
  11 +
  12 +public class FeedBackActivity extends Activity{
  13 + @Override
  14 + protected void onCreate(Bundle savedInstanceState) {
  15 + super.onCreate(savedInstanceState);
  16 + setContentView(R.layout.activity_feedback);
  17 + }
  18 +}
... ...
PersonalCenter/app/src/main/java/com/hjx/personalcenter/activity/MainActivity.java
... ... @@ -18,7 +18,7 @@ public class MainActivity extends AppCompatActivity {
18 18 ssss.setOnClickListener(new View.OnClickListener() {
19 19 @Override
20 20 public void onClick(View v) {
21   - Intent intent = new Intent(MainActivity.this,LoginAndRegisterActivity.class);
  21 + Intent intent = new Intent(MainActivity.this,RegisterInfoActivity.class);
22 22 startActivity(intent);
23 23 }
24 24 });
... ...
PersonalCenter/app/src/main/res/drawable/corcle_blue_bg.xml
... ... @@ -0,0 +1,13 @@
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<shape xmlns:android="http://schemas.android.com/apk/res/android"
  3 + android:shape="rectangle">
  4 + <solid
  5 + android:color="@color/white"/>
  6 + <corners
  7 + android:bottomLeftRadius="20dp"
  8 + android:topLeftRadius="20dp"
  9 + android:bottomRightRadius="20dp"
  10 + android:topRightRadius="20dp"/>
  11 + <stroke android:width="1dp"
  12 + android:color="@color/login_text_blue"/>
  13 +</shape>
0 14 \ No newline at end of file
... ...
PersonalCenter/app/src/main/res/drawable/corcle_white_bg.xml
... ... @@ -1,13 +0,0 @@
1   -<?xml version="1.0" encoding="utf-8"?>
2   -<shape xmlns:android="http://schemas.android.com/apk/res/android"
3   - android:shape="rectangle">
4   - <solid
5   - android:color="@color/colorAccent"/>
6   - <corners
7   - android:bottomLeftRadius="20dp"
8   - android:topLeftRadius="20dp"
9   - android:bottomRightRadius="20dp"
10   - android:topRightRadius="20dp"/>
11   - <stroke android:width="1dp"
12   - android:color="@color/cutoff_line"/>
13   -</shape>
14 0 \ No newline at end of file
PersonalCenter/app/src/main/res/layout/activity_electronic_look_cardinfo.xml
... ... @@ -0,0 +1,370 @@
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3 + android:layout_width="match_parent"
  4 + android:layout_height="match_parent"
  5 + android:orientation="vertical">
  6 +
  7 + <RelativeLayout
  8 + android:id="@+id/title"
  9 + android:layout_width="match_parent"
  10 + android:layout_height="wrap_content"
  11 + android:background="@color/login_text_blue"
  12 + android:minHeight="50dp">
  13 +
  14 + <ImageView
  15 + android:id="@+id/cancel"
  16 + android:layout_width="wrap_content"
  17 + android:layout_height="wrap_content"
  18 + android:layout_centerVertical="true"
  19 + android:paddingLeft="20dp"
  20 + android:paddingRight="20dp"
  21 + android:src="@mipmap/title_back" />
  22 +
  23 + <TextView
  24 + android:id="@+id/menu_title"
  25 + android:layout_width="wrap_content"
  26 + android:layout_height="wrap_content"
  27 + android:layout_centerInParent="true"
  28 + android:text="@string/string_electroniccard_info_look"
  29 + android:textColor="@android:color/white"
  30 + android:textSize="22sp" />
  31 + </RelativeLayout>
  32 +
  33 + <LinearLayout
  34 + android:layout_width="match_parent"
  35 + android:layout_height="wrap_content"
  36 + android:layout_margin="20dp"
  37 + android:background="@mipmap/cardbackgrangd"
  38 + android:gravity="center"
  39 + android:orientation="vertical">
  40 +
  41 + <LinearLayout
  42 + android:layout_width="match_parent"
  43 + android:layout_height="wrap_content"
  44 + android:layout_marginTop="70dp"
  45 + android:gravity="center_vertical"
  46 + android:orientation="horizontal">
  47 +
  48 + <LinearLayout
  49 + android:layout_width="wrap_content"
  50 + android:layout_height="wrap_content"
  51 + android:layout_marginLeft="200dp"
  52 + android:gravity="center_vertical">
  53 +
  54 + <ImageView
  55 + android:layout_width="wrap_content"
  56 + android:layout_height="wrap_content"
  57 + android:src="@mipmap/logo_info" />
  58 +
  59 + <TextView
  60 + android:layout_width="wrap_content"
  61 + android:layout_height="wrap_content"
  62 + android:layout_marginLeft="50dp"
  63 + android:background="@null"
  64 + android:text="电子保卡"
  65 + android:textColor="@color/electronic_card"
  66 + android:textSize="22sp" />
  67 +
  68 + </LinearLayout>
  69 +
  70 + <LinearLayout
  71 + android:layout_width="wrap_content"
  72 + android:layout_height="80dp"
  73 + android:layout_marginLeft="200dp"
  74 + android:gravity="center_vertical">
  75 +
  76 + <TextView
  77 + android:layout_width="wrap_content"
  78 + android:layout_height="wrap_content"
  79 + android:text="客户姓名"
  80 + android:textColor="@color/btn_text_color"
  81 + android:textSize="22sp" />
  82 +
  83 + <TextView
  84 + android:layout_width="wrap_content"
  85 + android:layout_height="wrap_content"
  86 + android:layout_marginLeft="60dp"
  87 + android:text="王小明"
  88 + android:textColor="@color/btn_text_color"
  89 + android:textSize="22sp" />
  90 +
  91 + </LinearLayout>
  92 +
  93 + </LinearLayout>
  94 +
  95 + <LinearLayout
  96 + android:layout_width="match_parent"
  97 + android:layout_height="wrap_content"
  98 + android:gravity="center_vertical"
  99 + android:orientation="horizontal">
  100 +
  101 + <LinearLayout
  102 + android:layout_width="wrap_content"
  103 + android:layout_height="60dp"
  104 + android:layout_marginLeft="200dp"
  105 + android:gravity="center_vertical">
  106 +
  107 + <TextView
  108 + android:layout_width="wrap_content"
  109 + android:layout_height="wrap_content"
  110 + android:text="产品型号"
  111 + android:textColor="@color/btn_text_color"
  112 + android:textSize="22sp" />
  113 +
  114 + <TextView
  115 + android:layout_width="wrap_content"
  116 + android:layout_height="wrap_content"
  117 + android:layout_marginLeft="50dp"
  118 + android:text="IPone888"
  119 + android:textSize="22sp" />
  120 +
  121 +
  122 + </LinearLayout>
  123 +
  124 + <LinearLayout
  125 + android:layout_width="wrap_content"
  126 + android:layout_height="60dp"
  127 + android:layout_marginLeft="250dp"
  128 + android:gravity="center_vertical">
  129 +
  130 + <TextView
  131 + android:layout_width="wrap_content"
  132 + android:layout_height="wrap_content"
  133 + android:text="客户地址"
  134 + android:textSize="22sp" />
  135 +
  136 + <TextView
  137 + android:layout_width="wrap_content"
  138 + android:layout_height="wrap_content"
  139 + android:layout_marginLeft="98dp"
  140 + android:background="@null"
  141 + android:text="北京市昭阳区三里屯"
  142 + android:textSize="22sp" />
  143 + <TextView
  144 + android:layout_width="wrap_content"
  145 + android:layout_height="wrap_content"
  146 + android:layout_marginLeft="18dp"
  147 + android:background="@drawable/corcle_blue_bg"
  148 + android:text="修改"
  149 + android:paddingLeft="5dp"
  150 + android:paddingRight="5dp"
  151 + android:textColor="@color/login_text_blue"
  152 + android:textSize="18sp" />
  153 +
  154 +
  155 + </LinearLayout>
  156 +
  157 + </LinearLayout>
  158 +
  159 + <LinearLayout
  160 + android:layout_width="match_parent"
  161 + android:layout_height="wrap_content"
  162 + android:gravity="center_vertical"
  163 + android:orientation="horizontal">
  164 +
  165 + <LinearLayout
  166 + android:layout_width="wrap_content"
  167 + android:layout_height="60dp"
  168 + android:layout_marginLeft="200dp"
  169 + android:gravity="center_vertical">
  170 +
  171 + <TextView
  172 + android:layout_width="wrap_content"
  173 + android:layout_height="wrap_content"
  174 + android:text="MAC地址"
  175 + android:textSize="22sp" />
  176 +
  177 + <TextView
  178 + android:layout_width="wrap_content"
  179 + android:layout_height="wrap_content"
  180 + android:layout_marginLeft="50dp"
  181 + android:background="@null"
  182 + android:text="237462873463278"
  183 + android:textSize="22sp" />
  184 +
  185 + </LinearLayout>
  186 +
  187 + <LinearLayout
  188 + android:layout_width="wrap_content"
  189 + android:layout_height="60dp"
  190 + android:layout_marginLeft="210dp"
  191 + android:gravity="center_vertical">
  192 +
  193 + <TextView
  194 + android:layout_width="wrap_content"
  195 + android:layout_height="wrap_content"
  196 + android:text="购买时间"
  197 + android:textColor="@color/btn_text_color"
  198 + android:textSize="22sp" />
  199 +
  200 + <TextView
  201 + android:layout_width="wrap_content"
  202 + android:layout_height="wrap_content"
  203 + android:layout_marginLeft="25dp"
  204 + android:background="@null"
  205 + android:text="4433322-334--34"
  206 + android:textColor="@color/btn_text_color"
  207 + android:textSize="22sp" />
  208 + </LinearLayout>
  209 +
  210 + </LinearLayout>
  211 +
  212 + <LinearLayout
  213 + android:layout_width="match_parent"
  214 + android:layout_height="wrap_content"
  215 + android:gravity="center_vertical"
  216 + android:orientation="horizontal">
  217 +
  218 + <LinearLayout
  219 + android:layout_width="wrap_content"
  220 + android:layout_height="60dp"
  221 + android:layout_marginLeft="200dp"
  222 + android:gravity="center_vertical">
  223 +
  224 + <TextView
  225 + android:layout_width="wrap_content"
  226 + android:layout_height="wrap_content"
  227 + android:text="机身编码"
  228 + android:textColor="@color/btn_text_color"
  229 + android:textSize="22sp" />
  230 +
  231 + <TextView
  232 + android:layout_width="wrap_content"
  233 + android:layout_height="wrap_content"
  234 + android:layout_marginLeft="50dp"
  235 + android:hint="473463746343"
  236 + android:textSize="22sp" />
  237 +
  238 + </LinearLayout>
  239 +
  240 + <LinearLayout
  241 + android:layout_width="wrap_content"
  242 + android:layout_height="60dp"
  243 + android:layout_marginLeft="210dp"
  244 + android:gravity="center_vertical">
  245 +
  246 + <TextView
  247 + android:layout_width="wrap_content"
  248 + android:layout_height="wrap_content"
  249 + android:text="购买地址"
  250 + android:textColor="@color/btn_text_color"
  251 + android:textSize="22sp" />
  252 +
  253 + <TextView
  254 + android:layout_width="wrap_content"
  255 + android:layout_height="wrap_content"
  256 + android:layout_marginLeft="25dp"
  257 + android:text="啥啥啥 专卖店"
  258 + android:textColor="@color/btn_text_color"
  259 + android:textSize="22sp" />
  260 + </LinearLayout>
  261 +
  262 + </LinearLayout>
  263 +
  264 + <LinearLayout
  265 + android:layout_width="match_parent"
  266 + android:layout_height="wrap_content"
  267 + android:gravity="center_vertical"
  268 + android:orientation="horizontal">
  269 +
  270 + <LinearLayout
  271 + android:layout_width="wrap_content"
  272 + android:layout_height="60dp"
  273 + android:layout_marginLeft="200dp"
  274 + android:gravity="center_vertical">
  275 +
  276 + <TextView
  277 + android:layout_width="wrap_content"
  278 + android:layout_height="wrap_content"
  279 + android:text="手机号码"
  280 + android:textColor="@color/btn_text_color"
  281 + android:textSize="22sp" />
  282 +
  283 + <TextView
  284 + android:layout_width="wrap_content"
  285 + android:layout_height="wrap_content"
  286 + android:layout_marginLeft="50dp"
  287 + android:text="IPone888"
  288 + android:textSize="22sp" />
  289 + <TextView
  290 + android:layout_width="wrap_content"
  291 + android:layout_height="wrap_content"
  292 + android:layout_marginLeft="18dp"
  293 + android:background="@drawable/corcle_blue_bg"
  294 + android:text="修改"
  295 + android:paddingLeft="5dp"
  296 + android:paddingRight="5dp"
  297 + android:textColor="@color/login_text_blue"
  298 + android:textSize="18sp" />
  299 +
  300 +
  301 + </LinearLayout>
  302 +
  303 + <LinearLayout
  304 + android:layout_width="wrap_content"
  305 + android:layout_height="60dp"
  306 + android:layout_marginLeft="250dp"
  307 + android:gravity="center_vertical">
  308 +
  309 + <TextView
  310 + android:layout_width="wrap_content"
  311 + android:layout_height="wrap_content"
  312 + android:text="本地售后电话"
  313 + android:textSize="22sp" />
  314 +
  315 + <TextView
  316 + android:layout_width="wrap_content"
  317 + android:layout_height="wrap_content"
  318 + android:layout_marginLeft="98dp"
  319 + android:background="@null"
  320 + android:text="1111111"
  321 + android:textSize="22sp" />
  322 +
  323 + </LinearLayout>
  324 +
  325 + </LinearLayout>
  326 + </LinearLayout>
  327 +
  328 + <LinearLayout
  329 + android:layout_width="match_parent"
  330 + android:layout_height="wrap_content"
  331 + android:layout_marginTop="5dp"
  332 + android:gravity="center"
  333 + android:orientation="vertical">
  334 +
  335 + <TextView
  336 + android:layout_width="wrap_content"
  337 + android:layout_height="wrap_content"
  338 + android:layout_marginTop="5dp"
  339 + android:text="@string/electronic_card"
  340 + android:textColor="@color/electronic_text"
  341 + android:textSize="18sp" />
  342 +
  343 +
  344 +
  345 + </LinearLayout>
  346 + <LinearLayout
  347 + android:layout_width="match_parent"
  348 + android:layout_height="wrap_content"
  349 + android:layout_marginTop="30dp"
  350 + android:gravity="center"
  351 + android:orientation="horizontal">
  352 +
  353 + <ImageView
  354 + android:layout_width="wrap_content"
  355 + android:layout_height="wrap_content"
  356 + android:src="@mipmap/phone"/>
  357 + <TextView
  358 + android:layout_width="wrap_content"
  359 + android:layout_height="wrap_content"
  360 + android:textSize="30sp"
  361 + android:layout_marginLeft="5dp"
  362 + android:textColor="@color/login_text_blue"
  363 + android:text="400-400-000"/>
  364 +
  365 +
  366 + </LinearLayout>
  367 +
  368 +
  369 +
  370 +</LinearLayout>
0 371 \ No newline at end of file
... ...
PersonalCenter/app/src/main/res/layout/activity_electroniccard_info.xml
... ... @@ -0,0 +1,364 @@
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3 + android:layout_width="match_parent"
  4 + android:layout_height="match_parent"
  5 + android:orientation="vertical">
  6 +
  7 + <RelativeLayout
  8 + android:id="@+id/title"
  9 + android:layout_width="match_parent"
  10 + android:layout_height="wrap_content"
  11 + android:background="@color/login_text_blue"
  12 + android:minHeight="50dp">
  13 +
  14 + <ImageView
  15 + android:id="@+id/cancel"
  16 + android:layout_width="wrap_content"
  17 + android:layout_height="wrap_content"
  18 + android:layout_centerVertical="true"
  19 + android:paddingLeft="20dp"
  20 + android:paddingRight="20dp"
  21 + android:src="@mipmap/title_back" />
  22 +
  23 + <TextView
  24 + android:id="@+id/menu_title"
  25 + android:layout_width="wrap_content"
  26 + android:layout_height="wrap_content"
  27 + android:layout_centerInParent="true"
  28 + android:text="@string/change_electroniccard_info_fill"
  29 + android:textColor="@android:color/white"
  30 + android:textSize="22sp" />
  31 + </RelativeLayout>
  32 +
  33 + <ImageView
  34 + android:layout_width="wrap_content"
  35 + android:layout_height="wrap_content"
  36 + android:layout_gravity="center"
  37 + android:layout_marginTop="20dp"
  38 + android:src="@mipmap/change_info_icon" />
  39 + <LinearLayout
  40 + android:layout_width="wrap_content"
  41 + android:layout_height="wrap_content"
  42 + android:layout_marginTop="20dp"
  43 + android:orientation="horizontal">
  44 + <View
  45 + android:layout_width="450dp"
  46 + android:layout_height="0.7dp"
  47 + android:layout_marginLeft="150dp"
  48 + android:background="@color/electronic_text">
  49 +
  50 + </View>
  51 + <View
  52 + android:layout_width="400dp"
  53 + android:layout_height="0.7dp"
  54 + android:layout_marginLeft="80dp"
  55 + android:background="@color/electronic_text">
  56 +
  57 + </View>
  58 +
  59 +
  60 + </LinearLayout>
  61 +
  62 + <LinearLayout
  63 + android:layout_width="match_parent"
  64 + android:layout_height="wrap_content"
  65 + android:gravity="center_vertical"
  66 + android:orientation="horizontal">
  67 +
  68 + <LinearLayout
  69 + android:layout_width="wrap_content"
  70 + android:layout_height="80dp"
  71 + android:layout_marginLeft="200dp"
  72 + android:gravity="center_vertical">
  73 +
  74 + <TextView
  75 + android:layout_width="wrap_content"
  76 + android:layout_height="wrap_content"
  77 + android:text="客户姓名"
  78 + android:textColor="@color/btn_text_color"
  79 + android:textSize="22sp" />
  80 +
  81 + <EditText
  82 + android:layout_width="wrap_content"
  83 + android:layout_height="wrap_content"
  84 + android:background="@null"
  85 + android:layout_marginLeft="50dp"
  86 + android:textColor="@color/electronic_text"
  87 + android:hint="请输入"
  88 + android:textSize="22sp" />
  89 +
  90 + </LinearLayout>
  91 +
  92 + <LinearLayout
  93 + android:layout_width="wrap_content"
  94 + android:layout_height="80dp"
  95 + android:layout_marginLeft="300dp"
  96 + android:gravity="center_vertical">
  97 +
  98 + <TextView
  99 + android:layout_width="wrap_content"
  100 + android:layout_height="wrap_content"
  101 + android:text="购买地址"
  102 + android:textColor="@color/btn_text_color"
  103 + android:textSize="22sp" />
  104 +
  105 + <TextView
  106 + android:layout_width="wrap_content"
  107 + android:layout_height="wrap_content"
  108 + android:text="请选择地区"
  109 + android:layout_marginLeft="60dp"
  110 + android:textColor="@color/btn_text_color"
  111 + android:textSize="22sp" />
  112 +
  113 + <ImageView
  114 + android:layout_width="wrap_content"
  115 + android:layout_height="wrap_content"
  116 + android:layout_marginLeft="50dp"
  117 + android:src="@mipmap/xiajiantou">
  118 +
  119 + </ImageView>
  120 + </LinearLayout>
  121 +
  122 + </LinearLayout>
  123 + <LinearLayout
  124 + android:layout_width="wrap_content"
  125 + android:layout_height="wrap_content"
  126 + android:orientation="horizontal">
  127 + <View
  128 + android:layout_width="450dp"
  129 + android:layout_height="0.7dp"
  130 + android:layout_marginLeft="150dp"
  131 + android:background="@color/electronic_text">
  132 +
  133 + </View>
  134 + <View
  135 + android:layout_width="400dp"
  136 + android:layout_height="0.7dp"
  137 + android:layout_marginLeft="80dp"
  138 + android:background="@color/electronic_text">
  139 +
  140 + </View>
  141 +
  142 +
  143 + </LinearLayout>
  144 +
  145 + <LinearLayout
  146 + android:layout_width="match_parent"
  147 + android:layout_height="wrap_content"
  148 + android:gravity="center_vertical"
  149 + android:orientation="horizontal">
  150 +
  151 + <LinearLayout
  152 + android:layout_width="wrap_content"
  153 + android:layout_height="80dp"
  154 + android:layout_marginLeft="200dp"
  155 + android:gravity="center_vertical">
  156 +
  157 + <TextView
  158 + android:layout_width="wrap_content"
  159 + android:layout_height="wrap_content"
  160 + android:text="客户地址"
  161 + android:textColor="@color/btn_text_color"
  162 + android:textSize="22sp" />
  163 +
  164 + <TextView
  165 + android:layout_width="wrap_content"
  166 + android:layout_height="wrap_content"
  167 + android:text="请选择地区"
  168 + android:layout_marginLeft="50dp"
  169 + android:textSize="22sp" />
  170 +
  171 + <ImageView
  172 + android:layout_width="wrap_content"
  173 + android:layout_height="wrap_content"
  174 + android:layout_marginLeft="50dp"
  175 + android:src="@mipmap/xiajiantou">
  176 +
  177 + </ImageView>
  178 +
  179 +
  180 + </LinearLayout>
  181 +
  182 + <LinearLayout
  183 + android:layout_width="wrap_content"
  184 + android:layout_height="80dp"
  185 + android:layout_marginLeft="200dp"
  186 + android:gravity="center_vertical">
  187 + <TextView
  188 + android:layout_width="wrap_content"
  189 + android:layout_height="wrap_content"
  190 + android:text=" "
  191 + android:textColor="@color/white"
  192 + android:textSize="22sp" />
  193 + <EditText
  194 + android:layout_width="wrap_content"
  195 + android:layout_height="wrap_content"
  196 + android:layout_marginLeft="98dp"
  197 + android:background="@null"
  198 + android:hint="请输入商店名称"
  199 + android:textSize="22sp" />
  200 +
  201 + </LinearLayout>
  202 +
  203 + </LinearLayout>
  204 + <LinearLayout
  205 + android:layout_width="wrap_content"
  206 + android:layout_height="wrap_content"
  207 +
  208 + android:orientation="horizontal">
  209 + <View
  210 + android:layout_width="450dp"
  211 + android:layout_height="0.7dp"
  212 + android:layout_marginLeft="150dp"
  213 + android:background="@color/electronic_text">
  214 +
  215 + </View>
  216 + <View
  217 + android:layout_width="400dp"
  218 + android:layout_height="0.7dp"
  219 + android:layout_marginLeft="80dp"
  220 + android:background="@color/electronic_text">
  221 +
  222 + </View>
  223 +
  224 +
  225 + </LinearLayout>
  226 +
  227 + <LinearLayout
  228 + android:layout_width="match_parent"
  229 + android:layout_height="wrap_content"
  230 + android:gravity="center_vertical"
  231 + android:orientation="horizontal">
  232 +
  233 + <LinearLayout
  234 + android:layout_width="wrap_content"
  235 + android:layout_height="80dp"
  236 + android:gravity="center_vertical"
  237 + android:layout_marginLeft="200dp">
  238 + <TextView
  239 + android:layout_width="wrap_content"
  240 + android:layout_height="wrap_content"
  241 + android:text=" "
  242 + android:textColor="@color/white"
  243 + android:textSize="22sp" />
  244 +
  245 + <EditText
  246 + android:layout_width="wrap_content"
  247 + android:layout_height="wrap_content"
  248 + android:layout_marginLeft="100dp"
  249 + android:background="@null"
  250 + android:hint="请输入详细地址"
  251 + android:textSize="22sp" />
  252 +
  253 + </LinearLayout>
  254 +
  255 + <LinearLayout
  256 + android:layout_width="wrap_content"
  257 + android:layout_height="80dp"
  258 + android:layout_marginLeft="210dp"
  259 + android:gravity="center_vertical">
  260 +
  261 + <TextView
  262 + android:layout_width="wrap_content"
  263 + android:layout_height="wrap_content"
  264 + android:text="本地售后电话"
  265 + android:textColor="@color/btn_text_color"
  266 + android:textSize="22sp" />
  267 +
  268 + <EditText
  269 + android:layout_width="wrap_content"
  270 + android:layout_height="wrap_content"
  271 + android:hint="请输入"
  272 + android:background="@null"
  273 + android:layout_marginLeft="25dp"
  274 + android:textColor="@color/btn_text_color"
  275 + android:textSize="22sp" />
  276 + </LinearLayout>
  277 +
  278 + </LinearLayout>
  279 + <LinearLayout
  280 + android:layout_width="wrap_content"
  281 + android:layout_height="wrap_content"
  282 +
  283 + android:orientation="horizontal">
  284 + <View
  285 + android:layout_width="450dp"
  286 + android:layout_height="0.7dp"
  287 + android:layout_marginLeft="150dp"
  288 + android:background="@color/electronic_text">
  289 +
  290 + </View>
  291 + <View
  292 + android:layout_width="400dp"
  293 + android:layout_height="0.7dp"
  294 + android:layout_marginLeft="80dp"
  295 + android:background="@color/electronic_text">
  296 +
  297 + </View>
  298 +
  299 +
  300 + </LinearLayout>
  301 +
  302 + <LinearLayout
  303 + android:layout_width="match_parent"
  304 + android:layout_height="wrap_content"
  305 + android:gravity="center_vertical"
  306 + android:orientation="horizontal">
  307 +
  308 + <LinearLayout
  309 + android:id="@+id/lineL_buy_time"
  310 + android:layout_width="wrap_content"
  311 + android:layout_height="80dp"
  312 + android:layout_marginLeft="200dp"
  313 + android:gravity="center_vertical">
  314 +
  315 + <TextView
  316 + android:layout_width="wrap_content"
  317 + android:layout_height="wrap_content"
  318 + android:text="购买时间"
  319 + android:textColor="@color/btn_text_color"
  320 + android:textSize="22sp" />
  321 +
  322 + <TextView
  323 + android:id="@+id/tv_buy_time"
  324 + android:layout_width="wrap_content"
  325 + android:layout_height="wrap_content"
  326 + android:hint="请选择时间"
  327 + android:layout_marginLeft="50dp"
  328 + android:textSize="22sp" />
  329 + <ImageView
  330 + android:layout_width="wrap_content"
  331 + android:layout_height="wrap_content"
  332 + android:layout_marginLeft="50dp"
  333 + android:src="@mipmap/xiajiantou">
  334 +
  335 + </ImageView>
  336 +
  337 + </LinearLayout>
  338 +
  339 + </LinearLayout>
  340 + <LinearLayout
  341 + android:layout_width="wrap_content"
  342 + android:layout_height="wrap_content"
  343 +
  344 + android:orientation="horizontal">
  345 + <View
  346 + android:layout_width="450dp"
  347 + android:layout_height="0.7dp"
  348 + android:layout_marginLeft="150dp"
  349 + android:background="@color/electronic_text">
  350 +
  351 + </View>
  352 +
  353 +
  354 + </LinearLayout>
  355 + <Button
  356 + android:layout_marginLeft="200dp"
  357 + android:layout_marginRight="200dp"
  358 + android:layout_marginTop="80dp"
  359 + android:id="@+id/btn_ok"
  360 + style="@style/button_login_register_style"
  361 + android:text="@string/string_regist_next" />
  362 +
  363 +
  364 +</LinearLayout>
0 365 \ No newline at end of file
... ...
PersonalCenter/app/src/main/res/layout/activity_feedback.xml
... ... @@ -0,0 +1,82 @@
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3 + android:orientation="vertical" android:layout_width="match_parent"
  4 + android:layout_height="match_parent"
  5 + android:background="@color/backgerangde_laout">
  6 + <RelativeLayout
  7 + android:id="@+id/title"
  8 + android:layout_width="match_parent"
  9 + android:layout_height="50dp"
  10 + android:background="@color/login_text_blue">
  11 +
  12 + <ImageView
  13 + android:id="@+id/cancel"
  14 + android:layout_width="wrap_content"
  15 + android:layout_height="match_parent"
  16 + android:paddingLeft="20dp"
  17 + android:paddingRight="20dp"
  18 + android:src="@mipmap/title_back" />
  19 +
  20 + <TextView
  21 + android:id="@+id/menu_title"
  22 + android:layout_width="wrap_content"
  23 + android:layout_height="match_parent"
  24 + android:layout_centerInParent="true"
  25 + android:gravity="center_vertical"
  26 + android:text="意见反馈"
  27 + android:textColor="@android:color/white"
  28 + android:textSize="22sp" />
  29 + <TextView
  30 + android:id="@+id/feedback_sub"
  31 + android:layout_width="wrap_content"
  32 + android:layout_height="match_parent"
  33 + android:paddingLeft="20dp"
  34 + android:paddingRight="20dp"
  35 + android:gravity="center_vertical"
  36 + android:layout_alignParentRight="true"
  37 + android:text="提交"
  38 + android:textColor="@android:color/white"
  39 + android:textSize="22sp" />
  40 +
  41 +
  42 + </RelativeLayout>
  43 + <EditText
  44 + android:id="@+id/feedback_content"
  45 + android:layout_width="match_parent"
  46 + android:layout_height="250dp"
  47 + android:hint="@string/feedback"
  48 + android:textColor="@color/electronic_text"
  49 + android:textSize="18sp"
  50 + android:textScaleX="1"
  51 + android:padding="20dp"
  52 + android:gravity="top"
  53 + android:background="@color/white"/>
  54 + <LinearLayout
  55 + android:id="@+id/take_phone"
  56 + android:layout_width="match_parent"
  57 + android:layout_height="wrap_content"
  58 + android:background="@color/white">
  59 + <ImageView
  60 + android:layout_margin="20dp"
  61 + android:layout_width="wrap_content"
  62 + android:layout_height="wrap_content"
  63 + android:src="@mipmap/feedback_take_phone"/>
  64 +
  65 + </LinearLayout>
  66 + <EditText
  67 + android:layout_width="match_parent"
  68 + android:layout_marginTop="20dp"
  69 + android:background="@color/white"
  70 + android:hint="@string/qq"
  71 + android:padding="20dp"
  72 + android:layout_height="60dp" />
  73 + <TextView
  74 + android:layout_width="match_parent"
  75 + android:text="@string/hint"
  76 + android:padding="20dp"
  77 + android:textSize="18sp"
  78 + android:layout_height="60dp" />
  79 +
  80 +
  81 +
  82 +</LinearLayout>
0 83 \ No newline at end of file
... ...
PersonalCenter/app/src/main/res/layout/activity_ok_cardinfo.xml
... ... @@ -0,0 +1,363 @@
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3 + android:layout_width="match_parent"
  4 + android:layout_height="match_parent"
  5 + android:orientation="vertical">
  6 +
  7 + <RelativeLayout
  8 + android:id="@+id/title"
  9 + android:layout_width="match_parent"
  10 + android:layout_height="wrap_content"
  11 + android:background="@color/login_text_blue"
  12 + android:minHeight="50dp">
  13 +
  14 + <ImageView
  15 + android:id="@+id/cancel"
  16 + android:layout_width="wrap_content"
  17 + android:layout_height="wrap_content"
  18 + android:layout_centerVertical="true"
  19 + android:paddingLeft="20dp"
  20 + android:paddingRight="20dp"
  21 + android:src="@mipmap/title_back" />
  22 +
  23 + <TextView
  24 + android:id="@+id/menu_title"
  25 + android:layout_width="wrap_content"
  26 + android:layout_height="wrap_content"
  27 + android:layout_centerInParent="true"
  28 + android:text="@string/string_electroniccard_info_ok"
  29 + android:textColor="@android:color/white"
  30 + android:textSize="22sp" />
  31 + </RelativeLayout>
  32 +
  33 + <LinearLayout
  34 + android:layout_width="match_parent"
  35 + android:layout_height="wrap_content"
  36 + android:layout_margin="20dp"
  37 + android:background="@mipmap/cardbackgrangd"
  38 + android:gravity="center"
  39 + android:orientation="vertical">
  40 +
  41 + <LinearLayout
  42 + android:layout_width="match_parent"
  43 + android:layout_height="wrap_content"
  44 + android:layout_marginTop="70dp"
  45 + android:gravity="center_vertical"
  46 + android:orientation="horizontal">
  47 +
  48 + <LinearLayout
  49 + android:layout_width="wrap_content"
  50 + android:layout_height="wrap_content"
  51 + android:layout_marginLeft="200dp"
  52 + android:gravity="center_vertical">
  53 +
  54 + <ImageView
  55 + android:layout_width="wrap_content"
  56 + android:layout_height="wrap_content"
  57 + android:src="@mipmap/logo_info" />
  58 +
  59 + <TextView
  60 + android:layout_width="wrap_content"
  61 + android:layout_height="wrap_content"
  62 + android:layout_marginLeft="50dp"
  63 + android:background="@null"
  64 + android:text="电子保卡"
  65 + android:textColor="@color/login_text_blue"
  66 + android:textSize="22sp" />
  67 +
  68 + </LinearLayout>
  69 +
  70 + <LinearLayout
  71 + android:layout_width="wrap_content"
  72 + android:layout_height="80dp"
  73 + android:layout_marginLeft="200dp"
  74 + android:gravity="center_vertical">
  75 +
  76 + <TextView
  77 + android:layout_width="wrap_content"
  78 + android:layout_height="wrap_content"
  79 + android:text="客户姓名"
  80 + android:textColor="@color/btn_text_color"
  81 + android:textSize="22sp" />
  82 +
  83 + <TextView
  84 + android:layout_width="wrap_content"
  85 + android:layout_height="wrap_content"
  86 + android:layout_marginLeft="60dp"
  87 + android:text="王小明"
  88 + android:textColor="@color/btn_text_color"
  89 + android:textSize="22sp" />
  90 +
  91 + </LinearLayout>
  92 +
  93 + </LinearLayout>
  94 +
  95 + <LinearLayout
  96 + android:layout_width="match_parent"
  97 + android:layout_height="wrap_content"
  98 + android:gravity="center_vertical"
  99 + android:orientation="horizontal">
  100 +
  101 + <LinearLayout
  102 + android:layout_width="wrap_content"
  103 + android:layout_height="60dp"
  104 + android:layout_marginLeft="200dp"
  105 + android:gravity="center_vertical">
  106 +
  107 + <TextView
  108 + android:layout_width="wrap_content"
  109 + android:layout_height="wrap_content"
  110 + android:text="产品型号"
  111 + android:textColor="@color/btn_text_color"
  112 + android:textSize="22sp" />
  113 +
  114 + <TextView
  115 + android:layout_width="wrap_content"
  116 + android:layout_height="wrap_content"
  117 + android:layout_marginLeft="50dp"
  118 + android:text="IPone888"
  119 + android:textSize="22sp" />
  120 +
  121 +
  122 + </LinearLayout>
  123 +
  124 + <LinearLayout
  125 + android:layout_width="wrap_content"
  126 + android:layout_height="60dp"
  127 + android:layout_marginLeft="250dp"
  128 + android:gravity="center_vertical">
  129 +
  130 + <TextView
  131 + android:layout_width="wrap_content"
  132 + android:layout_height="wrap_content"
  133 + android:text="客户地址"
  134 + android:textSize="22sp" />
  135 +
  136 + <TextView
  137 + android:layout_width="wrap_content"
  138 + android:layout_height="wrap_content"
  139 + android:layout_marginLeft="98dp"
  140 + android:background="@null"
  141 + android:text="北京市昭阳区三里屯"
  142 + android:textSize="22sp" />
  143 +
  144 + </LinearLayout>
  145 +
  146 + </LinearLayout>
  147 +
  148 + <LinearLayout
  149 + android:layout_width="match_parent"
  150 + android:layout_height="wrap_content"
  151 + android:gravity="center_vertical"
  152 + android:orientation="horizontal">
  153 +
  154 + <LinearLayout
  155 + android:layout_width="wrap_content"
  156 + android:layout_height="60dp"
  157 + android:layout_marginLeft="200dp"
  158 + android:gravity="center_vertical">
  159 +
  160 + <TextView
  161 + android:layout_width="wrap_content"
  162 + android:layout_height="wrap_content"
  163 + android:text="MAC地址"
  164 + android:textSize="22sp" />
  165 +
  166 + <TextView
  167 + android:layout_width="wrap_content"
  168 + android:layout_height="wrap_content"
  169 + android:layout_marginLeft="50dp"
  170 + android:background="@null"
  171 + android:text="237462873463278"
  172 + android:textSize="22sp" />
  173 +
  174 + </LinearLayout>
  175 +
  176 + <LinearLayout
  177 + android:layout_width="wrap_content"
  178 + android:layout_height="60dp"
  179 + android:layout_marginLeft="210dp"
  180 + android:gravity="center_vertical">
  181 +
  182 + <TextView
  183 + android:layout_width="wrap_content"
  184 + android:layout_height="wrap_content"
  185 + android:text="购买时间"
  186 + android:textColor="@color/btn_text_color"
  187 + android:textSize="22sp" />
  188 +
  189 + <TextView
  190 + android:layout_width="wrap_content"
  191 + android:layout_height="wrap_content"
  192 + android:layout_marginLeft="25dp"
  193 + android:background="@null"
  194 + android:text="4433322-334--34"
  195 + android:textColor="@color/btn_text_color"
  196 + android:textSize="22sp" />
  197 + </LinearLayout>
  198 +
  199 + </LinearLayout>
  200 +
  201 + <LinearLayout
  202 + android:layout_width="match_parent"
  203 + android:layout_height="wrap_content"
  204 + android:gravity="center_vertical"
  205 + android:orientation="horizontal">
  206 +
  207 + <LinearLayout
  208 + android:layout_width="wrap_content"
  209 + android:layout_height="60dp"
  210 + android:layout_marginLeft="200dp"
  211 + android:gravity="center_vertical">
  212 +
  213 + <TextView
  214 + android:layout_width="wrap_content"
  215 + android:layout_height="wrap_content"
  216 + android:text="机身编码"
  217 + android:textColor="@color/btn_text_color"
  218 + android:textSize="22sp" />
  219 +
  220 + <TextView
  221 + android:layout_width="wrap_content"
  222 + android:layout_height="wrap_content"
  223 + android:layout_marginLeft="50dp"
  224 + android:hint="473463746343"
  225 + android:textSize="22sp" />
  226 +
  227 + </LinearLayout>
  228 +
  229 + <LinearLayout
  230 + android:layout_width="wrap_content"
  231 + android:layout_height="60dp"
  232 + android:layout_marginLeft="210dp"
  233 + android:gravity="center_vertical">
  234 +
  235 + <TextView
  236 + android:layout_width="wrap_content"
  237 + android:layout_height="wrap_content"
  238 + android:text="购买地址"
  239 + android:textColor="@color/btn_text_color"
  240 + android:textSize="22sp" />
  241 +
  242 + <TextView
  243 + android:layout_width="wrap_content"
  244 + android:layout_height="wrap_content"
  245 + android:layout_marginLeft="25dp"
  246 + android:text="啥啥啥 专卖店"
  247 + android:textColor="@color/btn_text_color"
  248 + android:textSize="22sp" />
  249 + </LinearLayout>
  250 +
  251 + </LinearLayout>
  252 +
  253 + <LinearLayout
  254 + android:layout_width="match_parent"
  255 + android:layout_height="wrap_content"
  256 + android:gravity="center_vertical"
  257 + android:orientation="horizontal">
  258 +
  259 + <LinearLayout
  260 + android:layout_width="wrap_content"
  261 + android:layout_height="60dp"
  262 + android:layout_marginLeft="200dp"
  263 + android:gravity="center_vertical">
  264 +
  265 + <TextView
  266 + android:layout_width="wrap_content"
  267 + android:layout_height="wrap_content"
  268 + android:text="手机号码"
  269 + android:textColor="@color/btn_text_color"
  270 + android:textSize="22sp" />
  271 +
  272 + <TextView
  273 + android:layout_width="wrap_content"
  274 + android:layout_height="wrap_content"
  275 + android:layout_marginLeft="50dp"
  276 + android:text="IPone888"
  277 + android:textSize="22sp" />
  278 +
  279 +
  280 + </LinearLayout>
  281 +
  282 + <LinearLayout
  283 + android:layout_width="wrap_content"
  284 + android:layout_height="60dp"
  285 + android:layout_marginLeft="250dp"
  286 + android:gravity="center_vertical">
  287 +
  288 + <TextView
  289 + android:layout_width="wrap_content"
  290 + android:layout_height="wrap_content"
  291 + android:text="本地售后电话"
  292 + android:textSize="22sp" />
  293 +
  294 + <TextView
  295 + android:layout_width="wrap_content"
  296 + android:layout_height="wrap_content"
  297 + android:layout_marginLeft="98dp"
  298 + android:background="@null"
  299 + android:text="1111111"
  300 + android:textSize="22sp" />
  301 +
  302 + </LinearLayout>
  303 +
  304 + </LinearLayout>
  305 + </LinearLayout>
  306 +
  307 + <LinearLayout
  308 + android:layout_width="match_parent"
  309 + android:layout_height="wrap_content"
  310 + android:layout_marginTop="5dp"
  311 + android:gravity="center"
  312 + android:orientation="vertical">
  313 +
  314 + <TextView
  315 + android:layout_width="wrap_content"
  316 + android:layout_height="wrap_content"
  317 + android:layout_marginTop="5dp"
  318 + android:text="@string/electronic_card3"
  319 + android:textColor="@color/electronic_text"
  320 + android:textSize="18sp" />
  321 +
  322 + <TextView
  323 + android:layout_width="wrap_content"
  324 + android:layout_height="wrap_content"
  325 + android:layout_marginTop="5dp"
  326 + android:text="@string/electronic_card4"
  327 + android:textColor="@color/electronic_text"
  328 + android:textSize="18sp" />
  329 +
  330 +
  331 + </LinearLayout>
  332 +
  333 + <LinearLayout
  334 + android:layout_width="match_parent"
  335 + android:layout_height="wrap_content"
  336 + android:layout_marginTop="30dp"
  337 + android:gravity="center"
  338 + android:orientation="horizontal">
  339 +
  340 + <Button
  341 + android:id="@+id/btn_bangding"
  342 + android:layout_width="300dp"
  343 + android:layout_height="wrap_content"
  344 + android:background="@drawable/selector_blue_btn_bg"
  345 + android:text="@string/bangding"
  346 + android:textColor="@color/white"
  347 + android:textSize="23sp" />
  348 +
  349 + <Button
  350 + android:id="@+id/btn_ok"
  351 + android:layout_width="300dp"
  352 + android:layout_height="wrap_content"
  353 + android:layout_marginLeft="50dp"
  354 + android:background="@drawable/selector_blue_btn_bg"
  355 + android:text="@string/finish"
  356 + android:textColor="@color/white"
  357 + android:textSize="23sp" />
  358 +
  359 +
  360 + </LinearLayout>
  361 +
  362 +
  363 +</LinearLayout>
0 364 \ No newline at end of file
... ...
PersonalCenter/app/src/main/res/mipmap-xhdpi/cardbackgrangd.png

8.88 KB

PersonalCenter/app/src/main/res/mipmap-xhdpi/change_info_icon.png

5.91 KB

PersonalCenter/app/src/main/res/mipmap-xhdpi/feedback_take_phone.png

2.85 KB

PersonalCenter/app/src/main/res/mipmap-xhdpi/logo_info.png

5.04 KB

PersonalCenter/app/src/main/res/mipmap-xhdpi/phone.png

772 Bytes

PersonalCenter/app/src/main/res/mipmap-xhdpi/pic_phone.png

1.66 KB

PersonalCenter/app/src/main/res/mipmap-xhdpi/xiajiantou.png

429 Bytes

PersonalCenter/app/src/main/res/values/colors.xml
... ... @@ -12,5 +12,7 @@
12 12 <color name="login_edittext_pressed">#1cb8ff</color>
13 13 <color name="cutoff_line">#CCCCCC</color>
14 14 <color name="electronic_card">#ff480f</color>
  15 + <color name="electronic_text">#afafaf</color>
  16 + <color name="backgerangde_laout">#eeeeee</color>
15 17  
16 18 </resources>
... ...
PersonalCenter/app/src/main/res/values/strings.xml
... ... @@ -16,14 +16,28 @@
16 16 <string name="string_regist_school">学校</string>
17 17 <string name="string_regist_next">下一步</string>
18 18 <string name="string_start_page">开始学习体验</string>
  19 + <string name="bangding">绑定家长控制</string>
  20 + <string name="finish">完成</string>
19 21  
20 22 //电子保卡
21 23 <string name="string_electroniccard_info_title">填写保卡信息</string>
22 24 <string name="string_electroniccard_info_fill">填写电子保卡</string>
  25 + <string name="change_electroniccard_info_fill">修改保卡信息</string>
23 26 <string name="string_electroniccard_info_change">修改保卡信息</string>
  27 + <string name="string_electroniccard_info_ok">确认保卡信息</string>
  28 + <string name="string_electroniccard_info_look">好记星-电子报卡</string>
24 29 <string name="string_electroniccard_change_bangding">更换绑定</string>
  30 + <string name="electronic_card">温馨提示:若您想修改的相关信息请拨打客服电话</string>
25 31 <string name="electronic_card1">请先填写《好记星-电子保卡》信息</string>
26 32 <string name="electronic_card2">该信息是本产品的三包证明,为维护您的合法权益,请认真填写</string>
  33 + <string name="electronic_card3">您已填写完《好记星-电子保卡》信息</string>
  34 + <string name="electronic_card4">您也可以设置家长管理,用手机及时了解和管理孩子的学习情况</string>
  35 +
  36 + //意见反馈
  37 + <string name="feedback">写下您对我们产品的意见吧,我们将努力完善,最多输入500字。</string>
  38 + <string name="qq">QQ或手机号码</string>
  39 + <string name="hint">留下您的联系方式,方便与您沟通。</string>
  40 +
27 41  
28 42  
29 43 </resources>
... ...
PersonalCenter/pickerview/.gitignore
... ... @@ -0,0 +1 @@
  1 +/build
... ...
PersonalCenter/pickerview/build.gradle
... ... @@ -0,0 +1,49 @@
  1 +apply plugin: 'com.android.library'
  2 +apply plugin: 'maven'
  3 +apply plugin: 'com.novoda.bintray-release'//添加插件
  4 +
  5 +
  6 +
  7 +android {
  8 + compileSdkVersion 25
  9 + buildToolsVersion "25.0.2"
  10 +
  11 + defaultConfig {
  12 + minSdkVersion 15
  13 + targetSdkVersion 25
  14 + versionCode 22
  15 + versionName "3.2.6"
  16 + }
  17 + buildTypes {
  18 + release {
  19 + minifyEnabled false
  20 + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
  21 + }
  22 + }
  23 + lintOptions {
  24 + abortOnError false
  25 + }
  26 +}
  27 +
  28 +allprojects {
  29 + tasks.withType(Javadoc) {//兼容中文字符
  30 + options{
  31 + encoding "UTF-8"
  32 + charSet 'UTF-8'
  33 + links "http://docs.oracle.com/javase/7/docs/api"
  34 + }
  35 + }
  36 +}
  37 +publish {
  38 + userOrg = 'contrarywind'//bintray.com 用户名/组织名 user/org name
  39 + groupId = 'com.contrarywind'//JCenter上显示的路径 path
  40 + artifactId = 'Android-PickerView'//项目名称 project name
  41 + publishVersion = '3.2.6'//版本号 version code
  42 + desc = 'this is a pickerview for android'//项目描述 description
  43 + website = 'https://github.com/Contrarywind/Android-PickerView' //项目网址链接 link
  44 +}
  45 +
  46 +dependencies {
  47 + compile fileTree(include: ['*.jar'], dir: 'libs')
  48 +
  49 +}
0 50 \ No newline at end of file
... ...
PersonalCenter/pickerview/proguard-rules.pro
... ... @@ -0,0 +1,17 @@
  1 +# Add project specific ProGuard rules here.
  2 +# By default, the flags in this file are appended to flags specified
  3 +# in /Users/Sai/Documents/software/sdk/tools/proguard/proguard-android.txt
  4 +# You can edit the include path and order by changing the proguardFiles
  5 +# directive in build.gradle.
  6 +#
  7 +# For more details, see
  8 +# http://developer.android.com/guide/developing/tools/proguard.html
  9 +
  10 +# Add any project specific keep options here:
  11 +
  12 +# If your project uses WebView with JS, uncomment the following
  13 +# and specify the fully qualified class name to the JavaScript interface
  14 +# class:
  15 +#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
  16 +# public *;
  17 +#}
... ...
PersonalCenter/pickerview/src/androidTest/java/com/bigkoo/pickerview/ApplicationTest.java
... ... @@ -0,0 +1,13 @@
  1 +package com.bigkoo.pickerview;
  2 +
  3 +import android.app.Application;
  4 +import android.test.ApplicationTestCase;
  5 +
  6 +/**
  7 + * <a href="http://d.android.com/tools/testing/testing_android.html">Testing Fundamentals</a>
  8 + */
  9 +public class ApplicationTest extends ApplicationTestCase<Application> {
  10 + public ApplicationTest() {
  11 + super(Application.class);
  12 + }
  13 +}
0 14 \ No newline at end of file
... ...
PersonalCenter/pickerview/src/main/AndroidManifest.xml
... ... @@ -0,0 +1,5 @@
  1 +<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  2 + package="com.bigkoo.pickerview">
  3 +
  4 +
  5 +</manifest>
... ...
PersonalCenter/pickerview/src/main/java/com/bigkoo/pickerview/OptionsPickerView.java
... ... @@ -0,0 +1,542 @@
  1 +package com.bigkoo.pickerview;
  2 +
  3 +import android.content.Context;
  4 +import android.graphics.Typeface;
  5 +import android.text.TextUtils;
  6 +import android.view.LayoutInflater;
  7 +import android.view.View;
  8 +import android.view.ViewGroup;
  9 +import android.widget.Button;
  10 +import android.widget.LinearLayout;
  11 +import android.widget.RelativeLayout;
  12 +import android.widget.TextView;
  13 +
  14 +import com.bigkoo.pickerview.lib.WheelView;
  15 +import com.bigkoo.pickerview.listener.CustomListener;
  16 +import com.bigkoo.pickerview.view.BasePickerView;
  17 +import com.bigkoo.pickerview.view.WheelOptions;
  18 +
  19 +import java.util.List;
  20 +
  21 +/**
  22 + * 条件选择器
  23 + * Created by Sai on 15/11/22.
  24 + */
  25 +public class OptionsPickerView<T> extends BasePickerView implements View.OnClickListener {
  26 +
  27 + WheelOptions<T> wheelOptions;
  28 + private int layoutRes;
  29 + private CustomListener customListener;
  30 + private Button btnSubmit, btnCancel; //确定、取消按钮
  31 + private TextView tvTitle;
  32 + private RelativeLayout rv_top_bar;
  33 +
  34 + private static final String TAG_SUBMIT = "submit";
  35 + private static final String TAG_CANCEL = "cancel";
  36 +
  37 + private OnOptionsSelectListener optionsSelectListener;
  38 +
  39 + private String Str_Submit;//确定按钮文字
  40 + private String Str_Cancel;//取消按钮文字
  41 + private String Str_Title;//标题文字
  42 +
  43 + private int Color_Submit;//确定按钮颜色
  44 + private int Color_Cancel;//取消按钮颜色
  45 + private int Color_Title;//标题颜色
  46 +
  47 + private int Color_Background_Wheel;//滚轮背景颜色
  48 + private int Color_Background_Title;//标题背景颜色
  49 +
  50 + private int Size_Submit_Cancel;//确定取消按钮大小
  51 + private int Size_Title;//标题文字大小
  52 + private int Size_Content;//内容文字大小
  53 +
  54 + private int textColorOut; //分割线以外的文字颜色
  55 + private int textColorCenter; //分割线之间的文字颜色
  56 + private int dividerColor; //分割线的颜色
  57 + private int backgroundId; //显示时的外部背景色颜色,默认是灰色
  58 + // 条目间距倍数 默认1.6
  59 + private float lineSpacingMultiplier = 1.6F;
  60 + private boolean isDialog;//是否是对话框模式
  61 +
  62 + private boolean cancelable;//是否能取消
  63 + private boolean linkage;//是否联动
  64 +
  65 + private boolean isCenterLabel ;//是否只显示中间的label
  66 +
  67 + private String label1;//单位
  68 + private String label2;
  69 + private String label3;
  70 +
  71 + private boolean cyclic1;//是否循环
  72 + private boolean cyclic2;
  73 + private boolean cyclic3;
  74 +
  75 + private Typeface font;//字体样式
  76 +
  77 + private int option1;//默认选中项
  78 + private int option2;
  79 + private int option3;
  80 + private WheelView.DividerType dividerType;//分隔线类型
  81 +
  82 + //构造方法
  83 + public OptionsPickerView(Builder builder) {
  84 + super(builder.context);
  85 + this.optionsSelectListener = builder.optionsSelectListener;
  86 + this.Str_Submit = builder.Str_Submit;
  87 + this.Str_Cancel = builder.Str_Cancel;
  88 + this.Str_Title = builder.Str_Title;
  89 +
  90 + this.Color_Submit = builder.Color_Submit;
  91 + this.Color_Cancel = builder.Color_Cancel;
  92 + this.Color_Title = builder.Color_Title;
  93 + this.Color_Background_Wheel = builder.Color_Background_Wheel;
  94 + this.Color_Background_Title = builder.Color_Background_Title;
  95 +
  96 + this.Size_Submit_Cancel = builder.Size_Submit_Cancel;
  97 + this.Size_Title = builder.Size_Title;
  98 + this.Size_Content = builder.Size_Content;
  99 +
  100 + this.cyclic1 = builder.cyclic1;
  101 + this.cyclic2 = builder.cyclic2;
  102 + this.cyclic3 = builder.cyclic3;
  103 +
  104 + this.cancelable = builder.cancelable;
  105 + this.linkage = builder.linkage;
  106 + this.isCenterLabel = builder.isCenterLabel;
  107 +
  108 + this.label1 = builder.label1;
  109 + this.label2 = builder.label2;
  110 + this.label3 = builder.label3;
  111 +
  112 + this.font = builder.font;
  113 +
  114 +
  115 + this.option1 = builder.option1;
  116 + this.option2 = builder.option2;
  117 + this.option3 = builder.option3;
  118 + this.textColorCenter = builder.textColorCenter;
  119 + this.textColorOut = builder.textColorOut;
  120 + this.dividerColor = builder.dividerColor;
  121 + this.lineSpacingMultiplier = builder.lineSpacingMultiplier;
  122 + this.customListener = builder.customListener;
  123 + this.layoutRes = builder.layoutRes;
  124 + this.isDialog = builder.isDialog;
  125 + this.dividerType = builder.dividerType;
  126 + this.backgroundId = builder.backgroundId;
  127 + this.decorView = builder.decorView;
  128 + initView(builder.context);
  129 + }
  130 +
  131 +
  132 + //建造器
  133 + public static class Builder {
  134 + private int layoutRes = R.layout.pickerview_options;
  135 + private CustomListener customListener;
  136 + private Context context;
  137 + private OnOptionsSelectListener optionsSelectListener;
  138 +
  139 + private String Str_Submit;//确定按钮文字
  140 + private String Str_Cancel;//取消按钮文字
  141 + private String Str_Title;//标题文字
  142 +
  143 + private int Color_Submit;//确定按钮颜色
  144 + private int Color_Cancel;//取消按钮颜色
  145 + private int Color_Title;//标题颜色
  146 +
  147 + private int Color_Background_Wheel;//滚轮背景颜色
  148 + private int Color_Background_Title;//标题背景颜色
  149 +
  150 + private int Size_Submit_Cancel = 17;//确定取消按钮大小
  151 + private int Size_Title = 18;//标题文字大小
  152 + private int Size_Content = 18;//内容文字大小
  153 +
  154 + private boolean cancelable = true;//是否能取消
  155 + private boolean linkage = true;//是否联动
  156 + private boolean isCenterLabel = true;//是否只显示中间的label
  157 +
  158 + private int textColorOut; //分割线以外的文字颜色
  159 + private int textColorCenter; //分割线之间的文字颜色
  160 + private int dividerColor; //分割线的颜色
  161 + private int backgroundId; //显示时的外部背景色颜色,默认是灰色
  162 + public ViewGroup decorView ;//显示pickerview的根View,默认是activity的根view
  163 + // 条目间距倍数 默认1.6
  164 + private float lineSpacingMultiplier = 1.6F;
  165 + private boolean isDialog;//是否是对话框模式
  166 +
  167 + private String label1;
  168 + private String label2;
  169 + private String label3;
  170 +
  171 + private boolean cyclic1 = false;//是否循环,默认否
  172 + private boolean cyclic2 = false;
  173 + private boolean cyclic3 = false;
  174 +
  175 + private Typeface font;
  176 +
  177 + private int option1;//默认选中项
  178 + private int option2;
  179 + private int option3;
  180 +
  181 + private WheelView.DividerType dividerType;//分隔线类型
  182 +
  183 + //Required
  184 + public Builder(Context context, OnOptionsSelectListener listener) {
  185 + this.context = context;
  186 + this.optionsSelectListener = listener;
  187 + }
  188 +
  189 + //Option
  190 +
  191 + public Builder setSubmitText(String Str_Cancel) {
  192 + this.Str_Submit = Str_Cancel;
  193 + return this;
  194 + }
  195 +
  196 + public Builder setCancelText(String Str_Cancel) {
  197 + this.Str_Cancel = Str_Cancel;
  198 + return this;
  199 + }
  200 +
  201 + public Builder setTitleText(String Str_Title) {
  202 + this.Str_Title = Str_Title;
  203 + return this;
  204 + }
  205 +
  206 + public Builder isDialog(boolean isDialog) {
  207 + this.isDialog = isDialog;
  208 + return this;
  209 + }
  210 +
  211 + public Builder setSubmitColor(int Color_Submit) {
  212 + this.Color_Submit = Color_Submit;
  213 + return this;
  214 + }
  215 +
  216 + public Builder setCancelColor(int Color_Cancel) {
  217 + this.Color_Cancel = Color_Cancel;
  218 + return this;
  219 + }
  220 +
  221 + /**
  222 + * 显示时的外部背景色颜色,默认是灰色
  223 + * @param backgroundId
  224 + * @return
  225 + */
  226 + public Builder setBackgroundId(int backgroundId) {
  227 + this.backgroundId = backgroundId;
  228 + return this;
  229 + }
  230 + /**
  231 + * 必须是viewgroup
  232 + * 设置要将pickerview显示到的容器
  233 + * @param decorView
  234 + * @return
  235 + */
  236 + public Builder setDecorView(ViewGroup decorView) {
  237 + this.decorView = decorView;
  238 + return this;
  239 + }
  240 +
  241 +
  242 +
  243 +
  244 + public Builder setLayoutRes(int res, CustomListener listener) {
  245 + this.layoutRes = res;
  246 + this.customListener = listener;
  247 + return this;
  248 + }
  249 +
  250 + public Builder setBgColor(int Color_Background_Wheel) {
  251 + this.Color_Background_Wheel = Color_Background_Wheel;
  252 + return this;
  253 + }
  254 +
  255 + public Builder setTitleBgColor(int Color_Background_Title) {
  256 + this.Color_Background_Title = Color_Background_Title;
  257 + return this;
  258 + }
  259 +
  260 + public Builder setTitleColor(int Color_Title) {
  261 + this.Color_Title = Color_Title;
  262 + return this;
  263 + }
  264 +
  265 + public Builder setSubCalSize(int Size_Submit_Cancel) {
  266 + this.Size_Submit_Cancel = Size_Submit_Cancel;
  267 + return this;
  268 + }
  269 +
  270 + public Builder setTitleSize(int Size_Title) {
  271 + this.Size_Title = Size_Title;
  272 + return this;
  273 + }
  274 +
  275 + public Builder setContentTextSize(int Size_Content) {
  276 + this.Size_Content = Size_Content;
  277 + return this;
  278 + }
  279 +
  280 +
  281 + public Builder setOutSideCancelable(boolean cancelable) {
  282 + this.cancelable = cancelable;
  283 + return this;
  284 + }
  285 +
  286 + /**
  287 + * 此方法已废弃
  288 + * 不联动的情况下,请调用 setNPicker 方法。
  289 + * */
  290 + @Deprecated
  291 + public Builder setLinkage(boolean linkage) {
  292 + this.linkage = linkage;
  293 + return this;
  294 + }
  295 +
  296 + public Builder setLabels(String label1, String label2, String label3) {
  297 + this.label1 = label1;
  298 + this.label2 = label2;
  299 + this.label3 = label3;
  300 + return this;
  301 + }
  302 +
  303 + /**
  304 + * 设置间距倍数,但是只能在1.2-2.0f之间
  305 + *
  306 + * @param lineSpacingMultiplier
  307 + */
  308 + public Builder setLineSpacingMultiplier(float lineSpacingMultiplier) {
  309 + this.lineSpacingMultiplier = lineSpacingMultiplier;
  310 + return this;
  311 + }
  312 +
  313 + /**
  314 + * 设置分割线的颜色
  315 + *
  316 + * @param dividerColor
  317 + */
  318 + public Builder setDividerColor(int dividerColor) {
  319 + this.dividerColor = dividerColor;
  320 + return this;
  321 + }
  322 +
  323 + /**
  324 + * 设置分割线的类型
  325 + *
  326 + * @param dividerType
  327 + */
  328 + public Builder setDividerType(WheelView.DividerType dividerType) {
  329 + this.dividerType = dividerType;
  330 + return this;
  331 + }
  332 +
  333 + /**
  334 + * 设置分割线之间的文字的颜色
  335 + *
  336 + * @param textColorCenter
  337 + */
  338 + public Builder setTextColorCenter(int textColorCenter) {
  339 + this.textColorCenter = textColorCenter;
  340 + return this;
  341 + }
  342 +
  343 + /**
  344 + * 设置分割线以外文字的颜色
  345 + *
  346 + * @param textColorOut
  347 + */
  348 + public Builder setTextColorOut(int textColorOut) {
  349 + this.textColorOut = textColorOut;
  350 + return this;
  351 + }
  352 +
  353 + public Builder setTypeface(Typeface font) {
  354 + this.font = font;
  355 + return this;
  356 + }
  357 +
  358 + public Builder setCyclic(boolean cyclic1, boolean cyclic2, boolean cyclic3) {
  359 + this.cyclic1 = cyclic1;
  360 + this.cyclic2 = cyclic2;
  361 + this.cyclic3 = cyclic3;
  362 + return this;
  363 + }
  364 +
  365 + public Builder setSelectOptions(int option1) {
  366 + this.option1 = option1;
  367 + return this;
  368 + }
  369 +
  370 + public Builder setSelectOptions(int option1, int option2) {
  371 + this.option1 = option1;
  372 + this.option2 = option2;
  373 + return this;
  374 + }
  375 +
  376 + public Builder setSelectOptions(int option1, int option2, int option3) {
  377 + this.option1 = option1;
  378 + this.option2 = option2;
  379 + this.option3 = option3;
  380 + return this;
  381 + }
  382 +
  383 + public Builder isCenterLabel(boolean isCenterLabel) {
  384 + this.isCenterLabel = isCenterLabel;
  385 + return this;
  386 + }
  387 +
  388 + public OptionsPickerView build() {
  389 + return new OptionsPickerView(this);
  390 + }
  391 + }
  392 +
  393 +
  394 + private void initView(Context context) {
  395 + setDialogOutSideCancelable(cancelable);
  396 + initViews(backgroundId);
  397 + init();
  398 + initEvents();
  399 + if (customListener == null) {
  400 + LayoutInflater.from(context).inflate(layoutRes, contentContainer);
  401 +
  402 + //顶部标题
  403 + tvTitle = (TextView) findViewById(R.id.tvTitle);
  404 + rv_top_bar = (RelativeLayout)findViewById(R.id.rv_topbar);
  405 +
  406 + //确定和取消按钮
  407 + btnSubmit = (Button) findViewById(R.id.btnSubmit);
  408 + btnCancel = (Button) findViewById(R.id.btnCancel);
  409 +
  410 + btnSubmit.setTag(TAG_SUBMIT);
  411 + btnCancel.setTag(TAG_CANCEL);
  412 + btnSubmit.setOnClickListener(this);
  413 + btnCancel.setOnClickListener(this);
  414 +
  415 + //设置文字
  416 + btnSubmit.setText(TextUtils.isEmpty(Str_Submit) ? context.getResources().getString(R.string.pickerview_submit) : Str_Submit);
  417 + btnCancel.setText(TextUtils.isEmpty(Str_Cancel) ? context.getResources().getString(R.string.pickerview_cancel) : Str_Cancel);
  418 + tvTitle.setText(TextUtils.isEmpty(Str_Title) ? "" : Str_Title);//默认为空
  419 +
  420 + //设置color
  421 + btnSubmit.setTextColor(Color_Submit == 0 ? pickerview_timebtn_nor : Color_Submit);
  422 + btnCancel.setTextColor(Color_Cancel == 0 ? pickerview_timebtn_nor : Color_Cancel);
  423 + tvTitle.setTextColor(Color_Title == 0 ? pickerview_topbar_title : Color_Title);
  424 + rv_top_bar.setBackgroundColor(Color_Background_Title == 0 ? pickerview_bg_topbar : Color_Background_Title);
  425 +
  426 + //设置文字大小
  427 + btnSubmit.setTextSize(Size_Submit_Cancel);
  428 + btnCancel.setTextSize(Size_Submit_Cancel);
  429 + tvTitle.setTextSize(Size_Title);
  430 + tvTitle.setText(Str_Title);
  431 + } else {
  432 + customListener.customLayout(LayoutInflater.from(context).inflate(layoutRes, contentContainer));
  433 + }
  434 +
  435 + // ----滚轮布局
  436 + final LinearLayout optionsPicker = (LinearLayout) findViewById(R.id.optionspicker);
  437 + optionsPicker.setBackgroundColor(Color_Background_Wheel == 0 ? bgColor_default : Color_Background_Wheel);
  438 +
  439 + wheelOptions = new WheelOptions(optionsPicker, linkage);
  440 + wheelOptions.setTextContentSize(Size_Content);
  441 + wheelOptions.setLabels(label1, label2, label3);
  442 + wheelOptions.setCyclic(cyclic1, cyclic2, cyclic3);
  443 + wheelOptions.setTypeface(font);
  444 +
  445 + setOutSideCancelable(cancelable);
  446 +
  447 + if (tvTitle!= null){
  448 + tvTitle.setText(Str_Title);
  449 + }
  450 +
  451 + wheelOptions.setDividerColor(dividerColor);
  452 + wheelOptions.setDividerType(dividerType);
  453 + wheelOptions.setLineSpacingMultiplier(lineSpacingMultiplier);
  454 + wheelOptions.setTextColorOut(textColorOut);
  455 + wheelOptions.setTextColorCenter(textColorCenter);
  456 + wheelOptions.isCenterLabel(isCenterLabel);
  457 +
  458 + }
  459 +
  460 +
  461 + /**
  462 + * 设置默认选中项
  463 + *
  464 + * @param option1
  465 + */
  466 + public void setSelectOptions(int option1) {
  467 + this.option1 = option1;
  468 + SetCurrentItems();
  469 + }
  470 +
  471 +
  472 + public void setSelectOptions(int option1, int option2) {
  473 + this.option1 = option1;
  474 + this.option2 = option2;
  475 + SetCurrentItems();
  476 + }
  477 +
  478 + public void setSelectOptions(int option1, int option2, int option3) {
  479 + this.option1 = option1;
  480 + this.option2 = option2;
  481 + this.option3 = option3;
  482 + SetCurrentItems();
  483 + }
  484 +
  485 + private void SetCurrentItems() {
  486 + if(wheelOptions!=null){
  487 + wheelOptions.setCurrentItems(option1, option2, option3);
  488 + }
  489 + }
  490 +
  491 + public void setPicker(List<T> optionsItems) {
  492 + this.setPicker(optionsItems, null, null);
  493 + }
  494 +
  495 + public void setPicker(List<T> options1Items, List<List<T>> options2Items) {
  496 + this.setPicker(options1Items, options2Items, null);
  497 + }
  498 +
  499 + public void setPicker(List<T> options1Items,
  500 + List<List<T>> options2Items,
  501 + List<List<List<T>>> options3Items) {
  502 +
  503 + wheelOptions.setPicker(options1Items, options2Items, options3Items);
  504 + SetCurrentItems();
  505 + }
  506 +
  507 +
  508 + //不联动情况下调用
  509 + public void setNPicker(List<T> options1Items,
  510 + List<T> options2Items,
  511 + List<T> options3Items) {
  512 +
  513 + wheelOptions.setNPicker(options1Items, options2Items, options3Items);
  514 + SetCurrentItems();
  515 + }
  516 +
  517 + @Override
  518 + public void onClick(View v) {
  519 + String tag = (String) v.getTag();
  520 + if (tag.equals(TAG_SUBMIT)) {
  521 + returnData();
  522 + }
  523 + dismiss();
  524 + }
  525 +
  526 + //抽离接口回调的方法
  527 + public void returnData() {
  528 + if (optionsSelectListener != null) {
  529 + int[] optionsCurrentItems = wheelOptions.getCurrentItems();
  530 + optionsSelectListener.onOptionsSelect(optionsCurrentItems[0], optionsCurrentItems[1], optionsCurrentItems[2], clickView);
  531 + }
  532 + }
  533 +
  534 + public interface OnOptionsSelectListener {
  535 + void onOptionsSelect(int options1, int options2, int options3, View v);
  536 + }
  537 +
  538 + @Override
  539 + public boolean isDialog() {
  540 + return isDialog;
  541 + }
  542 +}
... ...
PersonalCenter/pickerview/src/main/java/com/bigkoo/pickerview/TimePickerView.java
... ... @@ -0,0 +1,555 @@
  1 +package com.bigkoo.pickerview;
  2 +
  3 +import android.content.Context;
  4 +import android.text.TextUtils;
  5 +import android.view.Gravity;
  6 +import android.view.LayoutInflater;
  7 +import android.view.View;
  8 +import android.view.ViewGroup;
  9 +import android.widget.Button;
  10 +import android.widget.LinearLayout;
  11 +import android.widget.RelativeLayout;
  12 +import android.widget.TextView;
  13 +
  14 +import com.bigkoo.pickerview.lib.WheelView;
  15 +import com.bigkoo.pickerview.listener.CustomListener;
  16 +import com.bigkoo.pickerview.view.BasePickerView;
  17 +import com.bigkoo.pickerview.view.WheelTime;
  18 +
  19 +import java.text.ParseException;
  20 +import java.util.Calendar;
  21 +import java.util.Date;
  22 +
  23 +/**
  24 + * 时间选择器
  25 + * Created by Sai on 15/11/22.
  26 + * Updated by XiaoSong on 2017-2-22.
  27 + */
  28 +public class TimePickerView extends BasePickerView implements View.OnClickListener {
  29 + private int layoutRes;
  30 + private CustomListener customListener;
  31 +
  32 + WheelTime wheelTime; //自定义控件
  33 + private Button btnSubmit, btnCancel; //确定、取消按钮
  34 + private TextView tvTitle;//标题
  35 + private OnTimeSelectListener timeSelectListener;//回调接口
  36 + private int gravity = Gravity.CENTER;//内容显示位置 默认居中
  37 + private boolean[] type;// 显示类型
  38 +
  39 + private String Str_Submit;//确定按钮字符串
  40 + private String Str_Cancel;//取消按钮字符串
  41 + private String Str_Title;//标题字符串
  42 +
  43 + private int Color_Submit;//确定按钮颜色
  44 + private int Color_Cancel;//取消按钮颜色
  45 + private int Color_Title;//标题颜色
  46 +
  47 + private int Color_Background_Wheel;//滚轮背景颜色
  48 + private int Color_Background_Title;//标题背景颜色
  49 +
  50 + private int Size_Submit_Cancel;//确定取消按钮大小
  51 + private int Size_Title;//标题字体大小
  52 + private int Size_Content;//内容字体大小
  53 +
  54 + private Calendar date;//当前选中时间
  55 + private Calendar startDate;//开始时间
  56 + private Calendar endDate;//终止时间
  57 + private int startYear;//开始年份
  58 + private int endYear;//结尾年份
  59 +
  60 + private boolean cyclic;//是否循环
  61 + private boolean cancelable;//是否能取消
  62 + private boolean isCenterLabel;//是否只显示中间的label
  63 +
  64 + private int textColorOut; //分割线以外的文字颜色
  65 + private int textColorCenter; //分割线之间的文字颜色
  66 + private int dividerColor; //分割线的颜色
  67 + private int backgroundId; //显示时的外部背景色颜色,默认是灰色
  68 +
  69 + // 条目间距倍数 默认1.6
  70 + private float lineSpacingMultiplier = 1.6F;
  71 + private boolean isDialog;//是否是对话框模式
  72 + private String label_year, label_month, label_day, label_hours, label_mins, label_seconds;
  73 + private WheelView.DividerType dividerType;//分隔线类型
  74 +
  75 + private static final String TAG_SUBMIT = "submit";
  76 + private static final String TAG_CANCEL = "cancel";
  77 +
  78 + //构造方法
  79 + public TimePickerView(Builder builder) {
  80 + super(builder.context);
  81 + this.timeSelectListener = builder.timeSelectListener;
  82 + this.gravity = builder.gravity;
  83 + this.type = builder.type;
  84 + this.Str_Submit = builder.Str_Submit;
  85 + this.Str_Cancel = builder.Str_Cancel;
  86 + this.Str_Title = builder.Str_Title;
  87 + this.Color_Submit = builder.Color_Submit;
  88 + this.Color_Cancel = builder.Color_Cancel;
  89 + this.Color_Title = builder.Color_Title;
  90 + this.Color_Background_Wheel = builder.Color_Background_Wheel;
  91 + this.Color_Background_Title = builder.Color_Background_Title;
  92 + this.Size_Submit_Cancel = builder.Size_Submit_Cancel;
  93 + this.Size_Title = builder.Size_Title;
  94 + this.Size_Content = builder.Size_Content;
  95 + this.startYear = builder.startYear;
  96 + this.endYear = builder.endYear;
  97 + this.startDate = builder.startDate;
  98 + this.endDate = builder.endDate;
  99 + this.date = builder.date;
  100 + this.cyclic = builder.cyclic;
  101 + this.isCenterLabel = builder.isCenterLabel;
  102 + this.cancelable = builder.cancelable;
  103 + this.label_year = builder.label_year;
  104 + this.label_month = builder.label_month;
  105 + this.label_day = builder.label_day;
  106 + this.label_hours = builder.label_hours;
  107 + this.label_mins = builder.label_mins;
  108 + this.label_seconds = builder.label_seconds;
  109 + this.textColorCenter = builder.textColorCenter;
  110 + this.textColorOut = builder.textColorOut;
  111 + this.dividerColor = builder.dividerColor;
  112 + this.customListener = builder.customListener;
  113 + this.layoutRes = builder.layoutRes;
  114 + this.lineSpacingMultiplier = builder.lineSpacingMultiplier;
  115 + this.isDialog = builder.isDialog;
  116 + this.dividerType = builder.dividerType;
  117 + this.backgroundId = builder.backgroundId;
  118 + this.decorView = builder.decorView;
  119 + initView(builder.context);
  120 + }
  121 +
  122 +
  123 + //建造器
  124 + public static class Builder {
  125 + private int layoutRes = R.layout.pickerview_time;
  126 + private CustomListener customListener;
  127 + private Context context;
  128 + private OnTimeSelectListener timeSelectListener;
  129 + private boolean[] type = new boolean[]{true, true, true, true, true, true};//显示类型 默认全部显示
  130 + private int gravity = Gravity.CENTER;//内容显示位置 默认居中
  131 +
  132 + private String Str_Submit;//确定按钮文字
  133 + private String Str_Cancel;//取消按钮文字
  134 + private String Str_Title;//标题文字
  135 +
  136 + private int Color_Submit;//确定按钮颜色
  137 + private int Color_Cancel;//取消按钮颜色
  138 + private int Color_Title;//标题颜色
  139 +
  140 + private int Color_Background_Wheel;//滚轮背景颜色
  141 + private int Color_Background_Title;//标题背景颜色
  142 +
  143 + private int Size_Submit_Cancel = 17;//确定取消按钮大小
  144 + private int Size_Title = 18;//标题字体大小
  145 + private int Size_Content = 18;//内容字体大小
  146 + private Calendar date;//当前选中时间
  147 + private Calendar startDate;//开始时间
  148 + private Calendar endDate;//终止时间
  149 + private int startYear;//开始年份
  150 + private int endYear;//结尾年份
  151 +
  152 + private boolean cyclic = false;//是否循环
  153 + private boolean cancelable = true;//是否能取消
  154 +
  155 + private boolean isCenterLabel = true ;//是否只显示中间的label
  156 + public ViewGroup decorView ;//显示pickerview的根View,默认是activity的根view
  157 +
  158 + private int textColorOut; //分割线以外的文字颜色
  159 + private int textColorCenter; //分割线之间的文字颜色
  160 + private int dividerColor; //分割线的颜色
  161 + private int backgroundId; //显示时的外部背景色颜色,默认是灰色
  162 + private WheelView.DividerType dividerType;//分隔线类型
  163 + // 条目间距倍数 默认1.6
  164 + private float lineSpacingMultiplier = 1.6F;
  165 +
  166 + private boolean isDialog;//是否是对话框模式
  167 +
  168 + private String label_year, label_month, label_day, label_hours, label_mins, label_seconds;//单位
  169 +
  170 + //Required
  171 + public Builder(Context context, OnTimeSelectListener listener) {
  172 + this.context = context;
  173 + this.timeSelectListener = listener;
  174 + }
  175 +
  176 + //Option
  177 + public Builder setType(boolean[] type) {
  178 + this.type = type;
  179 + return this;
  180 + }
  181 +
  182 + public Builder gravity(int gravity) {
  183 + this.gravity = gravity;
  184 + return this;
  185 + }
  186 +
  187 + public Builder setSubmitText(String Str_Submit) {
  188 + this.Str_Submit = Str_Submit;
  189 + return this;
  190 + }
  191 +
  192 + public Builder isDialog(boolean isDialog) {
  193 + this.isDialog = isDialog;
  194 + return this;
  195 + }
  196 +
  197 + public Builder setCancelText(String Str_Cancel) {
  198 + this.Str_Cancel = Str_Cancel;
  199 + return this;
  200 + }
  201 +
  202 + public Builder setTitleText(String Str_Title) {
  203 + this.Str_Title = Str_Title;
  204 + return this;
  205 + }
  206 +
  207 + public Builder setSubmitColor(int Color_Submit) {
  208 + this.Color_Submit = Color_Submit;
  209 + return this;
  210 + }
  211 +
  212 + public Builder setCancelColor(int Color_Cancel) {
  213 + this.Color_Cancel = Color_Cancel;
  214 + return this;
  215 + }
  216 + /**
  217 + * 必须是viewgroup
  218 + * 设置要将pickerview显示到的容器id
  219 + * @param decorView
  220 + * @return
  221 + */
  222 + public Builder setDecorView(ViewGroup decorView) {
  223 + this.decorView = decorView;
  224 + return this;
  225 + }
  226 +
  227 + public Builder setBgColor(int Color_Background_Wheel) {
  228 + this.Color_Background_Wheel = Color_Background_Wheel;
  229 + return this;
  230 + }
  231 +
  232 + public Builder setTitleBgColor(int Color_Background_Title) {
  233 + this.Color_Background_Title = Color_Background_Title;
  234 + return this;
  235 + }
  236 +
  237 + public Builder setTitleColor(int Color_Title) {
  238 + this.Color_Title = Color_Title;
  239 + return this;
  240 + }
  241 +
  242 + public Builder setSubCalSize(int Size_Submit_Cancel) {
  243 + this.Size_Submit_Cancel = Size_Submit_Cancel;
  244 + return this;
  245 + }
  246 +
  247 + public Builder setTitleSize(int Size_Title) {
  248 + this.Size_Title = Size_Title;
  249 + return this;
  250 + }
  251 +
  252 + public Builder setContentSize(int Size_Content) {
  253 + this.Size_Content = Size_Content;
  254 + return this;
  255 + }
  256 +
  257 + /**
  258 + * 因为系统Calendar的月份是从0-11的,所以如果是调用Calendar的set方法来设置时间,月份的范围也要是从0-11
  259 + *
  260 + * @param date
  261 + * @return
  262 + */
  263 + public Builder setDate(Calendar date) {
  264 + this.date = date;
  265 + return this;
  266 + }
  267 +
  268 + public Builder setLayoutRes(int res, CustomListener customListener) {
  269 + this.layoutRes = res;
  270 + this.customListener = customListener;
  271 + return this;
  272 + }
  273 +
  274 + public Builder setRange(int startYear, int endYear) {
  275 + this.startYear = startYear;
  276 + this.endYear = endYear;
  277 + return this;
  278 + }
  279 +
  280 + /**
  281 + * 设置起始时间
  282 + * 因为系统Calendar的月份是从0-11的,所以如果是调用Calendar的set方法来设置时间,月份的范围也要是从0-11
  283 + *
  284 + * @return
  285 + */
  286 +
  287 + public Builder setRangDate(Calendar startDate, Calendar endDate) {
  288 + this.startDate = startDate;
  289 + this.endDate = endDate;
  290 + return this;
  291 + }
  292 +
  293 +
  294 + /**
  295 + * 设置间距倍数,但是只能在1.2-2.0f之间
  296 + *
  297 + * @param lineSpacingMultiplier
  298 + */
  299 + public Builder setLineSpacingMultiplier(float lineSpacingMultiplier) {
  300 + this.lineSpacingMultiplier = lineSpacingMultiplier;
  301 + return this;
  302 + }
  303 +
  304 + /**
  305 + * 设置分割线的颜色
  306 + *
  307 + * @param dividerColor
  308 + */
  309 + public Builder setDividerColor(int dividerColor) {
  310 + this.dividerColor = dividerColor;
  311 + return this;
  312 + }
  313 +
  314 + /**
  315 + * 设置分割线的类型
  316 + *
  317 + * @param dividerType
  318 + */
  319 + public Builder setDividerType(WheelView.DividerType dividerType) {
  320 + this.dividerType = dividerType;
  321 + return this;
  322 + }
  323 +
  324 + /**
  325 + * //显示时的外部背景色颜色,默认是灰色
  326 + * @param backgroundId
  327 + */
  328 +
  329 + public Builder setBackgroundId(int backgroundId) {
  330 + this.backgroundId = backgroundId;
  331 + return this;
  332 + }
  333 +
  334 + /**
  335 + * 设置分割线之间的文字的颜色
  336 + *
  337 + * @param textColorCenter
  338 + */
  339 + public Builder setTextColorCenter(int textColorCenter) {
  340 + this.textColorCenter = textColorCenter;
  341 + return this;
  342 + }
  343 +
  344 + /**
  345 + * 设置分割线以外文字的颜色
  346 + *
  347 + * @param textColorOut
  348 + */
  349 + public Builder setTextColorOut(int textColorOut) {
  350 + this.textColorOut = textColorOut;
  351 + return this;
  352 + }
  353 +
  354 + public Builder isCyclic(boolean cyclic) {
  355 + this.cyclic = cyclic;
  356 + return this;
  357 + }
  358 +
  359 + public Builder setOutSideCancelable(boolean cancelable) {
  360 + this.cancelable = cancelable;
  361 + return this;
  362 + }
  363 +
  364 + public Builder setLabel(String label_year, String label_month, String label_day, String label_hours, String label_mins, String label_seconds) {
  365 + this.label_year = label_year;
  366 + this.label_month = label_month;
  367 + this.label_day = label_day;
  368 + this.label_hours = label_hours;
  369 + this.label_mins = label_mins;
  370 + this.label_seconds = label_seconds;
  371 + return this;
  372 + }
  373 +
  374 + public Builder isCenterLabel(boolean isCenterLabel) {
  375 + this.isCenterLabel = isCenterLabel;
  376 + return this;
  377 + }
  378 +
  379 +
  380 + public TimePickerView build() {
  381 + return new TimePickerView(this);
  382 + }
  383 + }
  384 +
  385 +
  386 + private void initView(Context context) {
  387 + setDialogOutSideCancelable(cancelable);
  388 + initViews(backgroundId);
  389 + init();
  390 + initEvents();
  391 + if (customListener == null) {
  392 + LayoutInflater.from(context).inflate(R.layout.pickerview_time, contentContainer);
  393 +
  394 + //顶部标题
  395 + tvTitle = (TextView) findViewById(R.id.tvTitle);
  396 +
  397 + //确定和取消按钮
  398 + btnSubmit = (Button) findViewById(R.id.btnSubmit);
  399 + btnCancel = (Button) findViewById(R.id.btnCancel);
  400 +
  401 + btnSubmit.setTag(TAG_SUBMIT);
  402 + btnCancel.setTag(TAG_CANCEL);
  403 +
  404 + btnSubmit.setOnClickListener(this);
  405 + btnCancel.setOnClickListener(this);
  406 +
  407 + //设置文字
  408 + btnSubmit.setText(TextUtils.isEmpty(Str_Submit) ? context.getResources().getString(R.string.pickerview_submit) : Str_Submit);
  409 + btnCancel.setText(TextUtils.isEmpty(Str_Cancel) ? context.getResources().getString(R.string.pickerview_cancel) : Str_Cancel);
  410 + tvTitle.setText(TextUtils.isEmpty(Str_Title) ? "" : Str_Title);//默认为空
  411 +
  412 + //设置文字颜色
  413 + btnSubmit.setTextColor(Color_Submit == 0 ? pickerview_timebtn_nor : Color_Submit);
  414 + btnCancel.setTextColor(Color_Cancel == 0 ? pickerview_timebtn_nor : Color_Cancel);
  415 + tvTitle.setTextColor(Color_Title == 0 ? pickerview_topbar_title : Color_Title);
  416 +
  417 + //设置文字大小
  418 + btnSubmit.setTextSize(Size_Submit_Cancel);
  419 + btnCancel.setTextSize(Size_Submit_Cancel);
  420 + tvTitle.setTextSize(Size_Title);
  421 + RelativeLayout rv_top_bar = (RelativeLayout) findViewById(R.id.rv_topbar);
  422 + rv_top_bar.setBackgroundColor(Color_Background_Title == 0 ? pickerview_bg_topbar : Color_Background_Title);
  423 + } else {
  424 + customListener.customLayout(LayoutInflater.from(context).inflate(layoutRes, contentContainer));
  425 + }
  426 + // 时间转轮 自定义控件
  427 + LinearLayout timePickerView = (LinearLayout) findViewById(R.id.timepicker);
  428 +
  429 + timePickerView.setBackgroundColor(Color_Background_Wheel == 0 ? bgColor_default : Color_Background_Wheel);
  430 +
  431 + wheelTime = new WheelTime(timePickerView, type, gravity, Size_Content);
  432 +
  433 + if (startYear != 0 && endYear != 0 && startYear <= endYear) {
  434 + setRange();
  435 + }
  436 +
  437 + if (startDate != null && endDate != null) {
  438 + if (startDate.getTimeInMillis() <= endDate.getTimeInMillis()) {
  439 + setRangDate();
  440 + }
  441 + } else if (startDate != null && endDate == null) {
  442 + setRangDate();
  443 + } else if (startDate == null && endDate != null) {
  444 + setRangDate();
  445 + }
  446 +
  447 + setTime();
  448 + wheelTime.setLabels(label_year, label_month, label_day, label_hours, label_mins, label_seconds);
  449 +
  450 + setOutSideCancelable(cancelable);
  451 + wheelTime.setCyclic(cyclic);
  452 + wheelTime.setDividerColor(dividerColor);
  453 + wheelTime.setDividerType(dividerType);
  454 + wheelTime.setLineSpacingMultiplier(lineSpacingMultiplier);
  455 + wheelTime.setTextColorOut(textColorOut);
  456 + wheelTime.setTextColorCenter(textColorCenter);
  457 + wheelTime.isCenterLabel(isCenterLabel);
  458 + }
  459 +
  460 +
  461 + /**
  462 + * 设置默认时间
  463 + */
  464 + public void setDate(Calendar date) {
  465 + this.date = date;
  466 + setTime();
  467 + }
  468 +
  469 + /**
  470 + * 设置可以选择的时间范围, 要在setTime之前调用才有效果
  471 + */
  472 + private void setRange() {
  473 + wheelTime.setStartYear(startYear);
  474 + wheelTime.setEndYear(endYear);
  475 +
  476 + }
  477 +
  478 + /**
  479 + * 设置可以选择的时间范围, 要在setTime之前调用才有效果
  480 + */
  481 + private void setRangDate() {
  482 + wheelTime.setRangDate(startDate, endDate);
  483 + //如果设置了时间范围
  484 + if (startDate != null && endDate != null) {
  485 + //判断一下默认时间是否设置了,或者是否在起始终止时间范围内
  486 + if (date == null || date.getTimeInMillis() < startDate.getTimeInMillis()
  487 + || date.getTimeInMillis() > endDate.getTimeInMillis()) {
  488 + date = startDate;
  489 + }
  490 + } else if (startDate != null) {
  491 + //没有设置默认选中时间,那就拿开始时间当默认时间
  492 + date = startDate;
  493 + } else if (endDate != null) {
  494 + date = endDate;
  495 + }
  496 + }
  497 +
  498 + /**
  499 + * 设置选中时间,默认选中当前时间
  500 + */
  501 + private void setTime() {
  502 + int year, month, day, hours, minute, seconds;
  503 +
  504 + Calendar calendar = Calendar.getInstance();
  505 + if (date == null) {
  506 + calendar.setTimeInMillis(System.currentTimeMillis());
  507 + year = calendar.get(Calendar.YEAR);
  508 + month = calendar.get(Calendar.MONTH);
  509 + day = calendar.get(Calendar.DAY_OF_MONTH);
  510 + hours = calendar.get(Calendar.HOUR_OF_DAY);
  511 + minute = calendar.get(Calendar.MINUTE);
  512 + seconds = calendar.get(Calendar.SECOND);
  513 + } else {
  514 + year = date.get(Calendar.YEAR);
  515 + month = date.get(Calendar.MONTH);
  516 + day = date.get(Calendar.DAY_OF_MONTH);
  517 + hours = date.get(Calendar.HOUR_OF_DAY);
  518 + minute = date.get(Calendar.MINUTE);
  519 + seconds = date.get(Calendar.SECOND);
  520 + }
  521 +
  522 +
  523 + wheelTime.setPicker(year, month, day, hours, minute, seconds);
  524 + }
  525 +
  526 +
  527 + @Override
  528 + public void onClick(View v) {
  529 + String tag = (String) v.getTag();
  530 + if (tag.equals(TAG_SUBMIT)) {
  531 + returnData();
  532 + }
  533 + dismiss();
  534 + }
  535 +
  536 + public void returnData() {
  537 + if (timeSelectListener != null) {
  538 + try {
  539 + Date date = WheelTime.dateFormat.parse(wheelTime.getTime());
  540 + timeSelectListener.onTimeSelect(date, clickView);
  541 + } catch (ParseException e) {
  542 + e.printStackTrace();
  543 + }
  544 + }
  545 + }
  546 +
  547 + public interface OnTimeSelectListener {
  548 + void onTimeSelect(Date date, View v);
  549 + }
  550 +
  551 + @Override
  552 + public boolean isDialog() {
  553 + return isDialog;
  554 + }
  555 +}
... ...
PersonalCenter/pickerview/src/main/java/com/bigkoo/pickerview/adapter/ArrayWheelAdapter.java
... ... @@ -0,0 +1,55 @@
  1 +package com.bigkoo.pickerview.adapter;
  2 +
  3 +import java.util.List;
  4 +
  5 +/**
  6 + * The simple Array wheel adapter
  7 + * @param <T> the element type
  8 + */
  9 +public class ArrayWheelAdapter<T> implements WheelAdapter {
  10 +
  11 + /** The default items length */
  12 + public static final int DEFAULT_LENGTH = 4;
  13 +
  14 + // items
  15 + private List<T> items;
  16 + // length
  17 + private int length;
  18 +
  19 + /**
  20 + * Constructor
  21 + * @param items the items
  22 + * @param length the max items length
  23 + */
  24 + public ArrayWheelAdapter(List<T> items, int length) {
  25 + this.items = items;
  26 + this.length = length;
  27 + }
  28 +
  29 + /**
  30 + * Contructor
  31 + * @param items the items
  32 + */
  33 + public ArrayWheelAdapter(List<T> items) {
  34 + this(items, DEFAULT_LENGTH);
  35 + }
  36 +
  37 + @Override
  38 + public Object getItem(int index) {
  39 + if (index >= 0 && index < items.size()) {
  40 + return items.get(index);
  41 + }
  42 + return "";
  43 + }
  44 +
  45 + @Override
  46 + public int getItemsCount() {
  47 + return items.size();
  48 + }
  49 +
  50 + @Override
  51 + public int indexOf(Object o){
  52 + return items.indexOf(o);
  53 + }
  54 +
  55 +}
... ...
PersonalCenter/pickerview/src/main/java/com/bigkoo/pickerview/adapter/NumericWheelAdapter.java
... ... @@ -0,0 +1,59 @@
  1 +package com.bigkoo.pickerview.adapter;
  2 +
  3 +
  4 +/**
  5 + * Numeric Wheel adapter.
  6 + */
  7 +public class NumericWheelAdapter implements WheelAdapter {
  8 +
  9 + /** The default min value */
  10 + public static final int DEFAULT_MAX_VALUE = 9;
  11 +
  12 + /** The default max value */
  13 + private static final int DEFAULT_MIN_VALUE = 0;
  14 +
  15 + // Values
  16 + private int minValue;
  17 + private int maxValue;
  18 +
  19 + /**
  20 + * Default constructor
  21 + */
  22 + public NumericWheelAdapter() {
  23 + this(DEFAULT_MIN_VALUE, DEFAULT_MAX_VALUE);
  24 + }
  25 +
  26 + /**
  27 + * Constructor
  28 + * @param minValue the wheel min value
  29 + * @param maxValue the wheel max value
  30 + */
  31 + public NumericWheelAdapter(int minValue, int maxValue) {
  32 + this.minValue = minValue;
  33 + this.maxValue = maxValue;
  34 + }
  35 +
  36 + @Override
  37 + public Object getItem(int index) {
  38 + if (index >= 0 && index < getItemsCount()) {
  39 + int value = minValue + index;
  40 + return value;
  41 + }
  42 + return 0;
  43 + }
  44 +
  45 + @Override
  46 + public int getItemsCount() {
  47 + return maxValue - minValue + 1;
  48 + }
  49 +
  50 + @Override
  51 + public int indexOf(Object o){
  52 + try {
  53 + return (int)o - minValue;
  54 + } catch (Exception e) {
  55 + return -1;
  56 + }
  57 +
  58 + }
  59 +}
... ...
PersonalCenter/pickerview/src/main/java/com/bigkoo/pickerview/adapter/WheelAdapter.java
... ... @@ -0,0 +1,24 @@
  1 +package com.bigkoo.pickerview.adapter;
  2 +
  3 +public interface WheelAdapter<T> {
  4 + /**
  5 + * Gets items count
  6 + * @return the count of wheel items
  7 + */
  8 + int getItemsCount();
  9 +
  10 + /**
  11 + * Gets a wheel item by index.
  12 + * @param index the item index
  13 + * @return the wheel item text or null
  14 + */
  15 + T getItem(int index);
  16 +
  17 + /**
  18 + * Gets maximum item length. It is used to determine the wheel width.
  19 + * If -1 is returned there will be used the default wheel width.
  20 + * @param o
  21 + * @return the maximum item length or -1
  22 + */
  23 + int indexOf(T o);
  24 +}
... ...
PersonalCenter/pickerview/src/main/java/com/bigkoo/pickerview/lib/InertiaTimerTask.java
... ... @@ -0,0 +1,68 @@
  1 +package com.bigkoo.pickerview.lib;
  2 +
  3 +import java.util.TimerTask;
  4 +/**
  5 + * @TODO<滚动惯性的实现>
  6 + * @author 小嵩
  7 + */
  8 +final class InertiaTimerTask extends TimerTask {
  9 +
  10 + float a;
  11 + final float velocityY;
  12 + final WheelView loopView;
  13 +
  14 + InertiaTimerTask(WheelView loopview, float velocityY) {
  15 + super();
  16 + loopView = loopview;
  17 + this.velocityY = velocityY;
  18 + a = Integer.MAX_VALUE;
  19 + }
  20 +
  21 + @Override
  22 + public final void run() {
  23 + if (a == Integer.MAX_VALUE) {
  24 + if (Math.abs(velocityY) > 2000F) {
  25 + if (velocityY > 0.0F) {
  26 + a = 2000F;
  27 + } else {
  28 + a = -2000F;
  29 + }
  30 + } else {
  31 + a = velocityY;
  32 + }
  33 + }
  34 + if (Math.abs(a) >= 0.0F && Math.abs(a) <= 20F) {
  35 + loopView.cancelFuture();
  36 + loopView.handler.sendEmptyMessage(MessageHandler.WHAT_SMOOTH_SCROLL);
  37 + return;
  38 + }
  39 + int i = (int) ((a * 10F) / 1000F);
  40 + loopView.totalScrollY = loopView.totalScrollY - i;
  41 + if (!loopView.isLoop) {
  42 + float itemHeight = loopView.itemHeight;
  43 + float top = (-loopView.initPosition) * itemHeight;
  44 + float bottom = (loopView.getItemsCount() - 1 - loopView.initPosition) * itemHeight;
  45 + if(loopView.totalScrollY - itemHeight*0.25 < top){
  46 + top = loopView.totalScrollY + i;
  47 + }
  48 + else if(loopView.totalScrollY + itemHeight*0.25 > bottom){
  49 + bottom = loopView.totalScrollY + i;
  50 + }
  51 +
  52 + if (loopView.totalScrollY <= top){
  53 + a = 40F;
  54 + loopView.totalScrollY = (int)top;
  55 + } else if (loopView.totalScrollY >= bottom) {
  56 + loopView.totalScrollY = (int)bottom;
  57 + a = -40F;
  58 + }
  59 + }
  60 + if (a < 0.0F) {
  61 + a = a + 20F;
  62 + } else {
  63 + a = a - 20F;
  64 + }
  65 + loopView.handler.sendEmptyMessage(MessageHandler.WHAT_INVALIDATE_LOOP_VIEW);
  66 + }
  67 +
  68 +}
... ...
PersonalCenter/pickerview/src/main/java/com/bigkoo/pickerview/lib/LoopViewGestureListener.java
... ... @@ -0,0 +1,18 @@
  1 +package com.bigkoo.pickerview.lib;
  2 +
  3 +import android.view.MotionEvent;
  4 +
  5 +final class LoopViewGestureListener extends android.view.GestureDetector.SimpleOnGestureListener {
  6 +
  7 + final WheelView loopView;
  8 +
  9 + LoopViewGestureListener(WheelView loopview) {
  10 + loopView = loopview;
  11 + }
  12 +
  13 + @Override
  14 + public final boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
  15 + loopView.scrollBy(velocityY);
  16 + return true;
  17 + }
  18 +}
... ...
PersonalCenter/pickerview/src/main/java/com/bigkoo/pickerview/lib/MessageHandler.java
... ... @@ -0,0 +1,34 @@
  1 +package com.bigkoo.pickerview.lib;
  2 +
  3 +import android.os.Handler;
  4 +import android.os.Message;
  5 +
  6 +final class MessageHandler extends Handler {
  7 + public static final int WHAT_INVALIDATE_LOOP_VIEW = 1000;
  8 + public static final int WHAT_SMOOTH_SCROLL = 2000;
  9 + public static final int WHAT_ITEM_SELECTED = 3000;
  10 +
  11 + final WheelView loopview;
  12 +
  13 + MessageHandler(WheelView loopview) {
  14 + this.loopview = loopview;
  15 + }
  16 +
  17 + @Override
  18 + public final void handleMessage(Message msg) {
  19 + switch (msg.what) {
  20 + case WHAT_INVALIDATE_LOOP_VIEW:
  21 + loopview.invalidate();
  22 + break;
  23 +
  24 + case WHAT_SMOOTH_SCROLL:
  25 + loopview.smoothScroll(WheelView.ACTION.FLING);
  26 + break;
  27 +
  28 + case WHAT_ITEM_SELECTED:
  29 + loopview.onItemSelected();
  30 + break;
  31 + }
  32 + }
  33 +
  34 +}
... ...
PersonalCenter/pickerview/src/main/java/com/bigkoo/pickerview/lib/OnItemSelectedRunnable.java
... ... @@ -0,0 +1,14 @@
  1 +package com.bigkoo.pickerview.lib;
  2 +
  3 +final class OnItemSelectedRunnable implements Runnable {
  4 + final WheelView loopView;
  5 +
  6 + OnItemSelectedRunnable(WheelView loopview) {
  7 + loopView = loopview;
  8 + }
  9 +
  10 + @Override
  11 + public final void run() {
  12 + loopView.onItemSelectedListener.onItemSelected(loopView.getCurrentItem());
  13 + }
  14 +}
... ...
PersonalCenter/pickerview/src/main/java/com/bigkoo/pickerview/lib/SmoothScrollTimerTask.java
... ... @@ -0,0 +1,61 @@
  1 +package com.bigkoo.pickerview.lib;
  2 +
  3 +import java.util.TimerTask;
  4 +
  5 +/**
  6 + * @TODO<平滑滚动的实现>
  7 + * @author 小嵩
  8 + */
  9 +final class SmoothScrollTimerTask extends TimerTask {
  10 +
  11 + int realTotalOffset;
  12 + int realOffset;
  13 + int offset;
  14 + final WheelView loopView;
  15 +
  16 + SmoothScrollTimerTask(WheelView loopview, int offset) {
  17 + this.loopView = loopview;
  18 + this.offset = offset;
  19 + realTotalOffset = Integer.MAX_VALUE;
  20 + realOffset = 0;
  21 + }
  22 +
  23 + @Override
  24 + public final void run() {
  25 + if (realTotalOffset == Integer.MAX_VALUE) {
  26 + realTotalOffset = offset;
  27 + }
  28 + //把要滚动的范围细分成10小份,按10小份单位来重绘
  29 + realOffset = (int) ((float) realTotalOffset * 0.1F);
  30 +
  31 + if (realOffset == 0) {
  32 + if (realTotalOffset < 0) {
  33 + realOffset = -1;
  34 + } else {
  35 + realOffset = 1;
  36 + }
  37 + }
  38 +
  39 + if (Math.abs(realTotalOffset) <= 1) {
  40 + loopView.cancelFuture();
  41 + loopView.handler.sendEmptyMessage(MessageHandler.WHAT_ITEM_SELECTED);
  42 + } else {
  43 + loopView.totalScrollY = loopView.totalScrollY + realOffset;
  44 +
  45 + //这里如果不是循环模式,则点击空白位置需要回滚,不然就会出现选到-1 item的 情况
  46 + if (!loopView.isLoop) {
  47 + float itemHeight = loopView.itemHeight;
  48 + float top = (float) (-loopView.initPosition) * itemHeight;
  49 + float bottom = (float) (loopView.getItemsCount() - 1 - loopView.initPosition) * itemHeight;
  50 + if (loopView.totalScrollY <= top||loopView.totalScrollY >= bottom) {
  51 + loopView.totalScrollY = loopView.totalScrollY - realOffset;
  52 + loopView.cancelFuture();
  53 + loopView.handler.sendEmptyMessage(MessageHandler.WHAT_ITEM_SELECTED);
  54 + return;
  55 + }
  56 + }
  57 + loopView.handler.sendEmptyMessage(MessageHandler.WHAT_INVALIDATE_LOOP_VIEW);
  58 + realTotalOffset = realTotalOffset - realOffset;
  59 + }
  60 + }
  61 +}
... ...
PersonalCenter/pickerview/src/main/java/com/bigkoo/pickerview/lib/WheelView.java
... ... @@ -0,0 +1,779 @@
  1 +package com.bigkoo.pickerview.lib;
  2 +
  3 +import android.content.Context;
  4 +import android.content.res.TypedArray;
  5 +import android.graphics.Canvas;
  6 +import android.graphics.Paint;
  7 +import android.graphics.Rect;
  8 +import android.graphics.Typeface;
  9 +import android.os.Handler;
  10 +import android.text.TextUtils;
  11 +import android.util.AttributeSet;
  12 +import android.util.DisplayMetrics;
  13 +import android.util.Log;
  14 +import android.view.GestureDetector;
  15 +import android.view.Gravity;
  16 +import android.view.MotionEvent;
  17 +import android.view.View;
  18 +
  19 +import com.bigkoo.pickerview.R;
  20 +import com.bigkoo.pickerview.adapter.WheelAdapter;
  21 +import com.bigkoo.pickerview.listener.OnItemSelectedListener;
  22 +import com.bigkoo.pickerview.model.IPickerViewData;
  23 +
  24 +import java.util.Locale;
  25 +import java.util.concurrent.Executors;
  26 +import java.util.concurrent.ScheduledExecutorService;
  27 +import java.util.concurrent.ScheduledFuture;
  28 +import java.util.concurrent.TimeUnit;
  29 +
  30 +/**
  31 + * 3d滚轮控件
  32 + */
  33 +public class WheelView extends View {
  34 +
  35 + public enum ACTION { // 点击,滑翔(滑到尽头),拖拽事件
  36 + CLICK, FLING, DAGGLE
  37 + }
  38 + public enum DividerType { // 分隔线类型
  39 + FILL, WRAP
  40 + }
  41 +
  42 + private DividerType dividerType;//分隔线类型
  43 +
  44 + Context context;
  45 +
  46 + Handler handler;
  47 + private GestureDetector gestureDetector;
  48 + OnItemSelectedListener onItemSelectedListener;
  49 +
  50 + private boolean isOptions = false;
  51 + private boolean isCenterLabel = true;
  52 +
  53 + // Timer mTimer;
  54 + ScheduledExecutorService mExecutor = Executors.newSingleThreadScheduledExecutor();
  55 + private ScheduledFuture<?> mFuture;
  56 +
  57 + Paint paintOuterText;
  58 + Paint paintCenterText;
  59 + Paint paintIndicator;
  60 +
  61 + WheelAdapter adapter;
  62 +
  63 + private String label;//附加单位
  64 + int textSize;//选项的文字大小
  65 + int maxTextWidth;
  66 + int maxTextHeight;
  67 + float itemHeight;//每行高度
  68 +
  69 + Typeface typeface = Typeface.MONOSPACE;//字体样式,默认是等宽字体
  70 +
  71 + int textColorOut = 0xFFa8a8a8;
  72 + int textColorCenter = 0xFF2a2a2a;
  73 + int dividerColor = 0xFFd5d5d5;
  74 +
  75 + // 条目间距倍数
  76 + float lineSpacingMultiplier = 1.6F;
  77 + boolean isLoop;
  78 +
  79 + // 第一条线Y坐标值
  80 + float firstLineY;
  81 + //第二条线Y坐标
  82 + float secondLineY;
  83 + //中间label绘制的Y坐标
  84 + float centerY;
  85 +
  86 + //滚动总高度y值
  87 + float totalScrollY;
  88 + //初始化默认选中项
  89 + int initPosition;
  90 + //选中的Item是第几个
  91 + private int selectedItem;
  92 + int preCurrentIndex;
  93 + //滚动偏移值,用于记录滚动了多少个item
  94 + int change;
  95 +
  96 + // 绘制几个条目,实际上第一项和最后一项Y轴压缩成0%了,所以可见的数目实际为9
  97 + int itemsVisible = 11;
  98 +
  99 + int measuredHeight;// WheelView 控件高度
  100 + int measuredWidth;// WheelView 控件宽度
  101 +
  102 + // 半圆周长
  103 + int halfCircumference;
  104 + // 半径
  105 + int radius;
  106 +
  107 + private int mOffset = 0;
  108 + private float previousY = 0;
  109 + long startTime = 0;
  110 +
  111 + // 修改这个值可以改变滑行速度
  112 + private static final int VELOCITYFLING = 5;
  113 + int widthMeasureSpec;
  114 +
  115 + private int mGravity = Gravity.CENTER;
  116 + private int drawCenterContentStart = 0;//中间选中文字开始绘制位置
  117 + private int drawOutContentStart = 0;//非中间文字开始绘制位置
  118 + private static final float SCALECONTENT = 0.8F;//非中间文字则用此控制高度,压扁形成3d错觉
  119 + private float CENTERCONTENTOFFSET ;//偏移量
  120 +
  121 + public WheelView(Context context) {
  122 + this(context, null);
  123 + }
  124 +
  125 + public WheelView(Context context, AttributeSet attrs) {
  126 + super(context, attrs);
  127 + /* textColorOut = getResources().getColor(R.color.pickerview_wheelview_textcolor_out);
  128 + textColorCenter =getResources().getColor(R.color.pickerview_wheelview_textcolor_center);
  129 + dividerColor = getResources().getColor(R.color.pickerview_wheelview_textcolor_out);*/
  130 +
  131 + textSize = getResources().getDimensionPixelSize(R.dimen.pickerview_textsize);//默认大小
  132 +
  133 + DisplayMetrics dm = getResources().getDisplayMetrics();
  134 + float density = dm.density; // 屏幕密度(0.75/1.0/1.5/2.0/3.0)
  135 +
  136 + if (density<1){//根据密度不同进行适配
  137 + CENTERCONTENTOFFSET=2.4F;
  138 + }else if (1<=density&&density<2){
  139 + CENTERCONTENTOFFSET = 3.6F;
  140 + }else if (1<=density&&density<2){
  141 + CENTERCONTENTOFFSET = 4.5F;
  142 + }else if (2<=density&&density<3){
  143 + CENTERCONTENTOFFSET = 6.0F;
  144 + }else if (density>=3){
  145 + CENTERCONTENTOFFSET= density * 2.5F;
  146 + }
  147 +
  148 +
  149 + if (attrs != null) {
  150 + TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.pickerview, 0, 0);
  151 + mGravity = a.getInt(R.styleable.pickerview_pickerview_gravity, Gravity.CENTER);
  152 + textColorOut = a.getColor(R.styleable.pickerview_pickerview_textColorOut, textColorOut);
  153 + textColorCenter = a.getColor(R.styleable.pickerview_pickerview_textColorCenter, textColorCenter);
  154 + dividerColor = a.getColor(R.styleable.pickerview_pickerview_dividerColor, dividerColor);
  155 + textSize = a.getDimensionPixelOffset(R.styleable.pickerview_pickerview_textSize, textSize);
  156 + lineSpacingMultiplier = a.getFloat(R.styleable.pickerview_pickerview_lineSpacingMultiplier, lineSpacingMultiplier);
  157 + a.recycle();//回收内存
  158 + }
  159 +
  160 + judgeLineSpae();
  161 +
  162 + initLoopView(context);
  163 + }
  164 +
  165 + /**
  166 + * 判断间距是否在1.0-2.0之间
  167 + */
  168 + private void judgeLineSpae() {
  169 + if (lineSpacingMultiplier < 1.2f) {
  170 + lineSpacingMultiplier = 1.2f;
  171 + } else if (lineSpacingMultiplier > 2.0f) {
  172 + lineSpacingMultiplier = 2.0f;
  173 + }
  174 + }
  175 +
  176 + private void initLoopView(Context context) {
  177 + this.context = context;
  178 + handler = new MessageHandler(this);
  179 + gestureDetector = new GestureDetector(context, new LoopViewGestureListener(this));
  180 + gestureDetector.setIsLongpressEnabled(false);
  181 +
  182 + isLoop = true;
  183 +
  184 + totalScrollY = 0;
  185 + initPosition = -1;
  186 +
  187 + initPaints();
  188 +
  189 + }
  190 +
  191 + private void initPaints() {
  192 + paintOuterText = new Paint();
  193 + paintOuterText.setColor(textColorOut);
  194 + paintOuterText.setAntiAlias(true);
  195 + paintOuterText.setTypeface(typeface);
  196 + paintOuterText.setTextSize(textSize);
  197 +
  198 + paintCenterText = new Paint();
  199 + paintCenterText.setColor(textColorCenter);
  200 + paintCenterText.setAntiAlias(true);
  201 + paintCenterText.setTextScaleX(1.1F);
  202 + paintCenterText.setTypeface(typeface);
  203 + paintCenterText.setTextSize(textSize);
  204 +
  205 +
  206 + paintIndicator = new Paint();
  207 + paintIndicator.setColor(dividerColor);
  208 + paintIndicator.setAntiAlias(true);
  209 +
  210 + if (android.os.Build.VERSION.SDK_INT >= 11) {
  211 + setLayerType(LAYER_TYPE_SOFTWARE, null);
  212 + }
  213 + }
  214 +
  215 + private void remeasure() {//重新测量
  216 + if (adapter == null) {
  217 + return;
  218 + }
  219 +
  220 + measureTextWidthHeight();
  221 +
  222 + //半圆的周长 = item高度乘以item数目-1
  223 + halfCircumference = (int) (itemHeight * (itemsVisible - 1));
  224 + //整个圆的周长除以PI得到直径,这个直径用作控件的总高度
  225 + measuredHeight = (int) ((halfCircumference * 2) / Math.PI);
  226 + //求出半径
  227 + radius = (int) (halfCircumference / Math.PI);
  228 + //控件宽度,这里支持weight
  229 + measuredWidth = MeasureSpec.getSize(widthMeasureSpec);
  230 + //计算两条横线 和 选中项画笔的基线Y位置
  231 + firstLineY = (measuredHeight - itemHeight) / 2.0F;
  232 + secondLineY = (measuredHeight + itemHeight) / 2.0F;
  233 + centerY = secondLineY - (itemHeight-maxTextHeight)/2.0f - CENTERCONTENTOFFSET;
  234 +
  235 + //初始化显示的item的position
  236 + if (initPosition == -1) {
  237 + if (isLoop) {
  238 + initPosition = (adapter.getItemsCount() + 1) / 2;
  239 + } else {
  240 + initPosition = 0;
  241 + }
  242 + }
  243 + preCurrentIndex = initPosition;
  244 + }
  245 +
  246 + /**
  247 + * 计算最大length的Text的宽高度
  248 + */
  249 + private void measureTextWidthHeight() {
  250 + Rect rect = new Rect();
  251 + for (int i = 0; i < adapter.getItemsCount(); i++) {
  252 + String s1 = getContentText(adapter.getItem(i));
  253 + paintCenterText.getTextBounds(s1, 0, s1.length(), rect);
  254 +
  255 + int textWidth = rect.width();
  256 +
  257 + if (textWidth > maxTextWidth) {
  258 + maxTextWidth = textWidth;
  259 + }
  260 + paintCenterText.getTextBounds("\u661F\u671F", 0, 2, rect); // 星期的字符编码(以它为标准高度)
  261 +
  262 + maxTextHeight = rect.height() + 2;
  263 +
  264 + }
  265 + itemHeight = lineSpacingMultiplier * maxTextHeight;
  266 + }
  267 +
  268 + void smoothScroll(ACTION action) {//平滑滚动的实现
  269 + cancelFuture();
  270 + if (action == ACTION.FLING || action == ACTION.DAGGLE) {
  271 + mOffset = (int) ((totalScrollY % itemHeight + itemHeight) % itemHeight);
  272 + if ((float) mOffset > itemHeight / 2.0F) {//如果超过Item高度的一半,滚动到下一个Item去
  273 + mOffset = (int) (itemHeight - (float) mOffset);
  274 + } else {
  275 + mOffset = -mOffset;
  276 + }
  277 + }
  278 + //停止的时候,位置有偏移,不是全部都能正确停止到中间位置的,这里把文字位置挪回中间去
  279 + mFuture = mExecutor.scheduleWithFixedDelay(new SmoothScrollTimerTask(this, mOffset), 0, 10, TimeUnit.MILLISECONDS);
  280 + }
  281 +
  282 + protected final void scrollBy(float velocityY) {//滚动惯性的实现
  283 + cancelFuture();
  284 + mFuture = mExecutor.scheduleWithFixedDelay(new InertiaTimerTask(this, velocityY), 0, VELOCITYFLING, TimeUnit.MILLISECONDS);
  285 + }
  286 +
  287 + public void cancelFuture() {
  288 + if (mFuture != null && !mFuture.isCancelled()) {
  289 + mFuture.cancel(true);
  290 + mFuture = null;
  291 + }
  292 + }
  293 +
  294 + /**
  295 + * 设置是否循环滚动
  296 + *
  297 + * @param cyclic 是否循环
  298 + */
  299 + public final void setCyclic(boolean cyclic) {
  300 + isLoop = cyclic;
  301 + }
  302 +
  303 + public final void setTypeface(Typeface font) {
  304 + typeface = font;
  305 + paintOuterText.setTypeface(typeface);
  306 + paintCenterText.setTypeface(typeface);
  307 + }
  308 +
  309 + public final void setTextSize(float size) {
  310 + if (size > 0.0F ) {
  311 + textSize = (int) (context.getResources().getDisplayMetrics().density * size);
  312 + paintOuterText.setTextSize(textSize);
  313 + paintCenterText.setTextSize(textSize);
  314 + }
  315 + }
  316 +
  317 + public final void setCurrentItem(int currentItem) {
  318 + //不添加这句,当这个wheelview不可见时,默认都是0,会导致获取到的时间错误
  319 + this.selectedItem = currentItem;
  320 + this.initPosition = currentItem;
  321 + totalScrollY = 0;//回归顶部,不然重设setCurrentItem的话位置会偏移的,就会显示出不对位置的数据
  322 + invalidate();
  323 + }
  324 +
  325 + public final void setOnItemSelectedListener(OnItemSelectedListener OnItemSelectedListener) {
  326 + this.onItemSelectedListener = OnItemSelectedListener;
  327 + }
  328 +
  329 + public final void setAdapter(WheelAdapter adapter) {
  330 + this.adapter = adapter;
  331 + remeasure();
  332 + invalidate();
  333 + }
  334 +
  335 + public final WheelAdapter getAdapter() {
  336 + return adapter;
  337 + }
  338 +
  339 + public final int getCurrentItem() {
  340 + return selectedItem;
  341 + }
  342 +
  343 + protected final void onItemSelected() {
  344 + if (onItemSelectedListener != null) {
  345 + postDelayed(new OnItemSelectedRunnable(this), 200L);
  346 + }
  347 + }
  348 +
  349 + @Override
  350 + protected void onDraw(Canvas canvas) {
  351 + if (adapter == null) {
  352 + return;
  353 + }
  354 + //initPosition越界会造成preCurrentIndex的值不正确
  355 + if(initPosition<0)
  356 + {
  357 + initPosition = 0;
  358 + }
  359 + if(initPosition>=adapter.getItemsCount())
  360 + {
  361 + initPosition = adapter.getItemsCount()-1;
  362 + }
  363 + //可见的item数组
  364 + Object visibles[] = new Object[itemsVisible];
  365 + //滚动的Y值高度除去每行Item的高度,得到滚动了多少个item,即change数
  366 + change = (int)(totalScrollY / itemHeight);
  367 +
  368 + try {
  369 + //滚动中实际的预选中的item(即经过了中间位置的item) = 滑动前的位置 + 滑动相对位置
  370 + preCurrentIndex = initPosition + change % adapter.getItemsCount();
  371 +
  372 + } catch (ArithmeticException e) {
  373 + Log.e("WheelView","出错了!adapter.getItemsCount() == 0,联动数据不匹配");
  374 + }
  375 + if (!isLoop) {//不循环的情况
  376 + if (preCurrentIndex < 0) {
  377 + preCurrentIndex = 0;
  378 + }
  379 + if (preCurrentIndex > adapter.getItemsCount() - 1) {
  380 + preCurrentIndex = adapter.getItemsCount() - 1;
  381 + }
  382 + } else {//循环
  383 + if (preCurrentIndex < 0) {//举个例子:如果总数是5,preCurrentIndex = -1,那么preCurrentIndex按循环来说,其实是0的上面,也就是4的位置
  384 + preCurrentIndex = adapter.getItemsCount() + preCurrentIndex;
  385 + }
  386 + if (preCurrentIndex > adapter.getItemsCount() - 1) {//同理上面,自己脑补一下
  387 + preCurrentIndex = preCurrentIndex - adapter.getItemsCount();
  388 + }
  389 + }
  390 + //跟滚动流畅度有关,总滑动距离与每个item高度取余,即并不是一格格的滚动,每个item不一定滚到对应Rect里的,这个item对应格子的偏移值
  391 + float itemHeightOffset = (totalScrollY % itemHeight);
  392 +
  393 + // 设置数组中每个元素的值
  394 + int counter = 0;
  395 + while (counter < itemsVisible) {
  396 + int index = preCurrentIndex - (itemsVisible / 2 - counter);//索引值,即当前在控件中间的item看作数据源的中间,计算出相对源数据源的index值
  397 + //判断是否循环,如果是循环数据源也使用相对循环的position获取对应的item值,如果不是循环则超出数据源范围使用""空白字符串填充,在界面上形成空白无数据的item项
  398 + if (isLoop) {
  399 + index = getLoopMappingIndex(index);
  400 + visibles[counter] = adapter.getItem(index);
  401 + } else if (index < 0) {
  402 + visibles[counter] = "";
  403 + } else if (index > adapter.getItemsCount() - 1) {
  404 + visibles[counter] = "";
  405 + } else {
  406 + visibles[counter] = adapter.getItem(index);
  407 + }
  408 +
  409 + counter++;
  410 +
  411 + }
  412 +
  413 + //绘制中间两条横线
  414 + if (dividerType == DividerType.WRAP){//横线长度仅包裹内容
  415 + float startX;
  416 + float endX;
  417 +
  418 + if (TextUtils.isEmpty(label)){//隐藏Label的情况
  419 + startX = (measuredWidth - maxTextWidth)/2 - 12;
  420 + }else {
  421 + startX = (measuredWidth - maxTextWidth)/4 - 12;
  422 + }
  423 +
  424 + if (startX<=0){//如果超过了WheelView的边缘
  425 + startX = 10;
  426 + }
  427 + endX = measuredWidth - startX;
  428 + canvas.drawLine(startX, firstLineY, endX, firstLineY, paintIndicator);
  429 + canvas.drawLine(startX, secondLineY, endX, secondLineY, paintIndicator);
  430 + }else {
  431 + canvas.drawLine(0.0F, firstLineY, measuredWidth, firstLineY, paintIndicator);
  432 + canvas.drawLine(0.0F, secondLineY, measuredWidth, secondLineY, paintIndicator);
  433 + }
  434 +
  435 + //只显示选中项Label文字的模式,并且Label文字不为空,则进行绘制
  436 + if (!TextUtils.isEmpty(label)&& isCenterLabel) {
  437 + //绘制文字,靠右并留出空隙
  438 + int drawRightContentStart = measuredWidth - getTextWidth(paintCenterText, label);
  439 + canvas.drawText(label, drawRightContentStart - CENTERCONTENTOFFSET, centerY, paintCenterText);
  440 + }
  441 +
  442 + counter = 0;
  443 + while (counter < itemsVisible) {
  444 + canvas.save();
  445 + // 弧长 L = itemHeight * counter - itemHeightOffset
  446 + // 求弧度 α = L / r (弧长/半径) [0,π]
  447 + double radian = ((itemHeight * counter - itemHeightOffset)) / radius;
  448 + // 弧度转换成角度(把半圆以Y轴为轴心向右转90度,使其处于第一象限及第四象限
  449 + // angle [-90°,90°]
  450 + float angle = (float) (90D - (radian / Math.PI) * 180D);//item第一项,从90度开始,逐渐递减到 -90度
  451 +
  452 + // 计算取值可能有细微偏差,保证负90°到90°以外的不绘制
  453 + if (angle >= 90F || angle <= -90F) {
  454 + canvas.restore();
  455 + } else {
  456 + //获取内容文字
  457 + String contentText;
  458 +
  459 + //如果是label每项都显示的模式,并且item内容不为空、label 也不为空
  460 + if(!isCenterLabel&&!TextUtils.isEmpty(label) &&!TextUtils.isEmpty(getContentText(visibles[counter]))){
  461 + contentText = getContentText(visibles[counter])+label;
  462 + }else {
  463 + contentText = getContentText(visibles[counter]);
  464 + }
  465 +
  466 + reMeasureTextSize(contentText);
  467 + //计算开始绘制的位置
  468 + measuredCenterContentStart(contentText);
  469 + measuredOutContentStart(contentText);
  470 + float translateY = (float) (radius - Math.cos(radian) * radius - (Math.sin(radian) * maxTextHeight) / 2D);
  471 + //根据Math.sin(radian)来更改canvas坐标系原点,然后缩放画布,使得文字高度进行缩放,形成弧形3d视觉差
  472 + canvas.translate(0.0F, translateY);
  473 + canvas.scale(1.0F, (float) Math.sin(radian));
  474 + if (translateY <= firstLineY && maxTextHeight + translateY >= firstLineY) {
  475 + // 条目经过第一条线
  476 + canvas.save();
  477 + canvas.clipRect(0, 0, measuredWidth, firstLineY - translateY);
  478 + canvas.scale(1.0F, (float) Math.sin(radian) * SCALECONTENT);
  479 + canvas.drawText(contentText, drawOutContentStart, maxTextHeight, paintOuterText);
  480 + canvas.restore();
  481 + canvas.save();
  482 + canvas.clipRect(0, firstLineY - translateY, measuredWidth, (int) (itemHeight));
  483 + canvas.scale(1.0F, (float) Math.sin(radian) * 1.0F);
  484 + canvas.drawText(contentText, drawCenterContentStart, maxTextHeight - CENTERCONTENTOFFSET, paintCenterText);
  485 + canvas.restore();
  486 + } else if (translateY <= secondLineY && maxTextHeight + translateY >= secondLineY) {
  487 + // 条目经过第二条线
  488 + canvas.save();
  489 + canvas.clipRect(0, 0, measuredWidth, secondLineY - translateY);
  490 + canvas.scale(1.0F, (float) Math.sin(radian) * 1.0F);
  491 + canvas.drawText(contentText, drawCenterContentStart, maxTextHeight - CENTERCONTENTOFFSET, paintCenterText);
  492 + canvas.restore();
  493 + canvas.save();
  494 + canvas.clipRect(0, secondLineY - translateY, measuredWidth, (int) (itemHeight));
  495 + canvas.scale(1.0F, (float) Math.sin(radian) * SCALECONTENT);
  496 + canvas.drawText(contentText, drawOutContentStart, maxTextHeight, paintOuterText);
  497 + canvas.restore();
  498 + } else if (translateY >= firstLineY && maxTextHeight + translateY <= secondLineY) {
  499 + // 中间条目
  500 + //canvas.clipRect(0, 0, measuredWidth, maxTextHeight);
  501 + //让文字居中
  502 + float Y = maxTextHeight - CENTERCONTENTOFFSET;//因为圆弧角换算的向下取值,导致角度稍微有点偏差,加上画笔的基线会偏上,因此需要偏移量修正一下
  503 + canvas.drawText(contentText, drawCenterContentStart, Y, paintCenterText);
  504 +
  505 + int preSelectedItem = adapter.indexOf(visibles[counter]);
  506 +
  507 + selectedItem = preSelectedItem;
  508 +
  509 + } else {
  510 + // 其他条目
  511 + canvas.save();
  512 + canvas.clipRect(0, 0, measuredWidth, (int) (itemHeight));
  513 + canvas.scale(1.0F, (float) Math.sin(radian) * SCALECONTENT);
  514 + canvas.drawText(contentText, drawOutContentStart, maxTextHeight, paintOuterText);
  515 + canvas.restore();
  516 + }
  517 + canvas.restore();
  518 + paintCenterText.setTextSize(textSize);
  519 + }
  520 + counter++;
  521 + }
  522 + }
  523 +
  524 + /**
  525 + * 根据文字的长度 重新设置文字的大小 让其能完全显示
  526 + * @param contentText
  527 + */
  528 + private void reMeasureTextSize(String contentText) {
  529 + Rect rect = new Rect();
  530 + paintCenterText.getTextBounds(contentText, 0, contentText.length(), rect);
  531 + int width = rect.width();
  532 + int size = textSize;
  533 + while (width > measuredWidth) {
  534 + size--;
  535 + //设置2条横线中间的文字大小
  536 + paintCenterText.setTextSize(size);
  537 + paintCenterText.getTextBounds(contentText, 0, contentText.length(), rect);
  538 + width = rect.width();
  539 + }
  540 + //设置2条横线外面的文字大小
  541 + paintOuterText.setTextSize(size);
  542 + }
  543 +
  544 +
  545 + //递归计算出对应的index
  546 + private int getLoopMappingIndex(int index) {
  547 + if (index < 0) {
  548 + index = index + adapter.getItemsCount();
  549 + index = getLoopMappingIndex(index);
  550 + } else if (index > adapter.getItemsCount() - 1) {
  551 + index = index - adapter.getItemsCount();
  552 + index = getLoopMappingIndex(index);
  553 + }
  554 + return index;
  555 + }
  556 +
  557 + /**
  558 + * 根据传进来的对象获取getPickerViewText()方法,来获取需要显示的值
  559 + *
  560 + * @param item 数据源的item
  561 + * @return 对应显示的字符串
  562 + */
  563 + private String getContentText(Object item) {
  564 + if (item == null) {
  565 + return "";
  566 + } else if (item instanceof IPickerViewData) {
  567 + return ((IPickerViewData) item).getPickerViewText();
  568 + } else if (item instanceof Integer) {
  569 + //如果为整形则最少保留两位数.
  570 + return String.format(Locale.getDefault(), "%02d", (int) item);
  571 + }
  572 + return item.toString();
  573 + }
  574 +
  575 + private void measuredCenterContentStart(String content) {
  576 + Rect rect = new Rect();
  577 + paintCenterText.getTextBounds(content, 0, content.length(), rect);
  578 + switch (mGravity) {
  579 + case Gravity.CENTER://显示内容居中
  580 + if (isOptions||label == null|| label.equals("")||!isCenterLabel) {
  581 + drawCenterContentStart = (int) ((measuredWidth - rect.width()) * 0.5);
  582 + } else {//只显示中间label时,时间选择器内容偏左一点,留出空间绘制单位标签
  583 + drawCenterContentStart = (int) ((measuredWidth - rect.width()) * 0.25);
  584 + }
  585 + break;
  586 + case Gravity.LEFT:
  587 + drawCenterContentStart = 0;
  588 + break;
  589 + case Gravity.RIGHT://添加偏移量
  590 + drawCenterContentStart = measuredWidth - rect.width() -(int)CENTERCONTENTOFFSET;
  591 + break;
  592 + }
  593 + }
  594 +
  595 + private void measuredOutContentStart(String content) {
  596 + Rect rect = new Rect();
  597 + paintOuterText.getTextBounds(content, 0, content.length(), rect);
  598 + switch (mGravity) {
  599 + case Gravity.CENTER:
  600 + if (isOptions||label == null|| label.equals("")||!isCenterLabel) {
  601 + drawOutContentStart = (int) ((measuredWidth - rect.width()) * 0.5);
  602 + } else {//只显示中间label时,时间选择器内容偏左一点,留出空间绘制单位标签
  603 + drawOutContentStart = (int) ((measuredWidth - rect.width()) * 0.25);
  604 + }
  605 + break;
  606 + case Gravity.LEFT:
  607 + drawOutContentStart = 0;
  608 + break;
  609 + case Gravity.RIGHT:
  610 + drawOutContentStart = measuredWidth - rect.width()-(int)CENTERCONTENTOFFSET;
  611 + break;
  612 + }
  613 + }
  614 +
  615 + @Override
  616 + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  617 + this.widthMeasureSpec = widthMeasureSpec;
  618 + remeasure();
  619 + setMeasuredDimension(measuredWidth, measuredHeight);
  620 + }
  621 +
  622 + @Override
  623 + public boolean onTouchEvent(MotionEvent event) {
  624 + boolean eventConsumed = gestureDetector.onTouchEvent(event);
  625 + switch (event.getAction()) {
  626 + //按下
  627 + case MotionEvent.ACTION_DOWN:
  628 + startTime = System.currentTimeMillis();
  629 + cancelFuture();
  630 + previousY = event.getRawY();
  631 + break;
  632 + //滑动中
  633 + case MotionEvent.ACTION_MOVE:
  634 +
  635 + float dy = previousY - event.getRawY();
  636 + previousY = event.getRawY();
  637 + totalScrollY = totalScrollY + dy;
  638 +
  639 + // 边界处理。
  640 + if (!isLoop) {
  641 + float top = -initPosition * itemHeight;
  642 + float bottom = (adapter.getItemsCount() - 1 - initPosition) * itemHeight;
  643 +
  644 +
  645 + if (totalScrollY - itemHeight * 0.25 < top) {
  646 + top = totalScrollY - dy;
  647 + } else if (totalScrollY + itemHeight * 0.25 > bottom) {
  648 + bottom = totalScrollY - dy;
  649 + }
  650 +
  651 + if (totalScrollY < top) {
  652 + totalScrollY = (int) top;
  653 + } else if (totalScrollY > bottom) {
  654 + totalScrollY = (int) bottom;
  655 + }
  656 + }
  657 + break;
  658 + //完成滑动,手指离开屏幕
  659 + case MotionEvent.ACTION_UP:
  660 +
  661 + default:
  662 + if (!eventConsumed) {//未消费掉事件
  663 +
  664 + /**
  665 + * TODO<关于弧长的计算>
  666 + *
  667 + * 弧长公式: L = α*R
  668 + * 反余弦公式:arccos(cosα) = α
  669 + * 由于之前是有顺时针偏移90度,
  670 + * 所以实际弧度范围α2的值 :α2 = π/2-α (α=[0,π] α2 = [-π/2,π/2])
  671 + * 根据正弦余弦转换公式 cosα = sin(π/2-α)
  672 + * 代入,得: cosα = sin(π/2-α) = sinα2 = (R - y) / R
  673 + * 所以弧长 L = arccos(cosα)*R = arccos((R - y) / R)*R
  674 + */
  675 +
  676 + float y = event.getY();
  677 + double L = Math.acos((radius - y) / radius) * radius;
  678 + //item0 有一半是在不可见区域,所以需要加上 itemHeight / 2
  679 + int circlePosition = (int) ((L + itemHeight / 2) / itemHeight);
  680 + float extraOffset = (totalScrollY % itemHeight + itemHeight) % itemHeight;
  681 + //已滑动的弧长值
  682 + mOffset = (int) ((circlePosition - itemsVisible / 2) * itemHeight - extraOffset);
  683 +
  684 + if ((System.currentTimeMillis() - startTime) > 120) {
  685 + // 处理拖拽事件
  686 + smoothScroll(ACTION.DAGGLE);
  687 + } else {
  688 + // 处理条目点击事件
  689 + smoothScroll(ACTION.CLICK);
  690 + }
  691 + }
  692 + break;
  693 + }
  694 +
  695 + invalidate();
  696 + return true;
  697 + }
  698 +
  699 + /**
  700 + * 获取Item个数
  701 + *
  702 + * @return item个数
  703 + */
  704 + public int getItemsCount() {
  705 + return adapter != null ? adapter.getItemsCount() : 0;
  706 + }
  707 +
  708 + /**
  709 + * 附加在右边的单位字符串
  710 + *
  711 + * @param label 单位
  712 + */
  713 + public void setLabel(String label) {
  714 + this.label = label;
  715 + }
  716 +
  717 + public void isCenterLabel(Boolean isCenterLabel) {
  718 + this.isCenterLabel = isCenterLabel;
  719 + }
  720 +
  721 + public void setGravity(int gravity) {
  722 + this.mGravity = gravity;
  723 + }
  724 +
  725 + public int getTextWidth(Paint paint, String str) {//计算文字宽度
  726 + int iRet = 0;
  727 + if (str != null && str.length() > 0) {
  728 + int len = str.length();
  729 + float[] widths = new float[len];
  730 + paint.getTextWidths(str, widths);
  731 + for (int j = 0; j < len; j++) {
  732 + iRet += (int) Math.ceil(widths[j]);
  733 + }
  734 + }
  735 + return iRet;
  736 + }
  737 +
  738 + public void setIsOptions(boolean options) {
  739 + isOptions = options;
  740 + }
  741 +
  742 +
  743 + public void setTextColorOut(int textColorOut) {
  744 + if (textColorOut != 0) {
  745 + this.textColorOut = textColorOut;
  746 + paintOuterText.setColor(this.textColorOut);
  747 + }
  748 + }
  749 +
  750 + public void setTextColorCenter(int textColorCenter) {
  751 + if (textColorCenter != 0) {
  752 +
  753 + this.textColorCenter = textColorCenter;
  754 + paintCenterText.setColor(this.textColorCenter);
  755 + }
  756 + }
  757 +
  758 + public void setDividerColor(int dividerColor) {
  759 + if (dividerColor != 0) {
  760 + this.dividerColor = dividerColor;
  761 + paintIndicator.setColor(this.dividerColor);
  762 + }
  763 + }
  764 + public void setDividerType(DividerType dividerType) {
  765 + this.dividerType = dividerType;
  766 + }
  767 +
  768 + public void setLineSpacingMultiplier(float lineSpacingMultiplier) {
  769 + if (lineSpacingMultiplier != 0) {
  770 +
  771 +
  772 + this.lineSpacingMultiplier = lineSpacingMultiplier;
  773 + judgeLineSpae();
  774 +
  775 + }
  776 + }
  777 +
  778 +
  779 +}
0 780 \ No newline at end of file
... ...
PersonalCenter/pickerview/src/main/java/com/bigkoo/pickerview/listener/CustomListener.java
... ... @@ -0,0 +1,13 @@
  1 +package com.bigkoo.pickerview.listener;
  2 +
  3 +import android.view.View;
  4 +
  5 +/**
  6 + * Created by KyuYi on 2017/3/2.
  7 + * E-Mail:kyu_yi@sina.com
  8 + * 功能:
  9 + */
  10 +
  11 +public interface CustomListener {
  12 + void customLayout(View v);
  13 +}
... ...
PersonalCenter/pickerview/src/main/java/com/bigkoo/pickerview/listener/OnDismissListener.java
... ... @@ -0,0 +1,8 @@
  1 +package com.bigkoo.pickerview.listener;
  2 +
  3 +/**
  4 + * Created by Sai on 15/8/9.
  5 + */
  6 +public interface OnDismissListener {
  7 + public void onDismiss(Object o);
  8 +}
... ...
PersonalCenter/pickerview/src/main/java/com/bigkoo/pickerview/listener/OnItemSelectedListener.java
... ... @@ -0,0 +1,6 @@
  1 +package com.bigkoo.pickerview.listener;
  2 +
  3 +
  4 +public interface OnItemSelectedListener {
  5 + void onItemSelected(int index);
  6 +}
... ...
PersonalCenter/pickerview/src/main/java/com/bigkoo/pickerview/model/IPickerViewData.java
... ... @@ -0,0 +1,8 @@
  1 +package com.bigkoo.pickerview.model;
  2 +
  3 +/**
  4 + * Created by Sai on 2016/7/13.
  5 + */
  6 +public interface IPickerViewData {
  7 + String getPickerViewText();
  8 +}
... ...
PersonalCenter/pickerview/src/main/java/com/bigkoo/pickerview/utils/PickerViewAnimateUtil.java
... ... @@ -0,0 +1,26 @@
  1 +package com.bigkoo.pickerview.utils;
  2 +
  3 +import android.view.Gravity;
  4 +
  5 +import com.bigkoo.pickerview.R;
  6 +
  7 +/**
  8 + * Created by Sai on 15/8/9.
  9 + */
  10 +public class PickerViewAnimateUtil {
  11 + private static final int INVALID = -1;
  12 + /**
  13 + * Get default animation resource when not defined by the user
  14 + *
  15 + * @param gravity the gravity of the dialog
  16 + * @param isInAnimation determine if is in or out animation. true when is is
  17 + * @return the id of the animation resource
  18 + */
  19 + public static int getAnimationResource(int gravity, boolean isInAnimation) {
  20 + switch (gravity) {
  21 + case Gravity.BOTTOM:
  22 + return isInAnimation ? R.anim.pickerview_slide_in_bottom : R.anim.pickerview_slide_out_bottom;
  23 + }
  24 + return INVALID;
  25 + }
  26 +}
... ...
PersonalCenter/pickerview/src/main/java/com/bigkoo/pickerview/view/BasePickerView.java
... ... @@ -0,0 +1,358 @@
  1 +package com.bigkoo.pickerview.view;
  2 +
  3 +import android.app.Activity;
  4 +import android.app.Dialog;
  5 +import android.content.Context;
  6 +import android.content.DialogInterface;
  7 +import android.graphics.Color;
  8 +import android.view.Gravity;
  9 +import android.view.KeyEvent;
  10 +import android.view.LayoutInflater;
  11 +import android.view.MotionEvent;
  12 +import android.view.View;
  13 +import android.view.ViewGroup;
  14 +import android.view.animation.Animation;
  15 +import android.view.animation.AnimationUtils;
  16 +import android.widget.FrameLayout;
  17 +
  18 +import com.bigkoo.pickerview.R;
  19 +import com.bigkoo.pickerview.listener.OnDismissListener;
  20 +import com.bigkoo.pickerview.utils.PickerViewAnimateUtil;
  21 +
  22 +/**
  23 + * Created by Sai on 15/11/22.
  24 + * 精仿iOSPickerViewController控件
  25 + */
  26 +public class BasePickerView {
  27 + private final FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
  28 + ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.BOTTOM
  29 + );
  30 +
  31 + private Context context;
  32 + protected ViewGroup contentContainer;
  33 + public ViewGroup decorView;//显示pickerview的根View,默认是activity的根view
  34 + private ViewGroup rootView;//附加View 的 根View
  35 + private ViewGroup dialogView;//附加Dialog 的 根View
  36 +
  37 + protected int pickerview_timebtn_nor = 0xFF057dff;
  38 + protected int pickerview_timebtn_pre = 0xFFc2daf5;
  39 + protected int pickerview_bg_topbar = 0xFFf5f5f5;
  40 + protected int pickerview_topbar_title = 0xFF000000;
  41 + protected int bgColor_default = 0xFFFFFFFF;
  42 +
  43 + private OnDismissListener onDismissListener;
  44 + private boolean dismissing;
  45 +
  46 + private Animation outAnim;
  47 + private Animation inAnim;
  48 + private boolean isShowing;
  49 + private int gravity = Gravity.BOTTOM;
  50 +
  51 +
  52 + private Dialog mDialog;
  53 + private boolean cancelable;//是否能取消
  54 +
  55 + protected View clickView;//是通过哪个View弹出的
  56 +
  57 + private boolean isAnim = true;
  58 + public BasePickerView(Context context) {
  59 + this.context = context;
  60 +
  61 + /*initViews();
  62 + init();
  63 + initEvents();*/
  64 + }
  65 +
  66 + protected void initViews(int backgroudId) {
  67 + LayoutInflater layoutInflater = LayoutInflater.from(context);
  68 + if (isDialog()) {
  69 + //如果是对话框模式
  70 + dialogView = (ViewGroup) layoutInflater.inflate(R.layout.layout_basepickerview, null, false);
  71 + //设置界面的背景为透明
  72 + dialogView.setBackgroundColor(Color.TRANSPARENT);
  73 + //这个是真正要加载时间选取器的父布局
  74 + contentContainer = (ViewGroup) dialogView.findViewById(R.id.content_container);
  75 + //设置对话框 左右间距屏幕30
  76 + this.params.leftMargin = 30;
  77 + this.params.rightMargin = 30;
  78 + contentContainer.setLayoutParams(this.params);
  79 + //创建对话框
  80 + createDialog();
  81 + //给背景设置点击事件,这样当点击内容以外的地方会关闭界面
  82 + dialogView.setOnClickListener(new View.OnClickListener() {
  83 + @Override
  84 + public void onClick(View view) {
  85 + dismiss();
  86 + }
  87 + });
  88 + } else {
  89 + //如果只是要显示在屏幕的下方
  90 + //decorView是activity的根View
  91 + if (decorView == null) {
  92 + decorView = (ViewGroup) ((Activity) context).getWindow().getDecorView().findViewById(android.R.id.content);
  93 + }
  94 + //将控件添加到decorView中
  95 + rootView = (ViewGroup) layoutInflater.inflate(R.layout.layout_basepickerview, decorView, false);
  96 + rootView.setLayoutParams(new FrameLayout.LayoutParams(
  97 + ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT
  98 + ));
  99 + if (backgroudId != 0) {
  100 + rootView.setBackgroundColor(backgroudId);
  101 + }
  102 + // rootView.setBackgroundColor(ContextCompat.getColor(context,backgroudId));
  103 + //这个是真正要加载时间选取器的父布局
  104 + contentContainer = (ViewGroup) rootView.findViewById(R.id.content_container);
  105 + contentContainer.setLayoutParams(params);
  106 + }
  107 + setKeyBackCancelable(true);
  108 + }
  109 +
  110 + protected void init() {
  111 + inAnim = getInAnimation();
  112 + outAnim = getOutAnimation();
  113 + }
  114 +
  115 + protected void initEvents() {
  116 + }
  117 +
  118 +
  119 + /**
  120 + * @param v (是通过哪个View弹出的)
  121 + * @param isAnim 是否显示动画效果
  122 + */
  123 + public void show(View v, boolean isAnim) {
  124 + this.clickView = v;
  125 + this.isAnim = isAnim;
  126 + show();
  127 + }
  128 +
  129 + public void show(boolean isAnim) {
  130 + this.isAnim = isAnim;
  131 + show();
  132 + }
  133 +
  134 + public void show(View v) {
  135 + this.clickView = v;
  136 + show();
  137 + }
  138 +
  139 +
  140 + /**
  141 + * 添加View到根视图
  142 + */
  143 + public void show() {
  144 + if (isDialog()) {
  145 + showDialog();
  146 + } else {
  147 + if (isShowing()) {
  148 + return;
  149 + }
  150 + isShowing = true;
  151 + onAttached(rootView);
  152 + rootView.requestFocus();
  153 + }
  154 + }
  155 +
  156 +
  157 + /**
  158 + * show的时候调用
  159 + *
  160 + * @param view 这个View
  161 + */
  162 + private void onAttached(View view) {
  163 + decorView.addView(view);
  164 + if(isAnim){
  165 + contentContainer.startAnimation(inAnim);
  166 + }
  167 + }
  168 +
  169 +
  170 + /**
  171 + * 检测该View是不是已经添加到根视图
  172 + *
  173 + * @return 如果视图已经存在该View返回true
  174 + */
  175 + public boolean isShowing() {
  176 + if (isDialog()) {
  177 + return false;
  178 + } else {
  179 + return rootView.getParent() != null || isShowing;
  180 + }
  181 +
  182 + }
  183 +
  184 + public void dismiss() {
  185 + if (isDialog()) {
  186 + dismissDialog();
  187 + } else {
  188 + if (dismissing) {
  189 + return;
  190 + }
  191 +
  192 + if (isAnim){
  193 + //消失动画
  194 + outAnim.setAnimationListener(new Animation.AnimationListener() {
  195 + @Override
  196 + public void onAnimationStart(Animation animation) {
  197 +
  198 + }
  199 +
  200 + @Override
  201 + public void onAnimationEnd(Animation animation) {
  202 + dismissImmediately();
  203 + }
  204 +
  205 + @Override
  206 + public void onAnimationRepeat(Animation animation) {
  207 +
  208 + }
  209 + });
  210 + contentContainer.startAnimation(outAnim);
  211 + } else {
  212 + dismissImmediately();
  213 + }
  214 + dismissing = true;
  215 + }
  216 +
  217 +
  218 + }
  219 +
  220 + public void dismissImmediately() {
  221 +
  222 + decorView.post(new Runnable() {
  223 + @Override
  224 + public void run() {
  225 + //从根视图移除
  226 + decorView.removeView(rootView);
  227 + isShowing = false;
  228 + dismissing = false;
  229 + if (onDismissListener != null) {
  230 + onDismissListener.onDismiss(BasePickerView.this);
  231 + }
  232 + }
  233 + });
  234 +
  235 +
  236 + }
  237 +
  238 + public Animation getInAnimation() {
  239 + int res = PickerViewAnimateUtil.getAnimationResource(this.gravity, true);
  240 + return AnimationUtils.loadAnimation(context, res);
  241 + }
  242 +
  243 + public Animation getOutAnimation() {
  244 + int res = PickerViewAnimateUtil.getAnimationResource(this.gravity, false);
  245 + return AnimationUtils.loadAnimation(context, res);
  246 + }
  247 +
  248 + public BasePickerView setOnDismissListener(OnDismissListener onDismissListener) {
  249 + this.onDismissListener = onDismissListener;
  250 + return this;
  251 + }
  252 +
  253 + public void setKeyBackCancelable(boolean isCancelable) {
  254 +
  255 + ViewGroup View;
  256 + if (isDialog()) {
  257 + View = dialogView;
  258 + } else {
  259 + View = rootView;
  260 + }
  261 +
  262 + View.setFocusable(isCancelable);
  263 + View.setFocusableInTouchMode(isCancelable);
  264 + if (isCancelable) {
  265 + View.setOnKeyListener(onKeyBackListener);
  266 + } else {
  267 + View.setOnKeyListener(null);
  268 + }
  269 + }
  270 +
  271 + private View.OnKeyListener onKeyBackListener = new View.OnKeyListener() {
  272 + @Override
  273 + public boolean onKey(View v, int keyCode, KeyEvent event) {
  274 + if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == MotionEvent.ACTION_DOWN
  275 + && isShowing()) {
  276 + dismiss();
  277 + return true;
  278 + }
  279 + return false;
  280 + }
  281 + };
  282 +
  283 + protected BasePickerView setOutSideCancelable(boolean isCancelable) {
  284 + if (rootView != null) {
  285 + View view = rootView.findViewById(R.id.outmost_container);
  286 +
  287 + if (isCancelable) {
  288 + view.setOnTouchListener(onCancelableTouchListener);
  289 + } else {
  290 + view.setOnTouchListener(null);
  291 + }
  292 + }
  293 +
  294 + return this;
  295 + }
  296 +
  297 + /**
  298 + * 设置对话框模式是否可以点击外部取消
  299 + *
  300 + * @param cancelable
  301 + */
  302 + public void setDialogOutSideCancelable(boolean cancelable) {
  303 + this.cancelable = cancelable;
  304 + }
  305 +
  306 +
  307 + /**
  308 + * Called when the user touch on black overlay in order to dismiss the dialog
  309 + */
  310 + private final View.OnTouchListener onCancelableTouchListener = new View.OnTouchListener() {
  311 + @Override
  312 + public boolean onTouch(View v, MotionEvent event) {
  313 + if (event.getAction() == MotionEvent.ACTION_DOWN) {
  314 + dismiss();
  315 + }
  316 + return false;
  317 + }
  318 + };
  319 +
  320 + public View findViewById(int id) {
  321 + return contentContainer.findViewById(id);
  322 + }
  323 +
  324 + public void createDialog() {
  325 + if (dialogView != null) {
  326 + mDialog = new Dialog(context, R.style.custom_dialog2);
  327 + mDialog.setCancelable(cancelable);//不能点外面取消,也不 能点back取消
  328 + mDialog.setContentView(dialogView);
  329 +
  330 + mDialog.getWindow().setWindowAnimations(R.style.pickerview_dialogAnim);
  331 + mDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
  332 + @Override
  333 + public void onDismiss(DialogInterface dialog) {
  334 + if (onDismissListener != null) {
  335 + onDismissListener.onDismiss(BasePickerView.this);
  336 + }
  337 + }
  338 + });
  339 + }
  340 +
  341 + }
  342 +
  343 + public void showDialog() {
  344 + if (mDialog != null) {
  345 + mDialog.show();
  346 + }
  347 + }
  348 +
  349 + public void dismissDialog() {
  350 + if (mDialog != null) {
  351 + mDialog.dismiss();
  352 + }
  353 + }
  354 +
  355 + public boolean isDialog() {
  356 + return false;
  357 + }
  358 +}
... ...
PersonalCenter/pickerview/src/main/java/com/bigkoo/pickerview/view/WheelOptions.java
... ... @@ -0,0 +1,378 @@
  1 +package com.bigkoo.pickerview.view;
  2 +
  3 +import android.graphics.Typeface;
  4 +import android.view.View;
  5 +
  6 +import com.bigkoo.pickerview.R;
  7 +import com.bigkoo.pickerview.adapter.ArrayWheelAdapter;
  8 +import com.bigkoo.pickerview.lib.WheelView;
  9 +import com.bigkoo.pickerview.listener.OnItemSelectedListener;
  10 +
  11 +import java.util.List;
  12 +
  13 +public class WheelOptions<T> {
  14 + private View view;
  15 + private WheelView wv_option1;
  16 + private WheelView wv_option2;
  17 + private WheelView wv_option3;
  18 +
  19 + private List<T> mOptions1Items;
  20 + private List<List<T>> mOptions2Items;
  21 + private List<T> N_mOptions2Items;
  22 + private List<List<List<T>>> mOptions3Items;
  23 + private List<T> N_mOptions3Items;
  24 + private boolean linkage;
  25 + private OnItemSelectedListener wheelListener_option1;
  26 + private OnItemSelectedListener wheelListener_option2;
  27 +
  28 + //文字的颜色和分割线的颜色
  29 + int textColorOut;
  30 + int textColorCenter;
  31 + int dividerColor;
  32 +
  33 + private WheelView.DividerType dividerType;
  34 +
  35 + // 条目间距倍数
  36 + float lineSpacingMultiplier = 1.6F;
  37 +
  38 + public View getView() {
  39 + return view;
  40 + }
  41 +
  42 + public void setView(View view) {
  43 + this.view = view;
  44 + }
  45 +
  46 + public WheelOptions(View view, Boolean linkage) {
  47 + super();
  48 + this.linkage = linkage;
  49 + this.view = view;
  50 + wv_option1 = (WheelView) view.findViewById(R.id.options1);// 初始化时显示的数据
  51 + wv_option2 = (WheelView) view.findViewById(R.id.options2);
  52 + wv_option3 = (WheelView) view.findViewById(R.id.options3);
  53 + }
  54 +
  55 +
  56 + public void setPicker(List<T> options1Items,
  57 + List<List<T>> options2Items,
  58 + List<List<List<T>>> options3Items) {
  59 + this.mOptions1Items = options1Items;
  60 + this.mOptions2Items = options2Items;
  61 + this.mOptions3Items = options3Items;
  62 + int len = ArrayWheelAdapter.DEFAULT_LENGTH;
  63 + if (this.mOptions3Items == null)
  64 + len = 8;
  65 + if (this.mOptions2Items == null)
  66 + len = 12;
  67 + // 选项1
  68 + wv_option1.setAdapter(new ArrayWheelAdapter(mOptions1Items, len));// 设置显示数据
  69 + wv_option1.setCurrentItem(0);// 初始化时显示的数据
  70 + // 选项2
  71 + if (mOptions2Items != null)
  72 + wv_option2.setAdapter(new ArrayWheelAdapter(mOptions2Items.get(0)));// 设置显示数据
  73 + wv_option2.setCurrentItem(wv_option1.getCurrentItem());// 初始化时显示的数据
  74 + // 选项3
  75 + if (mOptions3Items != null)
  76 + wv_option3.setAdapter(new ArrayWheelAdapter(mOptions3Items.get(0).get(0)));// 设置显示数据
  77 + wv_option3.setCurrentItem(wv_option3.getCurrentItem());
  78 + wv_option1.setIsOptions(true);
  79 + wv_option2.setIsOptions(true);
  80 + wv_option3.setIsOptions(true);
  81 +
  82 + if (this.mOptions2Items == null) {
  83 + wv_option2.setVisibility(View.GONE);
  84 + } else {
  85 + wv_option2.setVisibility(View.VISIBLE);
  86 + }
  87 + if (this.mOptions3Items == null) {
  88 + wv_option3.setVisibility(View.GONE);
  89 + } else {
  90 + wv_option3.setVisibility(View.VISIBLE);
  91 + }
  92 +
  93 + // 联动监听器
  94 + wheelListener_option1 = new OnItemSelectedListener() {
  95 +
  96 + @Override
  97 + public void onItemSelected(int index) {
  98 + int opt2Select = 0;
  99 + if (mOptions2Items != null) {
  100 + opt2Select = wv_option2.getCurrentItem();//上一个opt2的选中位置
  101 + //新opt2的位置,判断如果旧位置没有超过数据范围,则沿用旧位置,否则选中最后一项
  102 + opt2Select = opt2Select >= mOptions2Items.get(index).size() - 1 ? mOptions2Items.get(index).size() - 1 : opt2Select;
  103 +
  104 + wv_option2.setAdapter(new ArrayWheelAdapter(mOptions2Items.get(index)));
  105 + wv_option2.setCurrentItem(opt2Select);
  106 + }
  107 + if (mOptions3Items != null) {
  108 + wheelListener_option2.onItemSelected(opt2Select);
  109 + }
  110 + }
  111 + };
  112 + wheelListener_option2 = new OnItemSelectedListener() {
  113 +
  114 + @Override
  115 + public void onItemSelected(int index) {
  116 + if (mOptions3Items != null) {
  117 + int opt1Select = wv_option1.getCurrentItem();
  118 + opt1Select = opt1Select >= mOptions3Items.size() - 1 ? mOptions3Items.size() - 1 : opt1Select;
  119 + index = index >= mOptions2Items.get(opt1Select).size() - 1 ? mOptions2Items.get(opt1Select).size() - 1 : index;
  120 + int opt3 = wv_option3.getCurrentItem();//上一个opt3的选中位置
  121 + //新opt3的位置,判断如果旧位置没有超过数据范围,则沿用旧位置,否则选中最后一项
  122 + opt3 = opt3 >= mOptions3Items.get(opt1Select).get(index).size() - 1 ? mOptions3Items.get(opt1Select).get(index).size() - 1 : opt3;
  123 +
  124 + wv_option3.setAdapter(new ArrayWheelAdapter(mOptions3Items
  125 + .get(wv_option1.getCurrentItem()).get(index)));
  126 + wv_option3.setCurrentItem(opt3);
  127 +
  128 + }
  129 + }
  130 + };
  131 +
  132 + // 添加联动监听
  133 + if (options2Items != null && linkage)
  134 + wv_option1.setOnItemSelectedListener(wheelListener_option1);
  135 + if (options3Items != null && linkage)
  136 + wv_option2.setOnItemSelectedListener(wheelListener_option2);
  137 + }
  138 +
  139 +
  140 + //不联动情况下
  141 + public void setNPicker(List<T> options1Items,
  142 + List<T> options2Items,
  143 + List<T> options3Items) {
  144 + this.mOptions1Items = options1Items;
  145 + this.N_mOptions2Items = options2Items;
  146 + this.N_mOptions3Items = options3Items;
  147 + int len = ArrayWheelAdapter.DEFAULT_LENGTH;
  148 + if (this.N_mOptions3Items == null)
  149 + len = 8;
  150 + if (this.N_mOptions2Items == null)
  151 + len = 12;
  152 + // 选项1
  153 + wv_option1.setAdapter(new ArrayWheelAdapter(mOptions1Items, len));// 设置显示数据
  154 + wv_option1.setCurrentItem(0);// 初始化时显示的数据
  155 + // 选项2
  156 + if (N_mOptions2Items != null)
  157 + wv_option2.setAdapter(new ArrayWheelAdapter(N_mOptions2Items));// 设置显示数据
  158 + wv_option2.setCurrentItem(wv_option1.getCurrentItem());// 初始化时显示的数据
  159 + // 选项3
  160 + if (N_mOptions3Items != null)
  161 + wv_option3.setAdapter(new ArrayWheelAdapter(N_mOptions3Items));// 设置显示数据
  162 + wv_option3.setCurrentItem(wv_option3.getCurrentItem());
  163 + wv_option1.setIsOptions(true);
  164 + wv_option2.setIsOptions(true);
  165 + wv_option3.setIsOptions(true);
  166 +
  167 + if (this.N_mOptions2Items == null) {
  168 + wv_option2.setVisibility(View.GONE);
  169 + } else {
  170 + wv_option2.setVisibility(View.VISIBLE);
  171 + }
  172 + if (this.N_mOptions3Items == null) {
  173 + wv_option3.setVisibility(View.GONE);
  174 + } else {
  175 + wv_option3.setVisibility(View.VISIBLE);
  176 + }
  177 + }
  178 +
  179 +
  180 + public void setTextContentSize(int textSize) {
  181 + wv_option1.setTextSize(textSize);
  182 + wv_option2.setTextSize(textSize);
  183 + wv_option3.setTextSize(textSize);
  184 + }
  185 +
  186 + private void setTextColorOut() {
  187 + wv_option1.setTextColorOut(textColorOut);
  188 + wv_option2.setTextColorOut(textColorOut);
  189 + wv_option3.setTextColorOut(textColorOut);
  190 +
  191 + }
  192 +
  193 + private void setTextColorCenter() {
  194 + wv_option1.setTextColorCenter(textColorCenter);
  195 + wv_option2.setTextColorCenter(textColorCenter);
  196 + wv_option3.setTextColorCenter(textColorCenter);
  197 +
  198 + }
  199 +
  200 + private void setDividerColor() {
  201 + wv_option1.setDividerColor(dividerColor);
  202 + wv_option2.setDividerColor(dividerColor);
  203 + wv_option3.setDividerColor(dividerColor);
  204 + }
  205 +
  206 + private void setDividerType() {
  207 + wv_option1.setDividerType(dividerType);
  208 + wv_option2.setDividerType(dividerType);
  209 + wv_option3.setDividerType(dividerType);
  210 + }
  211 +
  212 + private void setLineSpacingMultiplier() {
  213 + wv_option1.setLineSpacingMultiplier(lineSpacingMultiplier);
  214 + wv_option2.setLineSpacingMultiplier(lineSpacingMultiplier);
  215 + wv_option3.setLineSpacingMultiplier(lineSpacingMultiplier);
  216 +
  217 + }
  218 +
  219 + /**
  220 + * 设置选项的单位
  221 + *
  222 + * @param label1 单位
  223 + * @param label2 单位
  224 + * @param label3 单位
  225 + */
  226 + public void setLabels(String label1, String label2, String label3) {
  227 + if (label1 != null)
  228 + wv_option1.setLabel(label1);
  229 + if (label2 != null)
  230 + wv_option2.setLabel(label2);
  231 + if (label3 != null)
  232 + wv_option3.setLabel(label3);
  233 + }
  234 +
  235 + /**
  236 + * 设置是否循环滚动
  237 + *
  238 + * @param cyclic 是否循环
  239 + */
  240 + public void setCyclic(boolean cyclic) {
  241 + wv_option1.setCyclic(cyclic);
  242 + wv_option2.setCyclic(cyclic);
  243 + wv_option3.setCyclic(cyclic);
  244 + }
  245 +
  246 + /**
  247 + * 设置字体样式
  248 + *
  249 + * @param font 系统提供的几种样式
  250 + */
  251 + public void setTypeface (Typeface font) {
  252 + wv_option1.setTypeface(font);
  253 + wv_option2.setTypeface(font);
  254 + wv_option3.setTypeface(font);
  255 + }
  256 +
  257 + /**
  258 + * 分别设置第一二三级是否循环滚动
  259 + *
  260 + * @param cyclic1,cyclic2,cyclic3 是否循环
  261 + */
  262 + public void setCyclic(boolean cyclic1, boolean cyclic2, boolean cyclic3) {
  263 + wv_option1.setCyclic(cyclic1);
  264 + wv_option2.setCyclic(cyclic2);
  265 + wv_option3.setCyclic(cyclic3);
  266 + }
  267 +
  268 +
  269 +
  270 + /**
  271 + * 返回当前选中的结果对应的位置数组 因为支持三级联动效果,分三个级别索引,0,1,2。
  272 + * 在快速滑动未停止时,点击确定按钮,会进行判断,如果匹配数据越界,则设为0,防止index出错导致崩溃。
  273 + *
  274 + * @return 索引数组
  275 + */
  276 + public int[] getCurrentItems() {
  277 + int[] currentItems = new int[3];
  278 + currentItems[0] = wv_option1.getCurrentItem();
  279 +
  280 + if (mOptions2Items!=null&&mOptions2Items.size()>0){//非空判断
  281 + currentItems[1] = wv_option2.getCurrentItem()>(mOptions2Items.get(currentItems[0]).size()-1)?0:wv_option2.getCurrentItem();
  282 + }else {
  283 + currentItems[1] = wv_option2.getCurrentItem();
  284 + }
  285 +
  286 + if (mOptions3Items!=null&&mOptions3Items.size()>0){//非空判断
  287 + currentItems[2] = wv_option3.getCurrentItem()>(mOptions3Items.get(currentItems[0]).get(currentItems[1]).size()-1)?0:wv_option3.getCurrentItem();
  288 + }else {
  289 + currentItems[2] = wv_option3.getCurrentItem();
  290 + }
  291 +
  292 + return currentItems;
  293 + }
  294 +
  295 + public void setCurrentItems(int option1, int option2, int option3) {
  296 + if (linkage) {
  297 + itemSelected(option1, option2, option3);
  298 + }
  299 + wv_option1.setCurrentItem(option1);
  300 + wv_option2.setCurrentItem(option2);
  301 + wv_option3.setCurrentItem(option3);
  302 + }
  303 +
  304 + private void itemSelected(int opt1Select, int opt2Select, int opt3Select) {
  305 + if (mOptions2Items != null) {
  306 + wv_option2.setAdapter(new ArrayWheelAdapter(mOptions2Items
  307 + .get(opt1Select)));
  308 + wv_option2.setCurrentItem(opt2Select);
  309 + }
  310 + if (mOptions3Items != null) {
  311 + wv_option3.setAdapter(new ArrayWheelAdapter(mOptions3Items
  312 + .get(opt1Select).get(
  313 + opt2Select)));
  314 + wv_option3.setCurrentItem(opt3Select);
  315 + }
  316 + }
  317 + /**
  318 + * 设置间距倍数,但是只能在1.2-2.0f之间
  319 + *
  320 + * @param lineSpacingMultiplier
  321 + */
  322 + public void setLineSpacingMultiplier(float lineSpacingMultiplier) {
  323 + this.lineSpacingMultiplier = lineSpacingMultiplier;
  324 + setLineSpacingMultiplier();
  325 + }
  326 +
  327 + /**
  328 + * 设置分割线的颜色
  329 + *
  330 + * @param dividerColor
  331 + */
  332 + public void setDividerColor(int dividerColor) {
  333 + this.dividerColor = dividerColor;
  334 + setDividerColor();
  335 + }
  336 +
  337 + /**
  338 + * 设置分割线的类型
  339 + *
  340 + * @param dividerType
  341 + */
  342 + public void setDividerType(WheelView.DividerType dividerType) {
  343 + this.dividerType = dividerType;
  344 + setDividerType();
  345 + }
  346 + /**
  347 + * 设置分割线之间的文字的颜色
  348 + *
  349 + * @param textColorCenter
  350 + */
  351 + public void setTextColorCenter(int textColorCenter) {
  352 + this.textColorCenter = textColorCenter;
  353 + setTextColorCenter();
  354 + }
  355 +
  356 + /**
  357 + * 设置分割线以外文字的颜色
  358 + *
  359 + * @param textColorOut
  360 + */
  361 + public void setTextColorOut(int textColorOut) {
  362 + this.textColorOut = textColorOut;
  363 + setTextColorOut();
  364 + }
  365 +
  366 + /**
  367 + * Label 是否只显示中间选中项的
  368 + *
  369 + * @param isCenterLabel
  370 + */
  371 +
  372 + public void isCenterLabel(Boolean isCenterLabel) {
  373 + wv_option1.isCenterLabel(isCenterLabel);
  374 + wv_option2.isCenterLabel(isCenterLabel);
  375 + wv_option3.isCenterLabel(isCenterLabel);
  376 + }
  377 +
  378 +}
... ...
PersonalCenter/pickerview/src/main/java/com/bigkoo/pickerview/view/WheelTime.java
... ... @@ -0,0 +1,700 @@
  1 +package com.bigkoo.pickerview.view;
  2 +
  3 +import android.view.View;
  4 +
  5 +import com.bigkoo.pickerview.R;
  6 +import com.bigkoo.pickerview.adapter.NumericWheelAdapter;
  7 +import com.bigkoo.pickerview.lib.WheelView;
  8 +import com.bigkoo.pickerview.listener.OnItemSelectedListener;
  9 +
  10 +import java.text.DateFormat;
  11 +import java.text.SimpleDateFormat;
  12 +import java.util.Arrays;
  13 +import java.util.Calendar;
  14 +import java.util.List;
  15 +
  16 +
  17 +public class WheelTime {
  18 + public static DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  19 + private View view;
  20 + private WheelView wv_year;
  21 + private WheelView wv_month;
  22 + private WheelView wv_day;
  23 + private WheelView wv_hours;
  24 + private WheelView wv_mins;
  25 + private WheelView wv_seconds;
  26 + private int gravity;
  27 +
  28 + private boolean[] type;
  29 + private static final int DEFAULT_START_YEAR = 1900;
  30 + private static final int DEFAULT_END_YEAR = 2100;
  31 + private static final int DEFAULT_START_MONTH = 1;
  32 + private static final int DEFAULT_END_MONTH = 12;
  33 + private static final int DEFAULT_START_DAY = 1;
  34 + private static final int DEFAULT_END_DAY = 31;
  35 +
  36 + private int startYear = DEFAULT_START_YEAR;
  37 + private int endYear = DEFAULT_END_YEAR;
  38 + private int startMonth = DEFAULT_START_MONTH;
  39 + private int endMonth = DEFAULT_END_MONTH;
  40 + private int startDay = DEFAULT_START_DAY;
  41 + private int endDay = DEFAULT_END_DAY; //表示31天的
  42 + private int currentYear;
  43 +
  44 +
  45 + // 根据屏幕密度来指定选择器字体的大小(不同屏幕可能不同)
  46 + private int textSize = 18;
  47 + //文字的颜色和分割线的颜色
  48 + int textColorOut;
  49 + int textColorCenter;
  50 + int dividerColor;
  51 + // 条目间距倍数
  52 + float lineSpacingMultiplier = 1.6F;
  53 +
  54 + private WheelView.DividerType dividerType;
  55 +
  56 + public WheelTime(View view) {
  57 + super();
  58 + this.view = view;
  59 + type = new boolean[]{true, true, true, true, true, true};
  60 + setView(view);
  61 + }
  62 +
  63 + public WheelTime(View view, boolean[] type, int gravity, int textSize) {
  64 + super();
  65 + this.view = view;
  66 + this.type = type;
  67 + this.gravity = gravity;
  68 + this.textSize = textSize;
  69 + setView(view);
  70 + }
  71 +
  72 + public void setPicker(int year, int month, int day) {
  73 + this.setPicker(year, month, day, 0, 0, 0);
  74 + }
  75 +
  76 + public void setPicker(int year, final int month, int day, int h, int m, int s) {
  77 + // 添加大小月月份并将其转换为list,方便之后的判断
  78 + String[] months_big = {"1", "3", "5", "7", "8", "10", "12"};
  79 + String[] months_little = {"4", "6", "9", "11"};
  80 +
  81 + final List<String> list_big = Arrays.asList(months_big);
  82 + final List<String> list_little = Arrays.asList(months_little);
  83 +
  84 + /* final Context context = view.getContext();*/
  85 + currentYear = year;
  86 + // 年
  87 + wv_year = (WheelView) view.findViewById(R.id.year);
  88 + wv_year.setAdapter(new NumericWheelAdapter(startYear, endYear));// 设置"年"的显示数据
  89 + /*wv_year.setLabel(context.getString(R.string.pickerview_year));// 添加文字*/
  90 + wv_year.setCurrentItem(year - startYear);// 初始化时显示的数据
  91 + wv_year.setGravity(gravity);
  92 + // 月
  93 + wv_month = (WheelView) view.findViewById(R.id.month);
  94 + if (startYear == endYear) {//开始年等于终止年
  95 + wv_month.setAdapter(new NumericWheelAdapter(startMonth, endMonth));
  96 + wv_month.setCurrentItem(month + 1 - startMonth);
  97 + } else if (year == startYear) {
  98 + //起始日期的月份控制
  99 + wv_month.setAdapter(new NumericWheelAdapter(startMonth, 12));
  100 + wv_month.setCurrentItem(month + 1 - startMonth);
  101 + } else if (year == endYear) {
  102 + //终止日期的月份控制
  103 + wv_month.setAdapter(new NumericWheelAdapter(1, endMonth));
  104 + wv_month.setCurrentItem(month);
  105 + } else {
  106 + wv_month.setAdapter(new NumericWheelAdapter(1, 12));
  107 + wv_month.setCurrentItem(month);
  108 + }
  109 + /* wv_month.setLabel(context.getString(R.string.pickerview_month));*/
  110 +
  111 + wv_month.setGravity(gravity);
  112 + // 日
  113 + wv_day = (WheelView) view.findViewById(R.id.day);
  114 +
  115 + if (startYear == endYear && startMonth == endMonth) {
  116 + if (list_big.contains(String.valueOf(month + 1))) {
  117 + if (endDay > 31) {
  118 + endDay = 31;
  119 + }
  120 + wv_day.setAdapter(new NumericWheelAdapter(startDay, endDay));
  121 + } else if (list_little.contains(String.valueOf(month + 1))) {
  122 + if (endDay > 30) {
  123 + endDay = 30;
  124 + }
  125 + wv_day.setAdapter(new NumericWheelAdapter(startDay, endDay));
  126 + } else {
  127 + // 闰年
  128 + if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
  129 + if (endDay > 29) {
  130 + endDay = 29;
  131 + }
  132 + wv_day.setAdapter(new NumericWheelAdapter(startDay, endDay));
  133 + } else {
  134 + if (endDay > 28) {
  135 + endDay = 28;
  136 + }
  137 + wv_day.setAdapter(new NumericWheelAdapter(startDay, endDay));
  138 + }
  139 + }
  140 + wv_day.setCurrentItem(day - startDay);
  141 + } else if (year == startYear && month + 1 == startMonth) {
  142 + // 起始日期的天数控制
  143 + if (list_big.contains(String.valueOf(month + 1))) {
  144 +
  145 + wv_day.setAdapter(new NumericWheelAdapter(startDay, 31));
  146 + } else if (list_little.contains(String.valueOf(month + 1))) {
  147 +
  148 + wv_day.setAdapter(new NumericWheelAdapter(startDay, 30));
  149 + } else {
  150 + // 闰年
  151 + if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
  152 +
  153 + wv_day.setAdapter(new NumericWheelAdapter(startDay, 29));
  154 + } else {
  155 +
  156 + wv_day.setAdapter(new NumericWheelAdapter(startDay, 28));
  157 + }
  158 + }
  159 + wv_day.setCurrentItem(day - startDay);
  160 + } else if (year == endYear && month + 1 == endMonth) {
  161 + // 终止日期的天数控制
  162 + if (list_big.contains(String.valueOf(month + 1))) {
  163 + if (endDay > 31) {
  164 + endDay = 31;
  165 + }
  166 + wv_day.setAdapter(new NumericWheelAdapter(1, endDay));
  167 + } else if (list_little.contains(String.valueOf(month + 1))) {
  168 + if (endDay > 30) {
  169 + endDay = 30;
  170 + }
  171 + wv_day.setAdapter(new NumericWheelAdapter(1, endDay));
  172 + } else {
  173 + // 闰年
  174 + if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
  175 + if (endDay > 29) {
  176 + endDay = 29;
  177 + }
  178 + wv_day.setAdapter(new NumericWheelAdapter(1, endDay));
  179 + } else {
  180 + if (endDay > 28) {
  181 + endDay = 28;
  182 + }
  183 + wv_day.setAdapter(new NumericWheelAdapter(1, endDay));
  184 + }
  185 + }
  186 + wv_day.setCurrentItem(day - 1);
  187 + } else {
  188 + // 判断大小月及是否闰年,用来确定"日"的数据
  189 + if (list_big.contains(String.valueOf(month + 1))) {
  190 +
  191 + wv_day.setAdapter(new NumericWheelAdapter(1, 31));
  192 + } else if (list_little.contains(String.valueOf(month + 1))) {
  193 +
  194 + wv_day.setAdapter(new NumericWheelAdapter(1, 30));
  195 + } else {
  196 + // 闰年
  197 + if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
  198 +
  199 + wv_day.setAdapter(new NumericWheelAdapter(1, 29));
  200 + } else {
  201 +
  202 + wv_day.setAdapter(new NumericWheelAdapter(1, 28));
  203 + }
  204 + }
  205 + wv_day.setCurrentItem(day - 1);
  206 + }
  207 +
  208 + /* wv_day.setLabel(context.getString(R.string.pickerview_day));*/
  209 +
  210 + wv_day.setGravity(gravity);
  211 + //时
  212 + wv_hours = (WheelView) view.findViewById(R.id.hour);
  213 + wv_hours.setAdapter(new NumericWheelAdapter(0, 23));
  214 + /* wv_hours.setLabel(context.getString(R.string.pickerview_hours));// 添加文字*/
  215 + wv_hours.setCurrentItem(h);
  216 + wv_hours.setGravity(gravity);
  217 + //分
  218 + wv_mins = (WheelView) view.findViewById(R.id.min);
  219 + wv_mins.setAdapter(new NumericWheelAdapter(0, 59));
  220 + /* wv_mins.setLabel(context.getString(R.string.pickerview_minutes));// 添加文字*/
  221 + wv_mins.setCurrentItem(m);
  222 + wv_mins.setGravity(gravity);
  223 + //秒
  224 + wv_seconds = (WheelView) view.findViewById(R.id.second);
  225 + wv_seconds.setAdapter(new NumericWheelAdapter(0, 59));
  226 + /* wv_seconds.setLabel(context.getString(R.string.pickerview_seconds));// 添加文字*/
  227 + wv_seconds.setCurrentItem(s);
  228 + wv_seconds.setGravity(gravity);
  229 +
  230 + // 添加"年"监听
  231 + OnItemSelectedListener wheelListener_year = new OnItemSelectedListener() {
  232 + @Override
  233 + public void onItemSelected(int index) {
  234 + int year_num = index + startYear;
  235 + currentYear = year_num;
  236 + int currentMonthItem = wv_month.getCurrentItem();//记录上一次的item位置
  237 + // 判断大小月及是否闰年,用来确定"日"的数据
  238 + if (startYear == endYear) {
  239 + //重新设置月份
  240 + wv_month.setAdapter(new NumericWheelAdapter(startMonth, endMonth));
  241 +
  242 + if (currentMonthItem > wv_month.getAdapter().getItemsCount() - 1) {
  243 + currentMonthItem = wv_month.getAdapter().getItemsCount() - 1;
  244 + wv_month.setCurrentItem(currentMonthItem);
  245 + }
  246 +
  247 + int monthNum = currentMonthItem + startMonth;
  248 +
  249 + if (startMonth == endMonth) {
  250 + //重新设置日
  251 + setReDay(year_num, monthNum, startDay, endDay, list_big, list_little);
  252 + } else if (monthNum == startMonth) {
  253 + //重新设置日
  254 + setReDay(year_num, monthNum, startDay, 31, list_big, list_little);
  255 + } else {
  256 + //重新设置日
  257 + setReDay(year_num, monthNum, 1, 31, list_big, list_little);
  258 + }
  259 + } else if (year_num == startYear) {//等于开始的年
  260 + //重新设置月份
  261 + wv_month.setAdapter(new NumericWheelAdapter(startMonth, 12));
  262 +
  263 + if (currentMonthItem > wv_month.getAdapter().getItemsCount() - 1) {
  264 + currentMonthItem = wv_month.getAdapter().getItemsCount() - 1;
  265 + wv_month.setCurrentItem(currentMonthItem);
  266 + }
  267 +
  268 + int month = currentMonthItem + startMonth;
  269 + if (month == startMonth) {
  270 +
  271 + //重新设置日
  272 + setReDay(year_num, month, startDay, 31, list_big, list_little);
  273 + } else {
  274 + //重新设置日
  275 +
  276 + setReDay(year_num, month, 1, 31, list_big, list_little);
  277 + }
  278 +
  279 + } else if (year_num == endYear) {
  280 + //重新设置月份
  281 + wv_month.setAdapter(new NumericWheelAdapter(1, endMonth));
  282 + if (currentMonthItem > wv_month.getAdapter().getItemsCount() - 1) {
  283 + currentMonthItem = wv_month.getAdapter().getItemsCount() - 1;
  284 + wv_month.setCurrentItem(currentMonthItem);
  285 + }
  286 + int monthNum = currentMonthItem + 1;
  287 +
  288 + if (monthNum == endMonth) {
  289 + //重新设置日
  290 + setReDay(year_num, monthNum, 1, endDay, list_big, list_little);
  291 + } else {
  292 + //重新设置日
  293 + setReDay(year_num, monthNum, 1, 31, list_big, list_little);
  294 + }
  295 +
  296 + } else {
  297 + //重新设置月份
  298 + wv_month.setAdapter(new NumericWheelAdapter(1, 12));
  299 + //重新设置日
  300 + setReDay(year_num, wv_month.getCurrentItem() + 1, 1, 31, list_big, list_little);
  301 +
  302 + }
  303 +
  304 + }
  305 + };
  306 + // 添加"月"监听
  307 + OnItemSelectedListener wheelListener_month = new OnItemSelectedListener() {
  308 + @Override
  309 + public void onItemSelected(int index) {
  310 + int month_num = index + 1;
  311 +
  312 + if (startYear == endYear) {
  313 + month_num = month_num + startMonth - 1;
  314 + if (startMonth == endMonth) {
  315 + //重新设置日
  316 + setReDay(currentYear, month_num, startDay, endDay, list_big, list_little);
  317 + } else if (startMonth == month_num) {
  318 +
  319 + //重新设置日
  320 + setReDay(currentYear, month_num, startDay, 31, list_big, list_little);
  321 + } else if (endMonth == month_num) {
  322 + setReDay(currentYear, month_num, 1, endDay, list_big, list_little);
  323 + } else {
  324 + setReDay(currentYear, month_num, 1, 31, list_big, list_little);
  325 + }
  326 + } else if (currentYear == startYear) {
  327 + month_num = month_num + startMonth - 1;
  328 + if (month_num == startMonth) {
  329 + //重新设置日
  330 + setReDay(currentYear, month_num, startDay, 31, list_big, list_little);
  331 + } else {
  332 + //重新设置日
  333 + setReDay(currentYear, month_num, 1, 31, list_big, list_little);
  334 + }
  335 +
  336 + } else if (currentYear == endYear) {
  337 + if (month_num == endMonth) {
  338 + //重新设置日
  339 + setReDay(currentYear, wv_month.getCurrentItem() + 1, 1, endDay, list_big, list_little);
  340 + } else {
  341 + setReDay(currentYear, wv_month.getCurrentItem() + 1, 1, 31, list_big, list_little);
  342 + }
  343 +
  344 + } else {
  345 + //重新设置日
  346 + setReDay(currentYear, month_num, 1, 31, list_big, list_little);
  347 +
  348 + }
  349 +
  350 +
  351 + }
  352 + };
  353 + wv_year.setOnItemSelectedListener(wheelListener_year);
  354 + wv_month.setOnItemSelectedListener(wheelListener_month);
  355 + if (type.length != 6) {
  356 + throw new RuntimeException("type[] length is not 6");
  357 + }
  358 + wv_year.setVisibility(type[0] ? View.VISIBLE : View.GONE);
  359 + wv_month.setVisibility(type[1] ? View.VISIBLE : View.GONE);
  360 + wv_day.setVisibility(type[2] ? View.VISIBLE : View.GONE);
  361 + wv_hours.setVisibility(type[3] ? View.VISIBLE : View.GONE);
  362 + wv_mins.setVisibility(type[4] ? View.VISIBLE : View.GONE);
  363 + wv_seconds.setVisibility(type[5] ? View.VISIBLE : View.GONE);
  364 + setContentTextSize();
  365 + }
  366 +
  367 +
  368 + private void setReDay(int year_num, int monthNum, int startD, int endD, List<String> list_big, List<String> list_little) {
  369 + int currentItem = wv_day.getCurrentItem();
  370 +
  371 + int maxItem;
  372 + if (list_big
  373 + .contains(String.valueOf(monthNum))) {
  374 + if (endD > 31) {
  375 + endD = 31;
  376 + }
  377 + wv_day.setAdapter(new NumericWheelAdapter(startD, endD));
  378 + maxItem = endD;
  379 + } else if (list_little.contains(String.valueOf(monthNum))) {
  380 + if (endD > 30) {
  381 + endD = 30;
  382 + }
  383 + wv_day.setAdapter(new NumericWheelAdapter(startD, endD));
  384 + maxItem = endD;
  385 + } else {
  386 + if ((year_num % 4 == 0 && year_num % 100 != 0)
  387 + || year_num % 400 == 0) {
  388 + if (endD > 29) {
  389 + endD = 29;
  390 + }
  391 + wv_day.setAdapter(new NumericWheelAdapter(startD, endD));
  392 + maxItem = endD;
  393 + } else {
  394 + if (endD > 28) {
  395 + endD = 28;
  396 + }
  397 + wv_day.setAdapter(new NumericWheelAdapter(startD, endD));
  398 + maxItem = endD;
  399 + }
  400 + }
  401 +
  402 + if (currentItem > wv_day.getAdapter().getItemsCount() - 1) {
  403 + currentItem = wv_day.getAdapter().getItemsCount() - 1;
  404 + wv_day.setCurrentItem(currentItem);
  405 + }
  406 +
  407 + }
  408 +
  409 +
  410 + private void setContentTextSize() {
  411 + wv_day.setTextSize(textSize);
  412 + wv_month.setTextSize(textSize);
  413 + wv_year.setTextSize(textSize);
  414 + wv_hours.setTextSize(textSize);
  415 + wv_mins.setTextSize(textSize);
  416 + wv_seconds.setTextSize(textSize);
  417 + }
  418 +
  419 + private void setTextColorOut() {
  420 + wv_day.setTextColorOut(textColorOut);
  421 + wv_month.setTextColorOut(textColorOut);
  422 + wv_year.setTextColorOut(textColorOut);
  423 + wv_hours.setTextColorOut(textColorOut);
  424 + wv_mins.setTextColorOut(textColorOut);
  425 + wv_seconds.setTextColorOut(textColorOut);
  426 + }
  427 +
  428 + private void setTextColorCenter() {
  429 + wv_day.setTextColorCenter(textColorCenter);
  430 + wv_month.setTextColorCenter(textColorCenter);
  431 + wv_year.setTextColorCenter(textColorCenter);
  432 + wv_hours.setTextColorCenter(textColorCenter);
  433 + wv_mins.setTextColorCenter(textColorCenter);
  434 + wv_seconds.setTextColorCenter(textColorCenter);
  435 + }
  436 +
  437 + private void setDividerColor() {
  438 + wv_day.setDividerColor(dividerColor);
  439 + wv_month.setDividerColor(dividerColor);
  440 + wv_year.setDividerColor(dividerColor);
  441 + wv_hours.setDividerColor(dividerColor);
  442 + wv_mins.setDividerColor(dividerColor);
  443 + wv_seconds.setDividerColor(dividerColor);
  444 + }
  445 +
  446 + private void setDividerType() {
  447 +
  448 + wv_day.setDividerType(dividerType);
  449 + wv_month.setDividerType(dividerType);
  450 + wv_year.setDividerType(dividerType);
  451 + wv_hours.setDividerType(dividerType);
  452 + wv_mins.setDividerType(dividerType);
  453 + wv_seconds.setDividerType(dividerType);
  454 +
  455 + }
  456 +
  457 + private void setLineSpacingMultiplier() {
  458 + wv_day.setLineSpacingMultiplier(lineSpacingMultiplier);
  459 + wv_month.setLineSpacingMultiplier(lineSpacingMultiplier);
  460 + wv_year.setLineSpacingMultiplier(lineSpacingMultiplier);
  461 + wv_hours.setLineSpacingMultiplier(lineSpacingMultiplier);
  462 + wv_mins.setLineSpacingMultiplier(lineSpacingMultiplier);
  463 + wv_seconds.setLineSpacingMultiplier(lineSpacingMultiplier);
  464 + }
  465 +
  466 + public void setLabels(String label_year, String label_month, String label_day, String label_hours, String label_mins, String label_seconds) {
  467 + if (label_year != null) {
  468 + wv_year.setLabel(label_year);
  469 + } else {
  470 + wv_year.setLabel(view.getContext().getString(R.string.pickerview_year));
  471 + }
  472 + if (label_month != null) {
  473 + wv_month.setLabel(label_month);
  474 + } else {
  475 + wv_month.setLabel(view.getContext().getString(R.string.pickerview_month));
  476 + }
  477 + if (label_day != null) {
  478 + wv_day.setLabel(label_day);
  479 + } else {
  480 + wv_day.setLabel(view.getContext().getString(R.string.pickerview_day));
  481 + }
  482 + if (label_hours != null) {
  483 + wv_hours.setLabel(label_hours);
  484 + } else {
  485 + wv_hours.setLabel(view.getContext().getString(R.string.pickerview_hours));
  486 + }
  487 + if (label_mins != null) {
  488 + wv_mins.setLabel(label_mins);
  489 + } else {
  490 + wv_mins.setLabel(view.getContext().getString(R.string.pickerview_minutes));
  491 + }
  492 + if (label_seconds != null) {
  493 + wv_seconds.setLabel(label_seconds);
  494 + } else {
  495 + wv_seconds.setLabel(view.getContext().getString(R.string.pickerview_seconds));
  496 + }
  497 +
  498 + }
  499 +
  500 +
  501 + /**
  502 + * 设置是否循环滚动
  503 + *
  504 + * @param cyclic
  505 + */
  506 + public void setCyclic(boolean cyclic) {
  507 + wv_year.setCyclic(cyclic);
  508 + wv_month.setCyclic(cyclic);
  509 + wv_day.setCyclic(cyclic);
  510 + wv_hours.setCyclic(cyclic);
  511 + wv_mins.setCyclic(cyclic);
  512 + wv_seconds.setCyclic(cyclic);
  513 + }
  514 +
  515 + public String getTime() {
  516 + StringBuffer sb = new StringBuffer();
  517 + if (currentYear == startYear) {
  518 + /* int i = wv_month.getCurrentItem() + startMonth;
  519 + System.out.println("i:" + i);*/
  520 + if ((wv_month.getCurrentItem() + startMonth) == startMonth) {
  521 + sb.append((wv_year.getCurrentItem() + startYear)).append("-")
  522 + .append((wv_month.getCurrentItem() + startMonth)).append("-")
  523 + .append((wv_day.getCurrentItem() + startDay)).append(" ")
  524 + .append(wv_hours.getCurrentItem()).append(":")
  525 + .append(wv_mins.getCurrentItem()).append(":")
  526 + .append(wv_seconds.getCurrentItem());
  527 + } else {
  528 + sb.append((wv_year.getCurrentItem() + startYear)).append("-")
  529 + .append((wv_month.getCurrentItem() + startMonth)).append("-")
  530 + .append((wv_day.getCurrentItem() + 1)).append(" ")
  531 + .append(wv_hours.getCurrentItem()).append(":")
  532 + .append(wv_mins.getCurrentItem()).append(":")
  533 + .append(wv_seconds.getCurrentItem());
  534 + }
  535 +
  536 +
  537 + } else {
  538 + sb.append((wv_year.getCurrentItem() + startYear)).append("-")
  539 + .append((wv_month.getCurrentItem() + 1)).append("-")
  540 + .append((wv_day.getCurrentItem() + 1)).append(" ")
  541 + .append(wv_hours.getCurrentItem()).append(":")
  542 + .append(wv_mins.getCurrentItem()).append(":")
  543 + .append(wv_seconds.getCurrentItem());
  544 + }
  545 +
  546 + return sb.toString();
  547 + }
  548 +
  549 + public View getView() {
  550 + return view;
  551 + }
  552 +
  553 + public void setView(View view) {
  554 + this.view = view;
  555 + }
  556 +
  557 + public int getStartYear() {
  558 + return startYear;
  559 + }
  560 +
  561 + public void setStartYear(int startYear) {
  562 + this.startYear = startYear;
  563 + }
  564 +
  565 + public int getEndYear() {
  566 + return endYear;
  567 + }
  568 +
  569 + public void setEndYear(int endYear) {
  570 + this.endYear = endYear;
  571 + }
  572 +
  573 +
  574 + public void setRangDate(Calendar startDate, Calendar endDate) {
  575 +
  576 + if (startDate == null && endDate != null) {
  577 + int year = endDate.get(Calendar.YEAR);
  578 + int month = endDate.get(Calendar.MONTH) + 1;
  579 + int day = endDate.get(Calendar.DAY_OF_MONTH);
  580 + if (year > startYear) {
  581 + this.endYear = year;
  582 + this.endMonth = month;
  583 + this.endDay = day;
  584 + } else if (year == startYear) {
  585 + if (month > startMonth) {
  586 + this.endYear = year;
  587 + this.endMonth = month;
  588 + this.endDay = day;
  589 + } else if (month == startMonth) {
  590 + if (month > startDay) {
  591 + this.endYear = year;
  592 + this.endMonth = month;
  593 + this.endDay = day;
  594 + }
  595 + }
  596 + }
  597 +
  598 + } else if (startDate != null && endDate == null) {
  599 + int year = startDate.get(Calendar.YEAR);
  600 + int month = startDate.get(Calendar.MONTH) + 1;
  601 + int day = startDate.get(Calendar.DAY_OF_MONTH);
  602 + if (year < endYear) {
  603 + this.startMonth = month;
  604 + this.startDay = day;
  605 + this.startYear = year;
  606 + } else if (year == endYear) {
  607 + if (month < endMonth) {
  608 + this.startMonth = month;
  609 + this.startDay = day;
  610 + this.startYear = year;
  611 + } else if (month == endMonth) {
  612 + if (day < endDay) {
  613 + this.startMonth = month;
  614 + this.startDay = day;
  615 + this.startYear = year;
  616 + }
  617 + }
  618 + }
  619 +
  620 + } else if (startDate != null && endDate != null) {
  621 + this.startYear = startDate.get(Calendar.YEAR);
  622 + this.endYear = endDate.get(Calendar.YEAR);
  623 + this.startMonth = startDate.get(Calendar.MONTH) + 1;
  624 + this.endMonth = endDate.get(Calendar.MONTH) + 1;
  625 + this.startDay = startDate.get(Calendar.DAY_OF_MONTH);
  626 + this.endDay = endDate.get(Calendar.DAY_OF_MONTH);
  627 +
  628 +
  629 + }
  630 +
  631 +
  632 + }
  633 +
  634 +
  635 + /**
  636 + * 设置间距倍数,但是只能在1.0-2.0f之间
  637 + *
  638 + * @param lineSpacingMultiplier
  639 + */
  640 + public void setLineSpacingMultiplier(float lineSpacingMultiplier) {
  641 + this.lineSpacingMultiplier = lineSpacingMultiplier;
  642 + setLineSpacingMultiplier();
  643 + }
  644 +
  645 + /**
  646 + * 设置分割线的颜色
  647 + *
  648 + * @param dividerColor
  649 + */
  650 + public void setDividerColor(int dividerColor) {
  651 + this.dividerColor = dividerColor;
  652 + setDividerColor();
  653 + }
  654 +
  655 + /**
  656 + * 设置分割线的类型
  657 + *
  658 + * @param dividerType
  659 + */
  660 + public void setDividerType(WheelView.DividerType dividerType) {
  661 + this.dividerType = dividerType;
  662 + setDividerType();
  663 + }
  664 +
  665 + /**
  666 + * 设置分割线之间的文字的颜色
  667 + *
  668 + * @param textColorCenter
  669 + */
  670 + public void setTextColorCenter(int textColorCenter) {
  671 + this.textColorCenter = textColorCenter;
  672 + setTextColorCenter();
  673 + }
  674 +
  675 + /**
  676 + * 设置分割线以外文字的颜色
  677 + *
  678 + * @param textColorOut
  679 + */
  680 + public void setTextColorOut(int textColorOut) {
  681 + this.textColorOut = textColorOut;
  682 + setTextColorOut();
  683 + }
  684 +
  685 + /**
  686 + * Label 是否只显示中间选中项的
  687 + *
  688 + * @param isCenterLabel
  689 + */
  690 +
  691 + public void isCenterLabel(Boolean isCenterLabel) {
  692 +
  693 + wv_day.isCenterLabel(isCenterLabel);
  694 + wv_month.isCenterLabel(isCenterLabel);
  695 + wv_year.isCenterLabel(isCenterLabel);
  696 + wv_hours.isCenterLabel(isCenterLabel);
  697 + wv_mins.isCenterLabel(isCenterLabel);
  698 + wv_seconds.isCenterLabel(isCenterLabel);
  699 + }
  700 +}
... ...
PersonalCenter/pickerview/src/main/res/anim/pickerview_dialog_scale_in.xml
... ... @@ -0,0 +1,19 @@
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<set xmlns:android="http://schemas.android.com/apk/res/android">
  3 +
  4 +
  5 + <alpha
  6 + android:duration="@integer/animation_default_duration"
  7 + android:fromAlpha="0.0"
  8 + android:toAlpha="1.0" />
  9 +
  10 + <scale
  11 + android:duration="@integer/animation_default_duration"
  12 + android:fromXScale="0.0"
  13 + android:toXScale="1.0"
  14 + android:fromYScale="0.0"
  15 + android:toYScale="1.0"
  16 + android:pivotX="50%"
  17 + android:pivotY="50%"/>
  18 +
  19 +</set>
0 20 \ No newline at end of file
... ...
PersonalCenter/pickerview/src/main/res/anim/pickerview_dialog_scale_out.xml
... ... @@ -0,0 +1,18 @@
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<set xmlns:android="http://schemas.android.com/apk/res/android">
  3 +
  4 +
  5 + <alpha
  6 + android:duration="@integer/animation_default_duration"
  7 + android:fromAlpha="1.0"
  8 + android:toAlpha="0.3" />
  9 +
  10 + <scale
  11 + android:duration="@integer/animation_default_duration"
  12 + android:fromXScale="1.0"
  13 + android:toXScale="0.0"
  14 + android:fromYScale="1.0"
  15 + android:toYScale="0.0"
  16 + android:pivotX="50%"
  17 + android:pivotY="50%"/>
  18 +</set>
0 19 \ No newline at end of file
... ...
PersonalCenter/pickerview/src/main/res/anim/pickerview_slide_in_bottom.xml
... ... @@ -0,0 +1,11 @@
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<set xmlns:android="http://schemas.android.com/apk/res/android"
  3 + android:shareInterpolator="false">
  4 +
  5 + <translate
  6 + android:duration="@integer/animation_default_duration"
  7 + android:fromXDelta="0%"
  8 + android:toXDelta="0%"
  9 + android:fromYDelta="100%"
  10 + android:toYDelta="0%"/>
  11 +</set>
0 12 \ No newline at end of file
... ...
PersonalCenter/pickerview/src/main/res/anim/pickerview_slide_out_bottom.xml
... ... @@ -0,0 +1,11 @@
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<set xmlns:android="http://schemas.android.com/apk/res/android"
  3 + android:shareInterpolator="false">
  4 +
  5 + <translate
  6 + android:duration="@integer/animation_default_duration"
  7 + android:fromXDelta="0%"
  8 + android:toXDelta="0%"
  9 + android:fromYDelta="0%"
  10 + android:toYDelta="100%"/>
  11 +</set>
0 12 \ No newline at end of file
... ...
PersonalCenter/pickerview/src/main/res/drawable/selector_pickerview_btn.xml
... ... @@ -0,0 +1,6 @@
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<selector
  3 + xmlns:android="http://schemas.android.com/apk/res/android">
  4 + <item android:state_pressed="true" android:color="@color/pickerview_timebtn_pre" />
  5 + <item android:color="@color/pickerview_timebtn_nor" />
  6 +</selector>
... ...
PersonalCenter/pickerview/src/main/res/layout/include_pickerview_topbar.xml
... ... @@ -0,0 +1,42 @@
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3 + android:id="@+id/rv_topbar"
  4 + android:layout_width="match_parent"
  5 + android:layout_height="match_parent">
  6 +
  7 + <Button
  8 + android:id="@+id/btnCancel"
  9 + android:layout_width="wrap_content"
  10 + android:layout_height="match_parent"
  11 + android:background="@android:color/transparent"
  12 + android:gravity="left|center_vertical"
  13 + android:paddingLeft="@dimen/pickerview_topbar_padding"
  14 + android:text="@string/pickerview_cancel"
  15 + android:layout_marginLeft="20dp"
  16 + android:textColor="@drawable/selector_pickerview_btn"
  17 + android:textSize="@dimen/pickerview_topbar_btn_textsize" />
  18 +
  19 + <TextView
  20 + android:id="@+id/tvTitle"
  21 + android:layout_width="match_parent"
  22 + android:gravity="center"
  23 + android:layout_height="wrap_content"
  24 + android:layout_centerVertical="true"
  25 + android:layout_toLeftOf="@+id/btnSubmit"
  26 + android:layout_toRightOf="@+id/btnCancel"
  27 + android:textColor="@color/pickerview_topbar_title"
  28 + android:textSize="@dimen/pickerview_topbar_title_textsize" />
  29 +
  30 + <Button
  31 + android:id="@id/btnSubmit"
  32 + android:layout_width="wrap_content"
  33 + android:layout_height="match_parent"
  34 + android:layout_alignParentRight="true"
  35 + android:background="@android:color/transparent"
  36 + android:gravity="right|center_vertical"
  37 + android:paddingRight="@dimen/pickerview_topbar_padding"
  38 + android:text="@string/pickerview_submit"
  39 + android:layout_marginRight="20dp"
  40 + android:textColor="@drawable/selector_pickerview_btn"
  41 + android:textSize="@dimen/pickerview_topbar_btn_textsize" />
  42 +</RelativeLayout>
... ...
PersonalCenter/pickerview/src/main/res/layout/layout_basepickerview.xml
... ... @@ -0,0 +1,16 @@
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<FrameLayout
  3 + android:id="@+id/outmost_container"
  4 + xmlns:android="http://schemas.android.com/apk/res/android"
  5 + android:layout_width="match_parent"
  6 + android:layout_height="match_parent"
  7 + android:clickable="true"
  8 + android:background="@color/pickerview_bgColor_overlay">
  9 +
  10 + <FrameLayout
  11 + android:id="@+id/content_container"
  12 + android:layout_width="wrap_content"
  13 + android:layout_height="wrap_content">
  14 + </FrameLayout>
  15 +
  16 +</FrameLayout>
0 17 \ No newline at end of file
... ...
PersonalCenter/pickerview/src/main/res/layout/pickerview_options.xml
... ... @@ -0,0 +1,39 @@
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3 + android:layout_width="wrap_content"
  4 + android:layout_height="wrap_content"
  5 + android:orientation="vertical">
  6 +
  7 + <include
  8 + layout="@layout/include_pickerview_topbar"
  9 + android:layout_width="match_parent"
  10 + android:layout_height="@dimen/pickerview_topbar_height" />
  11 +
  12 + <LinearLayout
  13 + android:id="@+id/optionspicker"
  14 + android:layout_width="match_parent"
  15 + android:layout_height="wrap_content"
  16 + android:background="@android:color/white"
  17 + android:orientation="horizontal">
  18 +
  19 + <com.bigkoo.pickerview.lib.WheelView
  20 + android:id="@+id/options1"
  21 + android:layout_width="match_parent"
  22 + android:layout_height="wrap_content"
  23 + android:layout_weight="1" />
  24 +
  25 + <com.bigkoo.pickerview.lib.WheelView
  26 + android:id="@+id/options2"
  27 + android:layout_width="match_parent"
  28 + android:layout_height="wrap_content"
  29 + android:layout_weight="1" />
  30 +
  31 + <com.bigkoo.pickerview.lib.WheelView
  32 + android:id="@+id/options3"
  33 + android:layout_width="match_parent"
  34 + android:layout_height="wrap_content"
  35 + android:layout_weight="1" />
  36 + </LinearLayout>
  37 +
  38 +
  39 +</LinearLayout>
0 40 \ No newline at end of file
... ...
PersonalCenter/pickerview/src/main/res/layout/pickerview_time.xml
... ... @@ -0,0 +1,59 @@
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3 + android:layout_width="wrap_content"
  4 + android:layout_height="wrap_content"
  5 + android:background="@color/pickerview_bgColor_default"
  6 + android:orientation="vertical">
  7 +
  8 +
  9 + <LinearLayout
  10 + android:id="@+id/timepicker"
  11 + android:layout_width="match_parent"
  12 + android:layout_height="wrap_content"
  13 + android:background="@android:color/white"
  14 + android:orientation="horizontal">
  15 +
  16 + <com.bigkoo.pickerview.lib.WheelView
  17 + android:id="@+id/year"
  18 + android:layout_width="match_parent"
  19 + android:layout_height="wrap_content"
  20 + android:layout_weight="0.96" />
  21 +
  22 + <com.bigkoo.pickerview.lib.WheelView
  23 +
  24 + android:id="@+id/month"
  25 + android:layout_width="match_parent"
  26 + android:layout_height="wrap_content"
  27 + android:layout_weight="1" />
  28 +
  29 + <com.bigkoo.pickerview.lib.WheelView
  30 + android:id="@+id/day"
  31 + android:layout_width="match_parent"
  32 + android:layout_height="wrap_content"
  33 + android:layout_weight="1" />
  34 +
  35 + <com.bigkoo.pickerview.lib.WheelView
  36 + android:id="@+id/hour"
  37 + android:layout_width="match_parent"
  38 + android:layout_height="wrap_content"
  39 + android:layout_weight="1" />
  40 +
  41 + <com.bigkoo.pickerview.lib.WheelView
  42 + android:id="@+id/min"
  43 + android:layout_width="match_parent"
  44 + android:layout_height="wrap_content"
  45 + android:layout_weight="1" />
  46 +
  47 + <com.bigkoo.pickerview.lib.WheelView
  48 + android:id="@+id/second"
  49 + android:layout_width="match_parent"
  50 + android:layout_height="wrap_content"
  51 + android:layout_weight="1" />
  52 + </LinearLayout>
  53 + <include
  54 + layout="@layout/include_pickerview_topbar"
  55 + android:layout_width="match_parent"
  56 + android:layout_height="@dimen/pickerview_topbar_height" />
  57 +
  58 +
  59 +</LinearLayout>
0 60 \ No newline at end of file
... ...
PersonalCenter/pickerview/src/main/res/values-en/strings.xml
... ... @@ -0,0 +1,11 @@
  1 +<resources>
  2 +
  3 + <string name="pickerview_cancel">Cancel</string>
  4 + <string name="pickerview_submit">Confirm</string>
  5 + <string name="pickerview_year"> </string>
  6 + <string name="pickerview_month"> </string>
  7 + <string name="pickerview_day"> </string>
  8 + <string name="pickerview_hours"> </string>
  9 + <string name="pickerview_minutes"> </string>
  10 + <string name="pickerview_seconds"> </string>
  11 +</resources>
... ...
PersonalCenter/pickerview/src/main/res/values/attrs.xml
... ... @@ -0,0 +1,15 @@
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<resources>
  3 + <declare-styleable name="pickerview">
  4 + <attr name="pickerview_gravity">
  5 + <enum name="center" value="17"/>
  6 + <enum name="left" value="3"/>
  7 + <enum name="right" value="5"/>
  8 + </attr>
  9 + <attr name="pickerview_textSize" format="dimension"/>
  10 + <attr name="pickerview_textColorOut" format="color"/>
  11 + <attr name="pickerview_textColorCenter" format="color"/>
  12 + <attr name="pickerview_dividerColor" format="color"/>
  13 + <attr name="pickerview_lineSpacingMultiplier" format="float"/>
  14 + </declare-styleable>
  15 +</resources>
0 16 \ No newline at end of file
... ...
PersonalCenter/pickerview/src/main/res/values/colors.xml
... ... @@ -0,0 +1,14 @@
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<resources>
  3 + <color name="pickerview_timebtn_nor">#057dff</color>
  4 + <color name="pickerview_timebtn_pre">#c2daf5</color>
  5 + <color name="pickerview_bg_topbar">#f5f5f5</color>
  6 +
  7 + <color name="pickerview_topbar_title">#000000</color>
  8 + <color name="pickerview_wheelview_textcolor_out">#a8a8a8</color>
  9 + <color name="pickerview_wheelview_textcolor_center">#2a2a2a</color>
  10 + <color name="pickerview_wheelview_textcolor_divider">#d5d5d5</color>
  11 + <color name="pickerview_bgColor_overlay">#60000000</color>
  12 + <color name="pickerview_bgColor_default">#FFFFFFFF</color>
  13 +
  14 +</resources>
... ...
PersonalCenter/pickerview/src/main/res/values/dimens.xml
... ... @@ -0,0 +1,13 @@
  1 +<resources>
  2 + <!-- 顶部按钮栏高度 -->
  3 + <dimen name="pickerview_topbar_height">44dp</dimen>
  4 +
  5 + <!-- 顶部按钮padding -->
  6 + <dimen name="pickerview_topbar_padding">20dp</dimen>
  7 +
  8 + <!-- 顶部按钮文字大小 -->
  9 + <dimen name="pickerview_topbar_btn_textsize">17sp</dimen>
  10 + <dimen name="pickerview_topbar_title_textsize">18sp</dimen>
  11 + <!-- 选项文字大小 -->
  12 + <dimen name="pickerview_textsize">20sp</dimen>
  13 +</resources>
... ...
PersonalCenter/pickerview/src/main/res/values/integers.xml
... ... @@ -0,0 +1,5 @@
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<resources>
  3 +
  4 + <integer name="animation_default_duration">300</integer>
  5 +</resources>
0 6 \ No newline at end of file
... ...
PersonalCenter/pickerview/src/main/res/values/strings.xml
... ... @@ -0,0 +1,11 @@
  1 +<resources>
  2 +
  3 + <string name="pickerview_cancel">取消</string>
  4 + <string name="pickerview_submit">确定</string>
  5 + <string name="pickerview_year">年</string>
  6 + <string name="pickerview_month">月</string>
  7 + <string name="pickerview_day">日</string>
  8 + <string name="pickerview_hours">时</string>
  9 + <string name="pickerview_minutes">分</string>
  10 + <string name="pickerview_seconds">秒</string>
  11 +</resources>
... ...
PersonalCenter/pickerview/src/main/res/values/styles.xml
... ... @@ -0,0 +1,25 @@
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<resources>
  3 + <style name="custom_dialog2" parent="@android:style/Theme.Dialog">
  4 + <item name="android:windowFrame">@null</item>
  5 + <!-- Dialog的windowFrame框为无 -->
  6 + <item name="android:windowIsFloating">true</item>
  7 + <!-- 是否漂现在activity上 -->
  8 + <item name="android:windowIsTranslucent">true</item>
  9 + <!-- 是否半透明 -->
  10 + <item name="android:windowNoTitle">true</item>
  11 + <item name="android:background">@null</item>
  12 + <item name="android:windowBackground">@android:color/transparent</item>
  13 + <item name="android:windowContentOverlay">@null</item>
  14 + <!-- 去除黑色边框的关键设置项 -->
  15 + <item name="android:backgroundDimEnabled">true</item>
  16 + <!-- 屏幕背景是否变暗 -->
  17 + <item name="android:backgroundDimAmount">0.3</item>
  18 + </style>
  19 +
  20 + <style name="pickerview_dialogAnim" mce_bogus="1" parent="android:Animation">
  21 + <item name="android:windowEnterAnimation">@anim/pickerview_dialog_scale_in</item>
  22 + <item name="android:windowExitAnimation">@anim/pickerview_dialog_scale_out</item>
  23 + </style>
  24 +
  25 +</resources>
... ...
PersonalCenter/settings.gradle
1   -include ':app', ':circledialog'
  1 +include ':app', ':circledialog', ':pickerview'
... ...