Ací es mostren les diferències entre la revisió seleccionada i la versió actual de la pàgina.
Ambdós costats versió prèvia Revisió prèvia Següent revisió | Revisió prèvia | ||
android_sensors [2024/01/26 15:19] enric_mieza_sanchez [Exemple] |
android_sensors [2025/01/13 18:28] (actual) enric_mieza_sanchez [Exercici] |
||
---|---|---|---|
Línia 1: | Línia 1: | ||
====== Sensors de moviment d' | ====== Sensors de moviment d' | ||
+ | |||
+ | {{ : | ||
Referències: | Referències: | ||
- | * [[https:// | + | * [[https:// |
* [[https:// | * [[https:// | ||
+ | * [[Kotlin]] en aquesta wiki. | ||
+ | |||
+ | {{tag> #Dam #DamMp08 #DamMp08Uf2 # | ||
\\ | \\ | ||
- | ===== Exemple ===== | + | ===== Sensors ===== |
+ | Quan parlem de " | ||
+ | |||
+ | També son sensors (però no de moviment) la càmera, el micro, la pantalla tàctil i el GPS. | ||
+ | |||
+ | Si mirem la documentació oficial podrem veure que la llibreria Android disposa dels següents deteccions: | ||
+ | * Sensor.TYPE_GRAVITY | ||
+ | * Sensor.TYPE_LINEAR_ACCELERATION | ||
+ | * Sensor.TYPE_ROTATION_VECTOR | ||
+ | * Sensor.TYPE_SIGNIFICANT_MOTION | ||
+ | * Sensor.TYPE_STEP_COUNTER | ||
+ | * Sensor.TYPE_STEP_DETECTOR | ||
+ | * Sensor.TYPE_ACCELEROMETER | ||
+ | * Sensor.TYPE_GYROSCOPE | ||
+ | |||
+ | Els dos darrers son les dades "en cru" tal i com arriben dels sensors. Els altres son mecanismes de la llibreria per facilitar-nos la programació. | ||
+ | |||
+ | ===== Exemple | ||
+ | |||
+ | <tabbox Versió Kotlin> | ||
+ | |||
+ | En aquesta versió apareix la clàssica herència de '' | ||
+ | |||
+ | <file kotlin MainActivity.kt> | ||
+ | class MainActivity : AppCompatActivity(), | ||
+ | |||
+ | private lateinit var sensorManager: | ||
+ | private lateinit var accelerometre: | ||
+ | private lateinit var binding: ActivityMainBinding | ||
+ | |||
+ | override fun onCreate(savedInstanceState: | ||
+ | super.onCreate(savedInstanceState) | ||
+ | enableEdgeToEdge() | ||
+ | |||
+ | // Utilitzem bindings per facilitar accés als elements gràfics | ||
+ | // recorda activar-los a build.gradle.kts afegint: | ||
+ | // viewBinding { enable = true } | ||
+ | binding = ActivityMainBinding.inflate(layoutInflater) | ||
+ | setContentView(binding.root) | ||
+ | |||
+ | // escoltar variacions dels sensors | ||
+ | sensorManager = getSystemService( | ||
+ | Context.SENSOR_SERVICE) as SensorManager | ||
+ | accelerometre = sensorManager.getDefaultSensor( | ||
+ | Sensor.TYPE_ACCELEROMETER) as Sensor | ||
+ | sensorManager.registerListener(this, | ||
+ | SensorManager.SENSOR_DELAY_NORMAL) | ||
+ | } | ||
+ | |||
+ | override fun onSensorChanged(event: | ||
+ | // emprem les dades del sensor | ||
+ | val x = event.values[0] | ||
+ | val y = event.values[1] | ||
+ | val z = event.values[2] | ||
+ | // 1g = 9,8 m/s² , què és un valor força alt. | ||
+ | // Al fer *10 ens acostem als 100, que és el valor màxim per defecte de la ProgressBar | ||
+ | binding.xProgressBar.progress | ||
+ | binding.yProgressBar.progress | ||
+ | binding.zProgressBar.progress | ||
+ | } | ||
+ | |||
+ | override fun onAccuracyChanged(sensor: | ||
+ | // TODO(" | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | <tabbox Versió Java> | ||
+ | |||
+ | Versió amb objecte '' | ||
<file java MainActivity.java> | <file java MainActivity.java> | ||
Línia 14: | Línia 88: | ||
private SensorManager sensorManager; | private SensorManager sensorManager; | ||
private Sensor sensor; | private Sensor sensor; | ||
+ | SensorEventListener sensorListener; | ||
@Override protected void onCreate(Bundle savedInstanceState) { | @Override protected void onCreate(Bundle savedInstanceState) { | ||
Línia 19: | Línia 94: | ||
setContentView(R.layout.activity_main); | setContentView(R.layout.activity_main); | ||
- | | + | |
@Override | @Override | ||
public void onSensorChanged(SensorEvent sensorEvent) { | public void onSensorChanged(SensorEvent sensorEvent) { | ||
- | // Processa els valor de l' | + | // Valors |
- | | + | |
+ | float yAcc = sensorEvent.values[1]; | ||
+ | float zAcc = sensorEvent.values[2]; | ||
| | ||
+ | // Processament o visualització de dades... | ||
} | } | ||
@Override | @Override | ||
public void onAccuracyChanged(Sensor sensor, int i) { | public void onAccuracyChanged(Sensor sensor, int i) { | ||
- | // Podem ignorar aquesta CB de moment | + | // Es pot ignorar aquesta CB de moment |
} | } | ||
}; | }; | ||
Línia 39: | Línia 117: | ||
// registrem el Listener per capturar els events del sensor | // registrem el Listener per capturar els events del sensor | ||
if( sensor!=null ) { | if( sensor!=null ) { | ||
- | sensorManager.registerListener(mSensorListener,sensor, | + | sensorManager.registerListener(sensorListener,sensor, |
SensorManager.SENSOR_DELAY_NORMAL); | SensorManager.SENSOR_DELAY_NORMAL); | ||
} | } | ||
Línia 45: | Línia 123: | ||
} | } | ||
</ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | \\ | ||
+ | |||
+ | ===== Exercici ===== | ||
<WRAP todo> | <WRAP todo> | ||
- | Implementa una app que visualitzi els valors de l' | + | Implementa una app que visualitzi els valors de l' |
+ | |||
+ | Llença l'app al teu dispositiu mòbil. | ||
+ | |||
+ | Com has de col·locar el mòbil per aconseguir aquests valors (aproximats)?: | ||
+ | |||
+ | {{: | ||
+ | {{: | ||
+ | {{: | ||
+ | |||
+ | Substitueix els '' | ||
Compara amb el resultat de '' | Compara amb el resultat de '' | ||
- | Intenta implementar | + | </ |
+ | |||
+ | <WRAP todo> | ||
+ | **Double " | ||
+ | |||
+ | Normalment parlem de //tap// o //double tap// per a interaccions de " | ||
+ | |||
+ | Implementarem | ||
+ | |||
+ | Una primera aproximació podria ser **implementar un comptador de //thuds// en cadascun dels eixos XYZ**. Hauràs d' | ||
+ | |||
+ | Assegura que al canviar la orientació (portrait/ | ||
</ | </ | ||