Commit db27de12ce6c74ee408e24598e094682613dbece
1 parent
e54c424ab1
Exists in
master
完成大多数界面,时间选择器,地区选择器
Showing
67 changed files
with
5511 additions
and
34 deletions
Show diff stats
PersonalCenter/.idea/gradle.xml
1 | <?xml version="1.0" encoding="UTF-8"?> | 1 | <?xml version="1.0" encoding="UTF-8"?> |
2 | <project version="4"> | 2 | <project version="4"> |
3 | <component name="GradleSettings"> | 3 | <component name="GradleSettings"> |
4 | <option name="linkedExternalProjectsSettings"> | 4 | <option name="linkedExternalProjectsSettings"> |
5 | <GradleProjectSettings> | 5 | <GradleProjectSettings> |
6 | <option name="distributionType" value="LOCAL" /> | 6 | <option name="distributionType" value="LOCAL" /> |
7 | <option name="externalProjectPath" value="$PROJECT_DIR$" /> | 7 | <option name="externalProjectPath" value="$PROJECT_DIR$" /> |
8 | <option name="gradleHome" value="C:\Program Files\Android\Android Studio\gradle\gradle-2.14.1" /> | 8 | <option name="gradleHome" value="C:\Program Files\Android\Android Studio\gradle\gradle-2.14.1" /> |
9 | <option name="modules"> | 9 | <option name="modules"> |
10 | <set> | 10 | <set> |
11 | <option value="$PROJECT_DIR$" /> | 11 | <option value="$PROJECT_DIR$" /> |
12 | <option value="$PROJECT_DIR$/app" /> | 12 | <option value="$PROJECT_DIR$/app" /> |
13 | <option value="$PROJECT_DIR$/circledialog" /> | 13 | <option value="$PROJECT_DIR$/circledialog" /> |
14 | <option value="$PROJECT_DIR$/pickerview" /> | ||
14 | </set> | 15 | </set> |
15 | </option> | 16 | </option> |
16 | <option name="resolveModulePerSourceSet" value="false" /> | 17 | <option name="resolveModulePerSourceSet" value="false" /> |
17 | </GradleProjectSettings> | 18 | </GradleProjectSettings> |
18 | </option> | 19 | </option> |
19 | </component> | 20 | </component> |
20 | </project> | 21 | </project> |
PersonalCenter/.idea/modules.xml
1 | <?xml version="1.0" encoding="UTF-8"?> | 1 | <?xml version="1.0" encoding="UTF-8"?> |
2 | <project version="4"> | 2 | <project version="4"> |
3 | <component name="ProjectModuleManager"> | 3 | <component name="ProjectModuleManager"> |
4 | <modules> | 4 | <modules> |
5 | <module fileurl="file://$PROJECT_DIR$/PersonalCenter.iml" filepath="$PROJECT_DIR$/PersonalCenter.iml" /> | 5 | <module fileurl="file://$PROJECT_DIR$/PersonalCenter.iml" filepath="$PROJECT_DIR$/PersonalCenter.iml" /> |
6 | <module fileurl="file://$PROJECT_DIR$/app/app.iml" filepath="$PROJECT_DIR$/app/app.iml" /> | 6 | <module fileurl="file://$PROJECT_DIR$/app/app.iml" filepath="$PROJECT_DIR$/app/app.iml" /> |
7 | <module fileurl="file://$PROJECT_DIR$/circledialog/circledialog.iml" filepath="$PROJECT_DIR$/circledialog/circledialog.iml" /> | 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 | </modules> | 9 | </modules> |
9 | </component> | 10 | </component> |
10 | </project> | 11 | </project> |
PersonalCenter/app/build.gradle
1 | apply plugin: 'com.android.application' | 1 | apply plugin: 'com.android.application' |
2 | 2 | ||
3 | android { | 3 | android { |
4 | compileSdkVersion 25 | 4 | compileSdkVersion 25 |
5 | buildToolsVersion "25.0.3" | 5 | buildToolsVersion "25.0.3" |
6 | defaultConfig { | 6 | defaultConfig { |
7 | applicationId "com.hjx.personalcenter" | 7 | applicationId "com.hjx.personalcenter" |
8 | minSdkVersion 15 | 8 | minSdkVersion 15 |
9 | targetSdkVersion 25 | 9 | targetSdkVersion 25 |
10 | versionCode 1 | 10 | versionCode 1 |
11 | versionName "1.0" | 11 | versionName "1.0" |
12 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" | 12 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" |
13 | } | 13 | } |
14 | buildTypes { | 14 | buildTypes { |
15 | release { | 15 | release { |
16 | minifyEnabled false | 16 | minifyEnabled false |
17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' | 17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' |
18 | } | 18 | } |
19 | } | 19 | } |
20 | } | 20 | } |
21 | 21 | ||
22 | dependencies { | 22 | dependencies { |
23 | compile fileTree(include: ['*.jar'], dir: 'libs') | 23 | compile fileTree(include: ['*.jar'], dir: 'libs') |
24 | androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { | 24 | androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { |
25 | exclude group: 'com.android.support', module: 'support-annotations' | 25 | exclude group: 'com.android.support', module: 'support-annotations' |
26 | }) | 26 | }) |
27 | compile 'com.android.support:appcompat-v7:25.3.1' | 27 | compile 'com.android.support:appcompat-v7:25.3.1' |
28 | testCompile 'junit:junit:4.12' | 28 | testCompile 'junit:junit:4.12' |
29 | compile project(':circledialog') | 29 | compile project(':circledialog') |
30 | compile project(':pickerview') | ||
30 | } | 31 | } |
31 | 32 |
PersonalCenter/app/src/main/AndroidManifest.xml
1 | <?xml version="1.0" encoding="utf-8"?> | 1 | <?xml version="1.0" encoding="utf-8"?> |
2 | <manifest xmlns:android="http://schemas.android.com/apk/res/android" | 2 | <manifest xmlns:android="http://schemas.android.com/apk/res/android" |
3 | package="com.hjx.personalcenter"> | 3 | package="com.hjx.personalcenter"> |
4 | 4 | ||
5 | <application | 5 | <application |
6 | android:allowBackup="true" | 6 | android:allowBackup="true" |
7 | android:icon="@mipmap/ic_launcher" | 7 | android:icon="@mipmap/ic_launcher" |
8 | android:label="@string/app_name" | 8 | android:label="@string/app_name" |
9 | android:supportsRtl="true" | 9 | android:supportsRtl="true" |
10 | android:theme="@style/Theme.AppCompat.Light.NoActionBar"> | 10 | android:theme="@style/Theme.AppCompat.Light.NoActionBar"> |
11 | <activity | 11 | <activity |
12 | android:name=".activity.MainActivity" | 12 | android:name=".activity.MainActivity" |
13 | android:launchMode="singleTask" | 13 | android:launchMode="singleTask" |
14 | android:screenOrientation="landscape"> | 14 | android:screenOrientation="landscape"> |
15 | <intent-filter> | 15 | <intent-filter> |
16 | <action android:name="android.intent.action.MAIN" /> | 16 | <action android:name="android.intent.action.MAIN" /> |
17 | 17 | ||
18 | <category android:name="android.intent.category.LAUNCHER" /> | 18 | <category android:name="android.intent.category.LAUNCHER" /> |
19 | </intent-filter> | 19 | </intent-filter> |
20 | </activity> | 20 | </activity> |
21 | <activity | 21 | <activity |
22 | android:name=".activity.LoginAndRegisterActivity" | 22 | android:name=".activity.LoginAndRegisterActivity" |
23 | android:launchMode="singleTask" | 23 | android:launchMode="singleTask" |
24 | android:screenOrientation="landscape"> | 24 | android:screenOrientation="landscape"> |
25 | 25 | ||
26 | </activity> | 26 | </activity> |
27 | <activity | 27 | <activity |
28 | android:name=".activity.ForgotPasswordActivity" | 28 | android:name=".activity.ForgotPasswordActivity" |
29 | android:launchMode="singleTask" | 29 | android:launchMode="singleTask" |
30 | android:screenOrientation="landscape"> | 30 | android:screenOrientation="landscape"> |
31 | 31 | ||
32 | </activity> | 32 | </activity> |
33 | <activity | 33 | <activity |
34 | android:name=".activity.ChangePasswordActivity" | 34 | android:name=".activity.ChangePasswordActivity" |
35 | android:launchMode="singleTask" | 35 | android:launchMode="singleTask" |
36 | android:screenOrientation="landscape"> | 36 | android:screenOrientation="landscape"> |
37 | 37 | ||
38 | </activity> | 38 | </activity> |
39 | <activity | 39 | <activity |
40 | android:name=".activity.RegisterInfoActivity" | 40 | android:name=".activity.RegisterInfoActivity" |
41 | android:launchMode="singleTask" | 41 | android:launchMode="singleTask" |
42 | android:screenOrientation="landscape"> | 42 | android:screenOrientation="landscape"> |
43 | 43 | ||
44 | </activity> | 44 | </activity> |
45 | <activity | 45 | <activity |
46 | android:name=".activity.ElectronicCardValidationActivity" | 46 | android:name=".activity.ElectronicCardValidationActivity" |
47 | android:launchMode="singleTask" | 47 | android:launchMode="singleTask" |
48 | android:screenOrientation="landscape"> | 48 | android:screenOrientation="landscape"> |
49 | 49 | ||
50 | </activity> | 50 | </activity> |
51 | <activity | 51 | <activity |
52 | android:name=".activity.ChangeBangDingActivity" | 52 | android:name=".activity.ChangeBangDingActivity" |
53 | android:launchMode="singleTask" | 53 | android:launchMode="singleTask" |
54 | android:screenOrientation="landscape"> | 54 | android:screenOrientation="landscape"> |
55 | 55 | ||
56 | </activity> | 56 | </activity> |
57 | <activity | 57 | <activity |
58 | android:name=".activity.ChangeElectronicCardInfoActivity" | 58 | android:name=".activity.ChangeElectronicCardInfoActivity" |
59 | android:launchMode="singleTask" | 59 | android:launchMode="singleTask" |
60 | android:screenOrientation="landscape"> | 60 | android:screenOrientation="landscape"> |
61 | 61 | ||
62 | </activity> | 62 | </activity> |
63 | <activity | 63 | <activity |
64 | android:name=".activity.ChangeEletronicCardPhone" | 64 | android:name=".activity.ChangeEletronicCardPhoneActivity" |
65 | android:launchMode="singleTask" | 65 | android:launchMode="singleTask" |
66 | android:screenOrientation="landscape"> | 66 | android:screenOrientation="landscape"> |
67 | 67 | ||
68 | </activity> | 68 | </activity> |
69 | <activity | 69 | <activity |
70 | android:name=".activity.ChoiseTextBookActivity" | 70 | android:name=".activity.ChoiseTextBookActivity" |
71 | android:launchMode="singleTask" | 71 | android:launchMode="singleTask" |
72 | android:screenOrientation="landscape"> | 72 | android:screenOrientation="landscape"> |
73 | 73 | ||
74 | </activity> | 74 | </activity> |
75 | <activity | 75 | <activity |
76 | android:name=".activity.TheStartPageActivity" | 76 | android:name=".activity.TheStartPageActivity" |
77 | android:launchMode="singleTask" | 77 | android:launchMode="singleTask" |
78 | android:screenOrientation="landscape"> | 78 | android:screenOrientation="landscape"> |
79 | 79 | ||
80 | </activity> | 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 | </application> | 105 | </application> |
82 | 106 | ||
83 | </manifest> | 107 | </manifest> |
PersonalCenter/app/src/main/java/com/hjx/personalcenter/activity/ChangeEletronicCardPhone.java
1 | package com.hjx.personalcenter.activity; | File was deleted | |
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 | } | ||
19 | 1 | package com.hjx.personalcenter.activity; |
PersonalCenter/app/src/main/java/com/hjx/personalcenter/activity/ChangeEletronicCardPhoneActivity.java
File was created | 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 | } | ||
19 |
PersonalCenter/app/src/main/java/com/hjx/personalcenter/activity/ElectronicCardEditInfoActivity.java
File was created | 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 | } | ||
96 |
PersonalCenter/app/src/main/java/com/hjx/personalcenter/activity/ElectronicCardInfoOKActivity.java
File was created | 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 | } | ||
19 |
PersonalCenter/app/src/main/java/com/hjx/personalcenter/activity/ElectronicCardLookInfoActivity.java
File was created | 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 | } | ||
19 |
PersonalCenter/app/src/main/java/com/hjx/personalcenter/activity/FeedBackActivity.java
File was created | 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 | } | ||
19 |
PersonalCenter/app/src/main/java/com/hjx/personalcenter/activity/MainActivity.java
1 | package com.hjx.personalcenter.activity; | 1 | package com.hjx.personalcenter.activity; |
2 | 2 | ||
3 | import android.content.Intent; | 3 | import android.content.Intent; |
4 | import android.support.v7.app.AppCompatActivity; | 4 | import android.support.v7.app.AppCompatActivity; |
5 | import android.os.Bundle; | 5 | import android.os.Bundle; |
6 | import android.view.View; | 6 | import android.view.View; |
7 | import android.widget.TextView; | 7 | import android.widget.TextView; |
8 | 8 | ||
9 | import com.hjx.personalcenter.R; | 9 | import com.hjx.personalcenter.R; |
10 | 10 | ||
11 | public class MainActivity extends AppCompatActivity { | 11 | public class MainActivity extends AppCompatActivity { |
12 | TextView ssss; | 12 | TextView ssss; |
13 | @Override | 13 | @Override |
14 | protected void onCreate(Bundle savedInstanceState) { | 14 | protected void onCreate(Bundle savedInstanceState) { |
15 | super.onCreate(savedInstanceState); | 15 | super.onCreate(savedInstanceState); |
16 | setContentView(R.layout.activity_main); | 16 | setContentView(R.layout.activity_main); |
17 | ssss = (TextView) findViewById(R.id.ssss); | 17 | ssss = (TextView) findViewById(R.id.ssss); |
18 | ssss.setOnClickListener(new View.OnClickListener() { | 18 | ssss.setOnClickListener(new View.OnClickListener() { |
19 | @Override | 19 | @Override |
20 | public void onClick(View v) { | 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 | startActivity(intent); | 22 | startActivity(intent); |
23 | } | 23 | } |
24 | }); | 24 | }); |
25 | } | 25 | } |
26 | } | 26 | } |
27 | 27 |
PersonalCenter/app/src/main/res/drawable/corcle_blue_bg.xml
File was created | 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> |
PersonalCenter/app/src/main/res/drawable/corcle_white_bg.xml
1 | <?xml version="1.0" encoding="utf-8"?> | File was deleted | |
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> |
PersonalCenter/app/src/main/res/layout/activity_electronic_look_cardinfo.xml
File was created | 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> |
PersonalCenter/app/src/main/res/layout/activity_electroniccard_info.xml
File was created | 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> |
PersonalCenter/app/src/main/res/layout/activity_feedback.xml
File was created | 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> |
PersonalCenter/app/src/main/res/layout/activity_ok_cardinfo.xml
File was created | 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> |
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
1 | <?xml version="1.0" encoding="utf-8"?> | 1 | <?xml version="1.0" encoding="utf-8"?> |
2 | <resources> | 2 | <resources> |
3 | <color name="colorPrimary">#3F51B5</color> | 3 | <color name="colorPrimary">#3F51B5</color> |
4 | <color name="colorPrimaryDark">#303F9F</color> | 4 | <color name="colorPrimaryDark">#303F9F</color> |
5 | <color name="colorAccent">#FF4081</color> | 5 | <color name="colorAccent">#FF4081</color> |
6 | <color name="white">#ffffffff</color> | 6 | <color name="white">#ffffffff</color> |
7 | <color name="login_edittext_hint">#afafaf</color> | 7 | <color name="login_edittext_hint">#afafaf</color> |
8 | <color name="login_text_blue">#1cb8ff</color> | 8 | <color name="login_text_blue">#1cb8ff</color> |
9 | <color name="login_text_black">#313131</color> | 9 | <color name="login_text_black">#313131</color> |
10 | <color name="login_edittext_normal">#d4d4d4</color> | 10 | <color name="login_edittext_normal">#d4d4d4</color> |
11 | <color name="error_hint">#ED1c24</color> | 11 | <color name="error_hint">#ED1c24</color> |
12 | <color name="login_edittext_pressed">#1cb8ff</color> | 12 | <color name="login_edittext_pressed">#1cb8ff</color> |
13 | <color name="cutoff_line">#CCCCCC</color> | 13 | <color name="cutoff_line">#CCCCCC</color> |
14 | <color name="electronic_card">#ff480f</color> | 14 | <color name="electronic_card">#ff480f</color> |
15 | <color name="electronic_text">#afafaf</color> | ||
16 | <color name="backgerangde_laout">#eeeeee</color> | ||
15 | 17 | ||
16 | </resources> | 18 | </resources> |
17 | 19 |
PersonalCenter/app/src/main/res/values/strings.xml
1 | <resources> | 1 | <resources> |
2 | <string name="app_name">PersonalCenter</string> | 2 | <string name="app_name">PersonalCenter</string> |
3 | 3 | ||
4 | 4 | ||
5 | 5 | ||
6 | //登录注册 | 6 | //登录注册 |
7 | <string name="cancel">取 消</string> | 7 | <string name="cancel">取 消</string> |
8 | <string name="ok">确 定</string> | 8 | <string name="ok">确 定</string> |
9 | <string name="forget_pwd">忘记密码</string> | 9 | <string name="forget_pwd">忘记密码</string> |
10 | <string name="string_menu_title">修改密码</string> | 10 | <string name="string_menu_title">修改密码</string> |
11 | <string name="string_regist_info">填写注册信息</string> | 11 | <string name="string_regist_info">填写注册信息</string> |
12 | <string name="string_textbook_info">选择教材版本</string> | 12 | <string name="string_textbook_info">选择教材版本</string> |
13 | <string name="string_regist_username">用户名</string> | 13 | <string name="string_regist_username">用户名</string> |
14 | <string name="string_regist_region">地区</string> | 14 | <string name="string_regist_region">地区</string> |
15 | <string name="string_regist_grade">年级</string> | 15 | <string name="string_regist_grade">年级</string> |
16 | <string name="string_regist_school">学校</string> | 16 | <string name="string_regist_school">学校</string> |
17 | <string name="string_regist_next">下一步</string> | 17 | <string name="string_regist_next">下一步</string> |
18 | <string name="string_start_page">开始学习体验</string> | 18 | <string name="string_start_page">开始学习体验</string> |
19 | <string name="bangding">绑定家长控制</string> | ||
20 | <string name="finish">完成</string> | ||
19 | 21 | ||
20 | //电子保卡 | 22 | //电子保卡 |
21 | <string name="string_electroniccard_info_title">填写保卡信息</string> | 23 | <string name="string_electroniccard_info_title">填写保卡信息</string> |
22 | <string name="string_electroniccard_info_fill">填写电子保卡</string> | 24 | <string name="string_electroniccard_info_fill">填写电子保卡</string> |
25 | <string name="change_electroniccard_info_fill">修改保卡信息</string> | ||
23 | <string name="string_electroniccard_info_change">修改保卡信息</string> | 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 | <string name="string_electroniccard_change_bangding">更换绑定</string> | 29 | <string name="string_electroniccard_change_bangding">更换绑定</string> |
30 | <string name="electronic_card">温馨提示:若您想修改的相关信息请拨打客服电话</string> | ||
25 | <string name="electronic_card1">请先填写《好记星-电子保卡》信息</string> | 31 | <string name="electronic_card1">请先填写《好记星-电子保卡》信息</string> |
26 | <string name="electronic_card2">该信息是本产品的三包证明,为维护您的合法权益,请认真填写</string> | 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 | </resources> | 43 | </resources> |
30 | 44 |
PersonalCenter/pickerview/.gitignore
File was created | 1 | /build | |
2 |
PersonalCenter/pickerview/build.gradle
File was created | 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 | } |
PersonalCenter/pickerview/proguard-rules.pro
File was created | 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 | #} | ||
18 |
PersonalCenter/pickerview/src/androidTest/java/com/bigkoo/pickerview/ApplicationTest.java
File was created | 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 | } |
PersonalCenter/pickerview/src/main/AndroidManifest.xml
File was created | 1 | <manifest xmlns:android="http://schemas.android.com/apk/res/android" | |
2 | package="com.bigkoo.pickerview"> | ||
3 | |||
4 | |||
5 | </manifest> | ||
6 |
PersonalCenter/pickerview/src/main/java/com/bigkoo/pickerview/OptionsPickerView.java
File was created | 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 | } | ||
543 |
PersonalCenter/pickerview/src/main/java/com/bigkoo/pickerview/TimePickerView.java
File was created | 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 | } | ||
556 |
PersonalCenter/pickerview/src/main/java/com/bigkoo/pickerview/adapter/ArrayWheelAdapter.java
File was created | 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 | } | ||
56 |
PersonalCenter/pickerview/src/main/java/com/bigkoo/pickerview/adapter/NumericWheelAdapter.java
File was created | 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 | } | ||
60 |
PersonalCenter/pickerview/src/main/java/com/bigkoo/pickerview/adapter/WheelAdapter.java
File was created | 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 | } | ||
25 |
PersonalCenter/pickerview/src/main/java/com/bigkoo/pickerview/lib/InertiaTimerTask.java
File was created | 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 | } | ||
69 |
PersonalCenter/pickerview/src/main/java/com/bigkoo/pickerview/lib/LoopViewGestureListener.java
File was created | 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 | } | ||
19 |
PersonalCenter/pickerview/src/main/java/com/bigkoo/pickerview/lib/MessageHandler.java
File was created | 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 | } | ||
35 |
PersonalCenter/pickerview/src/main/java/com/bigkoo/pickerview/lib/OnItemSelectedRunnable.java
File was created | 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 | } | ||
15 |
PersonalCenter/pickerview/src/main/java/com/bigkoo/pickerview/lib/SmoothScrollTimerTask.java
File was created | 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 | } | ||
62 |
PersonalCenter/pickerview/src/main/java/com/bigkoo/pickerview/lib/WheelView.java
File was created | 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 | } |
PersonalCenter/pickerview/src/main/java/com/bigkoo/pickerview/listener/CustomListener.java
File was created | 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 | } | ||
14 |
PersonalCenter/pickerview/src/main/java/com/bigkoo/pickerview/listener/OnDismissListener.java
File was created | 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 | } | ||
9 |
PersonalCenter/pickerview/src/main/java/com/bigkoo/pickerview/listener/OnItemSelectedListener.java
File was created | 1 | package com.bigkoo.pickerview.listener; | |
2 | |||
3 | |||
4 | public interface OnItemSelectedListener { | ||
5 | void onItemSelected(int index); | ||
6 | } | ||
7 |
PersonalCenter/pickerview/src/main/java/com/bigkoo/pickerview/model/IPickerViewData.java
File was created | 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 | } | ||
9 |
PersonalCenter/pickerview/src/main/java/com/bigkoo/pickerview/utils/PickerViewAnimateUtil.java
File was created | 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 | } | ||
27 |
PersonalCenter/pickerview/src/main/java/com/bigkoo/pickerview/view/BasePickerView.java
File was created | 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 | } | ||
359 |
PersonalCenter/pickerview/src/main/java/com/bigkoo/pickerview/view/WheelOptions.java
File was created | 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 | } | ||
379 |
PersonalCenter/pickerview/src/main/java/com/bigkoo/pickerview/view/WheelTime.java
File was created | 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 | } | ||
701 |
PersonalCenter/pickerview/src/main/res/anim/pickerview_dialog_scale_in.xml
File was created | 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> |
PersonalCenter/pickerview/src/main/res/anim/pickerview_dialog_scale_out.xml
File was created | 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> |
PersonalCenter/pickerview/src/main/res/anim/pickerview_slide_in_bottom.xml
File was created | 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> |
PersonalCenter/pickerview/src/main/res/anim/pickerview_slide_out_bottom.xml
File was created | 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> |
PersonalCenter/pickerview/src/main/res/drawable/selector_pickerview_btn.xml
File was created | 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> | ||
7 |
PersonalCenter/pickerview/src/main/res/layout/include_pickerview_topbar.xml
File was created | 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> | ||
43 |
PersonalCenter/pickerview/src/main/res/layout/layout_basepickerview.xml
File was created | 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> |
PersonalCenter/pickerview/src/main/res/layout/pickerview_options.xml
File was created | 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> |
PersonalCenter/pickerview/src/main/res/layout/pickerview_time.xml
File was created | 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> |
PersonalCenter/pickerview/src/main/res/values-en/strings.xml
File was created | 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> | ||
12 |
PersonalCenter/pickerview/src/main/res/values/attrs.xml
File was created | 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> |
PersonalCenter/pickerview/src/main/res/values/colors.xml
File was created | 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> | ||
15 |
PersonalCenter/pickerview/src/main/res/values/dimens.xml
File was created | 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> | ||
14 |
PersonalCenter/pickerview/src/main/res/values/integers.xml
File was created | 1 | <?xml version="1.0" encoding="utf-8"?> | |
2 | <resources> | ||
3 | |||
4 | <integer name="animation_default_duration">300</integer> | ||
5 | </resources> |
PersonalCenter/pickerview/src/main/res/values/strings.xml
File was created | 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> | ||
12 |
PersonalCenter/pickerview/src/main/res/values/styles.xml
File was created | 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> | ||
26 |
PersonalCenter/settings.gradle
1 | include ':app', ':circledialog' | 1 | include ':app', ':circledialog', ':pickerview' |
2 | 2 |