рд╣реЗрдмрд░ рдкрд░ рдЕрдкрдиреА рдкрд╣рд▓реА рдкреЛрд╕реНрдЯ рдореЗрдВ, рдореИрдВ рдПрдВрдбреНрд░реЙрдЗрдб рдУрдПрд╕ рдореЗрдВ рд╕реЗрдВрд╕рд░ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рддреАрдиреЛрдВ рд╡рд┐рдорд╛рдиреЛрдВ рдореЗрдВ рдЖрдкрдХреЗ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рдЭреБрдХрд╛рд╡ рдХрд╛ рдХреЛрдгред рд░реБрдЪрд┐ рдХреГрдкрдпрд╛ рдмрд┐рд▓реНрд▓реА рдХреЗ рдиреАрдЪреЗред
Android OS рд╕реЗрдВрд╕рд░ рддреАрди рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдореЗрдВ рдЖрддреЗ рд╣реИрдВ: рдЧрддрд┐, рд╕реНрдерд┐рддрд┐ рдФрд░ рд╡рд╛рддрд╛рд╡рд░рдгред рдпреЗ рд╕реЗрдВрд╕рд░ рдмрд╣реБрдд рдЕрд▓рдЧ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:
- accelerometer
- рдЬрд╛рдЗрд░реЛрд╕реНрдХреЛрдк
- рдкреНрд░рдХрд╛рд╢ рд╕рдВрд╡реЗрджрдХ
- рдЪреБрдВрдмрдХреАрдп рдХреНрд╖реЗрддреНрд░ рд╕реЗрдВрд╕рд░
- accelerometer
- рдмреИрд░реЛрдореАрдЯрд░
- рдлреЛрди рдХреЛ рд╕рд┐рд░ рдкрд░ рдкрдХрдбрд╝реЗ рд╕реЗрдВрд╕рд░
- рдбрд┐рд╡рд╛рдЗрд╕ рддрд╛рдкрдорд╛рди рд╕реЗрдВрд╕рд░
- рдкрд░рд┐рд╡реЗрд╢ рдХрд╛ рддрд╛рдкрдорд╛рди рд╕рдВрд╡реЗрджрдХ рд╡рд╛рддрд╛рд╡рд░рдг
- рд╕рд╛рдкреЗрдХреНрд╖ рдЖрд░реНрджреНрд░рддрд╛ рдореАрдЯрд░
- рдЖрджрд┐
рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдЙрдирдХрд╛ рд╕реЗрдЯ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ "рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди" рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕реЗ рд╕реЗрдВрд╕рд░ рд╣реИрдВ рдЬреЛ рдЕрдзрд┐рдХрд╛рдВрд╢ рдПрдВрдбреНрд░реЙрдЗрдб рд╕реНрдорд╛рд░реНрдЯрдлреЛрди рдореЗрдВ рдореМрдЬреВрдж рд╣реИрдВ - рдПрдХ рдПрдХреНрд╕реЗрд▓реЗрд░реЛрдореАрдЯрд░ рдФрд░ рдПрдХ рдорд╛рдЗрдХреНрд░реЛрд╕реНрдХреЛрдкред
рдЗрди рд╕реЗрдВрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рдлреЛрди рдХреА рд╕реНрдерд┐рддрд┐ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреН, рддреАрдиреЛрдВ рд╡рд┐рдорд╛рдиреЛрдВ (рдПрдХреНрд╕рд╡рд╛рдИ, рд╡рд╛рдИрдЬреЗрдб, рдЬреЗрдбрдПрдХреНрд╕) рдореЗрдВ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рдЭреБрдХрд╛рд╡ рдХреЛрдгред рдпрд╣ рд╣рдо рдХреНрдпрд╛ рдХрд░реЗрдВрдЧреЗ!
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рдирдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ рдФрд░ рд╕реЗрдВрд╕рд░ рд░реАрдбрд┐рдВрдЧ рдФрд░ рдЙрдирд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреАрди рд╢рд┐рд▓рд╛рд▓реЗрдЦреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рд▓ рдкреНрд░рджрд░реНрд╢рди рдкрд░ рд░рдЦреЗрдВред рдореБрдЭреЗ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдорд┐рд▓рд╛:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <LinearLayout android:id="@+id/linearLayout1" android:layout_width="fill_parent" android:layout_height="wrap_content" > <TextView android:id="@+id/textView1" android:layout_width="60dp" android:layout_height="wrap_content" android:layout_weight="1" android:textSize="25dp" android:text=" XY" /> <TextView android:id="@+id/xyValue" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:textSize="25dp" android:text="0" /> </LinearLayout> <LinearLayout android:id="@+id/linearLayout2" android:layout_width="fill_parent" android:layout_height="wrap_content" > <TextView android:id="@+id/textView3" android:layout_width="60dp" android:layout_height="wrap_content" android:layout_weight="1" android:textSize="25dp" android:text=" XZ" /> /> <TextView android:id="@+id/xzValue" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:textSize="25dp" android:text="0" /> </LinearLayout> <LinearLayout android:id="@+id/linearLayout3" android:layout_width="fill_parent" android:layout_height="wrap_content" > <TextView android:id="@+id/textView5" android:layout_width="60dp" android:layout_height="wrap_content" android:layout_weight="1" android:textSize="25dp" android:text=" ZY" /> <TextView android:id="@+id/zyValue" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:textSize="25dp" android:text="0" /> </LinearLayout> </LinearLayout>
рдореБрдЦреНрдп рдЧрддрд┐рд╡рд┐рдзрд┐ рдореЗрдВ, рд╣рдо рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╡рд░реНрдЧ рдШреЛрд╖рдгрд╛ рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
public class Main extends Activity implements SensorEventListener {
SensorEventListener рд╡рд░реНрдЧ рд╣рдореЗрдВ рд╕реЗрдВрд╕рд░ рдкрд░ рдШрдЯрдирд╛рдУрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред
рдЖрдкрдХреЗ рдкрд╛рд╕ рдЪрд╛рд░ рдЖрд╡рд╢реНрдпрдХ рддрд░реАрдХреЗ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП:
@Override public void onAccuracyChanged(Sensor sensor, int accuracy) {
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╢рд╛рдпрдж рдкрд╣рд▓реЗ рд╣реА рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рдЪреБрдХреЗ рд╣реИрдВ, рд╣рдо рдЬрд▓реНрдж рд╣реА рдмрд╛рдж рдХреЗ рддрд░реАрдХреЗ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд▓реЗрдВрдЧреЗред рдЗрд╕ рдмреАрдЪ, рдЙрди рдЪрд░реЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░реЗрдВ рдЬрд┐рдирдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
private SensorManager mSensorManager; private Sensor mOrientation; private float xy_angle; private float xz_angle; private float zy_angle; private TextView xyView; private TextView xzView; private TextView zyView;
рдкрд╣рд▓рд╛ рд╡реЗрд░рд┐рдПрдмрд▓ рдбрд┐рд╡рд╛рдЗрд╕ рд╕реЗрдВрд╕рд░ рдореИрдиреЗрдЬрд░ рд╣реИред рдпрд╣ рд╡рд╣ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдЙрд╕ рд╕рдВрд╡реЗрджрдХ рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдСрдирдХреНрд░рд┐рдПрдЯ рдЗрд╡реЗрдВрдЯ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдмрдирд╛рдПрдВ:
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
рдЦреИрд░, рд▓рдЧрднрдЧ рдХрд┐рдпрд╛! рдпрд╣ рдХреЗрд╡рд▓ рдкрд╛рда рдлрд╝реАрд▓реНрдб рдореЗрдВ рдорд╛рди рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред OnSensorChanged рдЗрд╡реЗрдВрдЯ рдХреЛ рдпрд╛рдж рдХрд░реЗрдВред рдпрджрд┐ рдЖрдкрдХреЛ рдпрд╛рдж рд╣реИ, SensorEvent рдЗрд╡реЗрдВрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдЗрд╕реЗ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рдбрд┐рдЧреНрд░реА рдореЗрдВ рдЭреБрдХрд╛рд╡ рдХреЗ рдХреЛрдг рдХреЗ рдореВрд▓реНрдп рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЕрдВрддрд┐рдо рд╕реНрдкрд░реНрд╢ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдШрдЯрдирд╛ рдХреЛ рд░реВрдк рдореЗрдВ рд▓рд╛рддреЗ рд╣реИрдВ:
public void onSensorChanged(SensorEvent event) { xy_angle = event.values[0];
рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рд╣реИ! рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЖрдк рдПрдХ рдЖрднрд╛рд╕реА рд╕реНрдорд╛рд░реНрдЯрдлреЛрди рдЪрд╛рд▓реВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдЗрд╕рд▓рд┐рдП, рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрдкрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рд╣рдо рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдЕрдкрдирд╛ рд╕реНрдорд╛рд░реНрдЯрдлреЛрди рдЪрд╛рд▓реВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВред
рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдореИрдВ рдЙрджрд╛рд╣рд░рдг рдХреЗ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ
apk рдкреЛрд╕реНрдЯ рдХрд░рддрд╛ рд╣реВрдВред
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдкреЛрд╕реНрдЯ рдЖрдкрдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рдФрд░ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рдереА!
UPD: рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рдХрд▓рд╛, рдЖрдк
рдПрдореБрд▓реЗрдЯрд░ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓рд┐рдВрдХ рдХреЗ рд▓рд┐рдП
рдмреНрд▓реИрдХрд╕реНрдЯреНрд░реАрдо рдХреЛ рдзрдиреНрдпрд╡рд╛рдж!