├── res
├── drawable-hdpi
│ ├── e.png
│ ├── n.png
│ ├── s.png
│ ├── w.png
│ ├── e_cn.png
│ ├── n_cn.png
│ ├── s_cn.png
│ ├── w_cn.png
│ ├── compass.png
│ ├── degree.png
│ ├── prompt.png
│ ├── app_icon.png
│ ├── number_0.png
│ ├── number_1.png
│ ├── number_2.png
│ ├── number_3.png
│ ├── number_4.png
│ ├── number_5.png
│ ├── number_6.png
│ ├── number_7.png
│ ├── number_8.png
│ ├── number_9.png
│ ├── compass_cn.png
│ ├── miui_cover.png
│ ├── background_light.png
│ ├── background_bottom.9.png
│ ├── background_compass.png
│ └── background_texture.png
├── drawable
│ └── background.xml
├── values-zh-rCN
│ └── strings.xml
├── values
│ └── strings.xml
└── layout
│ └── main.xml
├── .gitignore
├── README
├── AndroidManifest.xml
├── src
└── net
│ └── micode
│ └── compass
│ ├── CompassView.java
│ └── CompassActivity.java
└── NOTICE
/res/drawable-hdpi/e.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MiCode/Compass/HEAD/res/drawable-hdpi/e.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/n.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MiCode/Compass/HEAD/res/drawable-hdpi/n.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/s.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MiCode/Compass/HEAD/res/drawable-hdpi/s.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/w.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MiCode/Compass/HEAD/res/drawable-hdpi/w.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/e_cn.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MiCode/Compass/HEAD/res/drawable-hdpi/e_cn.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/n_cn.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MiCode/Compass/HEAD/res/drawable-hdpi/n_cn.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/s_cn.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MiCode/Compass/HEAD/res/drawable-hdpi/s_cn.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/w_cn.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MiCode/Compass/HEAD/res/drawable-hdpi/w_cn.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/compass.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MiCode/Compass/HEAD/res/drawable-hdpi/compass.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/degree.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MiCode/Compass/HEAD/res/drawable-hdpi/degree.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/prompt.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MiCode/Compass/HEAD/res/drawable-hdpi/prompt.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/app_icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MiCode/Compass/HEAD/res/drawable-hdpi/app_icon.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/number_0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MiCode/Compass/HEAD/res/drawable-hdpi/number_0.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/number_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MiCode/Compass/HEAD/res/drawable-hdpi/number_1.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/number_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MiCode/Compass/HEAD/res/drawable-hdpi/number_2.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/number_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MiCode/Compass/HEAD/res/drawable-hdpi/number_3.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/number_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MiCode/Compass/HEAD/res/drawable-hdpi/number_4.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/number_5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MiCode/Compass/HEAD/res/drawable-hdpi/number_5.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/number_6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MiCode/Compass/HEAD/res/drawable-hdpi/number_6.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/number_7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MiCode/Compass/HEAD/res/drawable-hdpi/number_7.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/number_8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MiCode/Compass/HEAD/res/drawable-hdpi/number_8.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/number_9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MiCode/Compass/HEAD/res/drawable-hdpi/number_9.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/compass_cn.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MiCode/Compass/HEAD/res/drawable-hdpi/compass_cn.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/miui_cover.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MiCode/Compass/HEAD/res/drawable-hdpi/miui_cover.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/background_light.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MiCode/Compass/HEAD/res/drawable-hdpi/background_light.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/background_bottom.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MiCode/Compass/HEAD/res/drawable-hdpi/background_bottom.9.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/background_compass.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MiCode/Compass/HEAD/res/drawable-hdpi/background_compass.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/background_texture.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MiCode/Compass/HEAD/res/drawable-hdpi/background_texture.png
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # generated files
2 | bin/
3 | gen/
4 |
5 | # Local configuration file (sdk path, etc)
6 | proguard.cfg
7 | project.properties
8 | .settings/
9 | .classpath
10 | .project
11 |
--------------------------------------------------------------------------------
/README:
--------------------------------------------------------------------------------
1 | [中文]
2 |
3 | 1. 本项目是MIUI指南针的社区开源版,由MIUI团队(www.miui.com) 发起并贡献第一批代码,遵循NOTICE文件所描述的开源协议,
4 | 今后为MiCode社区(www.micode.net) 拥有,并由社区发布和维护。
5 |
6 | 2. Bug反馈和跟踪,请访问Github,
7 | https://github.com/MiCode/Compass/issues?sort=created&direction=desc&state=open
8 |
9 | 3. 功能建议和综合讨论,请访问MiCode,
10 | http://micode.net/forum-40-1.html
11 |
12 |
13 | [English]
14 |
15 | 1. This is open source edition of MIUI Compass, it's first initiated and sponsored by MIUI team (www.miui.com).
16 | It's opened under license described by NOTICE file. It's owned by the MiCode community (www.micode.net). In future,
17 | the MiCode community will release and maintain this project.
18 |
19 | 2. Regarding issue tracking, please visit Github,
20 | https://github.com/MiCode/Compass/issues?sort=created&direction=desc&state=open
21 |
22 | 3. Regarding feature request and general discussion, please visit Micode forum,
23 | http://micode.net/forum-40-1.html
24 |
--------------------------------------------------------------------------------
/res/drawable/background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
17 |
18 |
22 |
--------------------------------------------------------------------------------
/res/values-zh-rCN/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
17 |
18 |
19 |
20 | 指南针
21 | 正在获取经纬度...
22 | 无法获取经纬度
23 | 北纬 %s
24 | 南纬 %sS
25 | 东经 %s
26 | 西经 %s
27 |
28 |
--------------------------------------------------------------------------------
/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
17 |
18 |
19 |
20 | Compass
21 | Getting location...
22 | Cannot get your location
23 | %s N
24 | %s S
25 | %s E
26 | %s W
27 |
28 |
--------------------------------------------------------------------------------
/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
17 |
18 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
32 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
--------------------------------------------------------------------------------
/src/net/micode/compass/CompassView.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package net.micode.compass;
18 |
19 | import android.content.Context;
20 | import android.graphics.Canvas;
21 | import android.graphics.drawable.Drawable;
22 | import android.util.AttributeSet;
23 | import android.widget.ImageView;
24 |
25 | public class CompassView extends ImageView {
26 | private float mDirection;
27 | private Drawable compass;
28 |
29 | public CompassView(Context context) {
30 | super(context);
31 | mDirection = 0.0f;
32 | compass = null;
33 | }
34 |
35 | public CompassView(Context context, AttributeSet attrs) {
36 | super(context, attrs);
37 | mDirection = 0.0f;
38 | compass = null;
39 | }
40 |
41 | public CompassView(Context context, AttributeSet attrs, int defStyle) {
42 | super(context, attrs, defStyle);
43 | mDirection = 0.0f;
44 | compass = null;
45 | }
46 |
47 | @Override
48 | protected void onDraw(Canvas canvas) {
49 | if (compass == null) {
50 | compass = getDrawable();
51 | compass.setBounds(0, 0, getWidth(), getHeight());
52 | }
53 |
54 | canvas.save();
55 | canvas.rotate(mDirection, getWidth() / 2, getHeight() / 2);
56 | compass.draw(canvas);
57 | canvas.restore();
58 | }
59 |
60 | public void updateDirection(float direction) {
61 | mDirection = direction;
62 | invalidate();
63 | }
64 |
65 | }
66 |
--------------------------------------------------------------------------------
/res/layout/main.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
17 |
18 |
21 |
22 |
26 |
27 |
33 |
34 |
39 |
40 |
44 |
45 |
51 |
52 |
59 |
60 |
61 |
64 |
65 |
66 |
73 |
74 |
75 |
76 |
77 |
82 |
83 |
87 |
88 |
93 |
94 |
100 |
101 |
106 |
107 |
108 |
109 |
110 |
114 |
115 |
120 |
121 |
122 |
130 |
131 |
132 |
133 |
134 |
142 |
143 |
--------------------------------------------------------------------------------
/NOTICE:
--------------------------------------------------------------------------------
1 |
2 | Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
3 |
4 | Licensed under the Apache License, Version 2.0 (the "License");
5 | you may not use this file except in compliance with the License.
6 |
7 | Unless required by applicable law or agreed to in writing, software
8 | distributed under the License is distributed on an "AS IS" BASIS,
9 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10 | See the License for the specific language governing permissions and
11 | limitations under the License.
12 |
13 |
14 | Apache License
15 | Version 2.0, January 2004
16 | http://www.apache.org/licenses/
17 |
18 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
19 |
20 | 1. Definitions.
21 |
22 | "License" shall mean the terms and conditions for use, reproduction,
23 | and distribution as defined by Sections 1 through 9 of this document.
24 |
25 | "Licensor" shall mean the copyright owner or entity authorized by
26 | the copyright owner that is granting the License.
27 |
28 | "Legal Entity" shall mean the union of the acting entity and all
29 | other entities that control, are controlled by, or are under common
30 | control with that entity. For the purposes of this definition,
31 | "control" means (i) the power, direct or indirect, to cause the
32 | direction or management of such entity, whether by contract or
33 | otherwise, or (ii) ownership of fifty percent (50%) or more of the
34 | outstanding shares, or (iii) beneficial ownership of such entity.
35 |
36 | "You" (or "Your") shall mean an individual or Legal Entity
37 | exercising permissions granted by this License.
38 |
39 | "Source" form shall mean the preferred form for making modifications,
40 | including but not limited to software source code, documentation
41 | source, and configuration files.
42 |
43 | "Object" form shall mean any form resulting from mechanical
44 | transformation or translation of a Source form, including but
45 | not limited to compiled object code, generated documentation,
46 | and conversions to other media types.
47 |
48 | "Work" shall mean the work of authorship, whether in Source or
49 | Object form, made available under the License, as indicated by a
50 | copyright notice that is included in or attached to the work
51 | (an example is provided in the Appendix below).
52 |
53 | "Derivative Works" shall mean any work, whether in Source or Object
54 | form, that is based on (or derived from) the Work and for which the
55 | editorial revisions, annotations, elaborations, or other modifications
56 | represent, as a whole, an original work of authorship. For the purposes
57 | of this License, Derivative Works shall not include works that remain
58 | separable from, or merely link (or bind by name) to the interfaces of,
59 | the Work and Derivative Works thereof.
60 |
61 | "Contribution" shall mean any work of authorship, including
62 | the original version of the Work and any modifications or additions
63 | to that Work or Derivative Works thereof, that is intentionally
64 | submitted to Licensor for inclusion in the Work by the copyright owner
65 | or by an individual or Legal Entity authorized to submit on behalf of
66 | the copyright owner. For the purposes of this definition, "submitted"
67 | means any form of electronic, verbal, or written communication sent
68 | to the Licensor or its representatives, including but not limited to
69 | communication on electronic mailing lists, source code control systems,
70 | and issue tracking systems that are managed by, or on behalf of, the
71 | Licensor for the purpose of discussing and improving the Work, but
72 | excluding communication that is conspicuously marked or otherwise
73 | designated in writing by the copyright owner as "Not a Contribution."
74 |
75 | "Contributor" shall mean Licensor and any individual or Legal Entity
76 | on behalf of whom a Contribution has been received by Licensor and
77 | subsequently incorporated within the Work.
78 |
79 | 2. Grant of Copyright License. Subject to the terms and conditions of
80 | this License, each Contributor hereby grants to You a perpetual,
81 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
82 | copyright license to reproduce, prepare Derivative Works of,
83 | publicly display, publicly perform, sublicense, and distribute the
84 | Work and such Derivative Works in Source or Object form.
85 |
86 | 3. Grant of Patent License. Subject to the terms and conditions of
87 | this License, each Contributor hereby grants to You a perpetual,
88 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
89 | (except as stated in this section) patent license to make, have made,
90 | use, offer to sell, sell, import, and otherwise transfer the Work,
91 | where such license applies only to those patent claims licensable
92 | by such Contributor that are necessarily infringed by their
93 | Contribution(s) alone or by combination of their Contribution(s)
94 | with the Work to which such Contribution(s) was submitted. If You
95 | institute patent litigation against any entity (including a
96 | cross-claim or counterclaim in a lawsuit) alleging that the Work
97 | or a Contribution incorporated within the Work constitutes direct
98 | or contributory patent infringement, then any patent licenses
99 | granted to You under this License for that Work shall terminate
100 | as of the date such litigation is filed.
101 |
102 | 4. Redistribution. You may reproduce and distribute copies of the
103 | Work or Derivative Works thereof in any medium, with or without
104 | modifications, and in Source or Object form, provided that You
105 | meet the following conditions:
106 |
107 | (a) You must give any other recipients of the Work or
108 | Derivative Works a copy of this License; and
109 |
110 | (b) You must cause any modified files to carry prominent notices
111 | stating that You changed the files; and
112 |
113 | (c) You must retain, in the Source form of any Derivative Works
114 | that You distribute, all copyright, patent, trademark, and
115 | attribution notices from the Source form of the Work,
116 | excluding those notices that do not pertain to any part of
117 | the Derivative Works; and
118 |
119 | (d) If the Work includes a "NOTICE" text file as part of its
120 | distribution, then any Derivative Works that You distribute must
121 | include a readable copy of the attribution notices contained
122 | within such NOTICE file, excluding those notices that do not
123 | pertain to any part of the Derivative Works, in at least one
124 | of the following places: within a NOTICE text file distributed
125 | as part of the Derivative Works; within the Source form or
126 | documentation, if provided along with the Derivative Works; or,
127 | within a display generated by the Derivative Works, if and
128 | wherever such third-party notices normally appear. The contents
129 | of the NOTICE file are for informational purposes only and
130 | do not modify the License. You may add Your own attribution
131 | notices within Derivative Works that You distribute, alongside
132 | or as an addendum to the NOTICE text from the Work, provided
133 | that such additional attribution notices cannot be construed
134 | as modifying the License.
135 |
136 | You may add Your own copyright statement to Your modifications and
137 | may provide additional or different license terms and conditions
138 | for use, reproduction, or distribution of Your modifications, or
139 | for any such Derivative Works as a whole, provided Your use,
140 | reproduction, and distribution of the Work otherwise complies with
141 | the conditions stated in this License.
142 |
143 | 5. Submission of Contributions. Unless You explicitly state otherwise,
144 | any Contribution intentionally submitted for inclusion in the Work
145 | by You to the Licensor shall be under the terms and conditions of
146 | this License, without any additional terms or conditions.
147 | Notwithstanding the above, nothing herein shall supersede or modify
148 | the terms of any separate license agreement you may have executed
149 | with Licensor regarding such Contributions.
150 |
151 | 6. Trademarks. This License does not grant permission to use the trade
152 | names, trademarks, service marks, or product names of the Licensor,
153 | except as required for reasonable and customary use in describing the
154 | origin of the Work and reproducing the content of the NOTICE file.
155 |
156 | 7. Disclaimer of Warranty. Unless required by applicable law or
157 | agreed to in writing, Licensor provides the Work (and each
158 | Contributor provides its Contributions) on an "AS IS" BASIS,
159 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
160 | implied, including, without limitation, any warranties or conditions
161 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
162 | PARTICULAR PURPOSE. You are solely responsible for determining the
163 | appropriateness of using or redistributing the Work and assume any
164 | risks associated with Your exercise of permissions under this License.
165 |
166 | 8. Limitation of Liability. In no event and under no legal theory,
167 | whether in tort (including negligence), contract, or otherwise,
168 | unless required by applicable law (such as deliberate and grossly
169 | negligent acts) or agreed to in writing, shall any Contributor be
170 | liable to You for damages, including any direct, indirect, special,
171 | incidental, or consequential damages of any character arising as a
172 | result of this License or out of the use or inability to use the
173 | Work (including but not limited to damages for loss of goodwill,
174 | work stoppage, computer failure or malfunction, or any and all
175 | other commercial damages or losses), even if such Contributor
176 | has been advised of the possibility of such damages.
177 |
178 | 9. Accepting Warranty or Additional Liability. While redistributing
179 | the Work or Derivative Works thereof, You may choose to offer,
180 | and charge a fee for, acceptance of support, warranty, indemnity,
181 | or other liability obligations and/or rights consistent with this
182 | License. However, in accepting such obligations, You may act only
183 | on Your own behalf and on Your sole responsibility, not on behalf
184 | of any other Contributor, and only if You agree to indemnify,
185 | defend, and hold each Contributor harmless for any liability
186 | incurred by, or claims asserted against, such Contributor by reason
187 | of your accepting any such warranty or additional liability.
188 |
189 | END OF TERMS AND CONDITIONS
190 |
191 |
--------------------------------------------------------------------------------
/src/net/micode/compass/CompassActivity.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package net.micode.compass;
18 |
19 | import android.app.Activity;
20 | import android.content.Context;
21 | import android.hardware.Sensor;
22 | import android.hardware.SensorEvent;
23 | import android.hardware.SensorEventListener;
24 | import android.hardware.SensorManager;
25 | import android.location.Criteria;
26 | import android.location.Location;
27 | import android.location.LocationListener;
28 | import android.location.LocationManager;
29 | import android.location.LocationProvider;
30 | import android.os.Bundle;
31 | import android.os.Handler;
32 | import android.text.TextUtils;
33 | import android.view.View;
34 | import android.view.ViewGroup.LayoutParams;
35 | import android.view.animation.AccelerateInterpolator;
36 | import android.widget.ImageView;
37 | import android.widget.LinearLayout;
38 | import android.widget.TextView;
39 |
40 | import java.util.Locale;
41 |
42 | public class CompassActivity extends Activity {
43 |
44 | private final float MAX_ROATE_DEGREE = 1.0f;
45 | private SensorManager mSensorManager;
46 | private Sensor mOrientationSensor;
47 | private LocationManager mLocationManager;
48 | private String mLocationProvider;
49 | private float mDirection;
50 | private float mTargetDirection;
51 | private AccelerateInterpolator mInterpolator;
52 | protected final Handler mHandler = new Handler();
53 | private boolean mStopDrawing;
54 | private boolean mChinease;
55 |
56 | View mCompassView;
57 | CompassView mPointer;
58 | TextView mLocationTextView;
59 | LinearLayout mDirectionLayout;
60 | LinearLayout mAngleLayout;
61 |
62 | protected Runnable mCompassViewUpdater = new Runnable() {
63 | @Override
64 | public void run() {
65 | if (mPointer != null && !mStopDrawing) {
66 | if (mDirection != mTargetDirection) {
67 |
68 | // calculate the short routine
69 | float to = mTargetDirection;
70 | if (to - mDirection > 180) {
71 | to -= 360;
72 | } else if (to - mDirection < -180) {
73 | to += 360;
74 | }
75 |
76 | // limit the max speed to MAX_ROTATE_DEGREE
77 | float distance = to - mDirection;
78 | if (Math.abs(distance) > MAX_ROATE_DEGREE) {
79 | distance = distance > 0 ? MAX_ROATE_DEGREE : (-1.0f * MAX_ROATE_DEGREE);
80 | }
81 |
82 | // need to slow down if the distance is short
83 | mDirection = normalizeDegree(mDirection
84 | + ((to - mDirection) * mInterpolator.getInterpolation(Math
85 | .abs(distance) > MAX_ROATE_DEGREE ? 0.4f : 0.3f)));
86 | mPointer.updateDirection(mDirection);
87 | }
88 |
89 | updateDirection();
90 |
91 | mHandler.postDelayed(mCompassViewUpdater, 20);
92 | }
93 | }
94 | };
95 |
96 | @Override
97 | protected void onCreate(Bundle savedInstanceState) {
98 | super.onCreate(savedInstanceState);
99 | setContentView(R.layout.main);
100 | initResources();
101 | initServices();
102 | }
103 |
104 | @Override
105 | protected void onResume() {
106 | super.onResume();
107 | if (mLocationProvider != null) {
108 | updateLocation(mLocationManager.getLastKnownLocation(mLocationProvider));
109 | mLocationManager.requestLocationUpdates(mLocationProvider, 2000, 10, mLocationListener);
110 | } else {
111 | mLocationTextView.setText(R.string.cannot_get_location);
112 | }
113 | if (mOrientationSensor != null) {
114 | mSensorManager.registerListener(mOrientationSensorEventListener, mOrientationSensor,
115 | SensorManager.SENSOR_DELAY_GAME);
116 | }
117 | mStopDrawing = false;
118 | mHandler.postDelayed(mCompassViewUpdater, 20);
119 | }
120 |
121 | @Override
122 | protected void onPause() {
123 | super.onPause();
124 | mStopDrawing = true;
125 | if (mOrientationSensor != null) {
126 | mSensorManager.unregisterListener(mOrientationSensorEventListener);
127 | }
128 | if (mLocationProvider != null) {
129 | mLocationManager.removeUpdates(mLocationListener);
130 | }
131 | }
132 |
133 | private void initResources() {
134 | mDirection = 0.0f;
135 | mTargetDirection = 0.0f;
136 | mInterpolator = new AccelerateInterpolator();
137 | mStopDrawing = true;
138 | mChinease = TextUtils.equals(Locale.getDefault().getLanguage(), "zh");
139 |
140 | mCompassView = findViewById(R.id.view_compass);
141 | mPointer = (CompassView) findViewById(R.id.compass_pointer);
142 | mLocationTextView = (TextView) findViewById(R.id.textview_location);
143 | mDirectionLayout = (LinearLayout) findViewById(R.id.layout_direction);
144 | mAngleLayout = (LinearLayout) findViewById(R.id.layout_angle);
145 |
146 | mPointer.setImageResource(mChinease ? R.drawable.compass_cn : R.drawable.compass);
147 | }
148 |
149 | private void initServices() {
150 | // sensor manager
151 | mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
152 | mOrientationSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
153 |
154 | // location manager
155 | mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
156 | Criteria criteria = new Criteria();
157 | criteria.setAccuracy(Criteria.ACCURACY_FINE);
158 | criteria.setAltitudeRequired(false);
159 | criteria.setBearingRequired(false);
160 | criteria.setCostAllowed(true);
161 | criteria.setPowerRequirement(Criteria.POWER_LOW);
162 | mLocationProvider = mLocationManager.getBestProvider(criteria, true);
163 |
164 | }
165 |
166 | private void updateDirection() {
167 | LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
168 |
169 | mDirectionLayout.removeAllViews();
170 | mAngleLayout.removeAllViews();
171 |
172 | ImageView east = null;
173 | ImageView west = null;
174 | ImageView south = null;
175 | ImageView north = null;
176 | float direction = normalizeDegree(mTargetDirection * -1.0f);
177 | if (direction > 22.5f && direction < 157.5f) {
178 | // east
179 | east = new ImageView(this);
180 | east.setImageResource(mChinease ? R.drawable.e_cn : R.drawable.e);
181 | east.setLayoutParams(lp);
182 | } else if (direction > 202.5f && direction < 337.5f) {
183 | // west
184 | west = new ImageView(this);
185 | west.setImageResource(mChinease ? R.drawable.w_cn : R.drawable.w);
186 | west.setLayoutParams(lp);
187 | }
188 |
189 | if (direction > 112.5f && direction < 247.5f) {
190 | // south
191 | south = new ImageView(this);
192 | south.setImageResource(mChinease ? R.drawable.s_cn : R.drawable.s);
193 | south.setLayoutParams(lp);
194 | } else if (direction < 67.5 || direction > 292.5f) {
195 | // north
196 | north = new ImageView(this);
197 | north.setImageResource(mChinease ? R.drawable.n_cn : R.drawable.n);
198 | north.setLayoutParams(lp);
199 | }
200 |
201 | if (mChinease) {
202 | // east/west should be before north/south
203 | if (east != null) {
204 | mDirectionLayout.addView(east);
205 | }
206 | if (west != null) {
207 | mDirectionLayout.addView(west);
208 | }
209 | if (south != null) {
210 | mDirectionLayout.addView(south);
211 | }
212 | if (north != null) {
213 | mDirectionLayout.addView(north);
214 | }
215 | } else {
216 | // north/south should be before east/west
217 | if (south != null) {
218 | mDirectionLayout.addView(south);
219 | }
220 | if (north != null) {
221 | mDirectionLayout.addView(north);
222 | }
223 | if (east != null) {
224 | mDirectionLayout.addView(east);
225 | }
226 | if (west != null) {
227 | mDirectionLayout.addView(west);
228 | }
229 | }
230 |
231 | int direction2 = (int) direction;
232 | boolean show = false;
233 | if (direction2 >= 100) {
234 | mAngleLayout.addView(getNumberImage(direction2 / 100));
235 | direction2 %= 100;
236 | show = true;
237 | }
238 | if (direction2 >= 10 || show) {
239 | mAngleLayout.addView(getNumberImage(direction2 / 10));
240 | direction2 %= 10;
241 | }
242 | mAngleLayout.addView(getNumberImage(direction2));
243 |
244 | ImageView degreeImageView = new ImageView(this);
245 | degreeImageView.setImageResource(R.drawable.degree);
246 | degreeImageView.setLayoutParams(lp);
247 | mAngleLayout.addView(degreeImageView);
248 | }
249 |
250 | private ImageView getNumberImage(int number) {
251 | ImageView image = new ImageView(this);
252 | LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
253 | switch (number) {
254 | case 0:
255 | image.setImageResource(R.drawable.number_0);
256 | break;
257 | case 1:
258 | image.setImageResource(R.drawable.number_1);
259 | break;
260 | case 2:
261 | image.setImageResource(R.drawable.number_2);
262 | break;
263 | case 3:
264 | image.setImageResource(R.drawable.number_3);
265 | break;
266 | case 4:
267 | image.setImageResource(R.drawable.number_4);
268 | break;
269 | case 5:
270 | image.setImageResource(R.drawable.number_5);
271 | break;
272 | case 6:
273 | image.setImageResource(R.drawable.number_6);
274 | break;
275 | case 7:
276 | image.setImageResource(R.drawable.number_7);
277 | break;
278 | case 8:
279 | image.setImageResource(R.drawable.number_8);
280 | break;
281 | case 9:
282 | image.setImageResource(R.drawable.number_9);
283 | break;
284 | }
285 | image.setLayoutParams(lp);
286 | return image;
287 | }
288 |
289 | private void updateLocation(Location location) {
290 | if (location == null) {
291 | mLocationTextView.setText(R.string.getting_location);
292 | } else {
293 | StringBuilder sb = new StringBuilder();
294 | double latitude = location.getLatitude();
295 | double longitude = location.getLongitude();
296 |
297 | if (latitude >= 0.0f) {
298 | sb.append(getString(R.string.location_north, getLocationString(latitude)));
299 | } else {
300 | sb.append(getString(R.string.location_south, getLocationString(-1.0 * latitude)));
301 | }
302 |
303 | sb.append(" ");
304 |
305 | if (longitude >= 0.0f) {
306 | sb.append(getString(R.string.location_east, getLocationString(longitude)));
307 | } else {
308 | sb.append(getString(R.string.location_west, getLocationString(-1.0 * longitude)));
309 | }
310 |
311 | mLocationTextView.setText(sb.toString());
312 | }
313 | }
314 |
315 | private String getLocationString(double input) {
316 | int du = (int) input;
317 | int fen = (((int) ((input - du) * 3600))) / 60;
318 | int miao = (((int) ((input - du) * 3600))) % 60;
319 | return String.valueOf(du) + "°" + String.valueOf(fen) + "'" + String.valueOf(miao) + "\"";
320 | }
321 |
322 | private SensorEventListener mOrientationSensorEventListener = new SensorEventListener() {
323 |
324 | @Override
325 | public void onSensorChanged(SensorEvent event) {
326 | float direction = event.values[0] * -1.0f;
327 | mTargetDirection = normalizeDegree(direction);
328 | }
329 |
330 | @Override
331 | public void onAccuracyChanged(Sensor sensor, int accuracy) {
332 | }
333 | };
334 |
335 | private float normalizeDegree(float degree) {
336 | return (degree + 720) % 360;
337 | }
338 |
339 | LocationListener mLocationListener = new LocationListener() {
340 |
341 | @Override
342 | public void onStatusChanged(String provider, int status, Bundle extras) {
343 | if (status != LocationProvider.OUT_OF_SERVICE) {
344 | updateLocation(mLocationManager.getLastKnownLocation(mLocationProvider));
345 | } else {
346 | mLocationTextView.setText(R.string.cannot_get_location);
347 | }
348 | }
349 |
350 | @Override
351 | public void onProviderEnabled(String provider) {
352 | }
353 |
354 | @Override
355 | public void onProviderDisabled(String provider) {
356 | }
357 |
358 | @Override
359 | public void onLocationChanged(Location location) {
360 | updateLocation(location);
361 | }
362 |
363 | };
364 | }
365 |
--------------------------------------------------------------------------------