Сегодня я собираюсь поделиться рабочим кодом, чтобы сделать очень простое приложение для компаса для вашего устройства Android.
Некоторые устройства Android (например, Huawei Y300 и Lenovo P700i) не имеют полной поддержки датчиков движения, поэтому для них этот код работать не будет.
Видео демо
Наш код на сегодня будет работать так:
Необходимые файлы
Вам нужно создать свой собственный образ компаса. Для этого примера я использую фотографию. Ваше изображение должно быть в формате PNG с прозрачным фоном, не используйте этот jpg файл, который я использовал.
Давайте код
Вот наш MainActivity.java
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
|
package com.example.compassapp; import android.app.Activity; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.os.Bundle; import android.view.animation.Animation; import android.view.animation.RotateAnimation; import android.widget.ImageView; import android.widget.TextView; public class MainActivity extends Activity implements SensorEventListener { // define the display assembly compass picture private ImageView image; // record the compass picture angle turned private float currentDegree = 0f; // device sensor manager private SensorManager mSensorManager; TextView tvHeading; @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); // image = (ImageView) findViewById(R.id.main_iv); // TextView that will tell the user what degree is he heading tvHeading = (TextView) findViewById(R.id.tvHeading); // initialize your android device sensor capabilities mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); } @Override protected void onResume() { super .onResume(); // for the system's orientation sensor registered listeners mSensorManager.registerListener( this , mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION), SensorManager.SENSOR_DELAY_GAME); } @Override protected void onPause() { super .onPause(); // to stop the listener and save battery mSensorManager.unregisterListener( this ); } @Override public void onSensorChanged(SensorEvent event) { // get the angle around the z-axis rotated float degree = Math.round(event.values[ 0 ]); tvHeading.setText( "Heading: " + Float.toString(degree) + " degrees" ); // create a rotation animation (reverse turn degree degrees) RotateAnimation ra = new RotateAnimation( currentDegree, -degree, Animation.RELATIVE_TO_SELF, 0 .5f, Animation.RELATIVE_TO_SELF, 0 .5f); // how long the animation will take place ra.setDuration( 210 ); // set the animation after the end of the reservation status ra.setFillAfter( true ); // Start the animation image.startAnimation(ra); currentDegree = -degree; } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { // not in use } } |
Наш файл макета Activity_main.xml
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
<RelativeLayout xmlns:android= "http://schemas.android.com/apk/res/android" android:layout_width= "match_parent" android:layout_height= "match_parent" android:background= "#fff" > <TextView android:id= "@+id/tvHeading" android:layout_width= "wrap_content" android:layout_height= "wrap_content" android:layout_centerHorizontal= "true" android:layout_marginBottom= "40dp" android:layout_marginTop= "20dp" android:text= "Heading: 0.0" /> <ImageView android:id= "@+id/imageViewCompass" android:layout_width= "wrap_content" android:layout_height= "wrap_content" android:layout_below= "@+id/tvHeading" android:layout_centerHorizontal= "true" android:src= "@drawable/img_compass" /> </RelativeLayout> |
Скачать исходный код
Вы можете скачать этот пример проекта здесь: CompassApp.zip
Некоторые заметки
Ориентация моего приложения заблокирована в портретном режиме. В файле манифеста нет специальных разрешений.