Статьи

Пример Android Compass Code

Сегодня я собираюсь поделиться рабочим кодом, чтобы сделать очень простое приложение для компаса для вашего устройства Android.

Некоторые устройства Android (например, Huawei Y300 и Lenovo P700i) не имеют полной поддержки датчиков движения, поэтому для них этот код работать не будет.

Видео демо

Наш код на сегодня будет работать так:

Необходимые файлы

Вам нужно создать свой собственный образ компаса. Для этого примера я использую фотографию. Ваше изображение должно быть в формате PNG с прозрачным фоном, не используйте этот jpg файл, который я использовал.

img_compass

Давайте код

Вот наш 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

Некоторые заметки

Ориентация моего приложения заблокирована в портретном режиме. В файле манифеста нет специальных разрешений.

Дальнейшие чтения

Ссылка: пример Android Compass Code от нашего партнера JCG Майка Далисая в блоге «Код ниндзя» .