Android
 Computer >> コンピューター >  >> プログラミング >> Android

【Android開発】スマホを振って画面を更新するシェイク機能の実装方法

この記事では、Androidアプリに「端末を振って更新する」シェイク機能を追加する方法を解説します。加速度センサー(TYPE_ACCELEROMETER)を使って端末の揺れを検出し、画面の再読み込みなど任意の処理を実行させる仕組みを、ステップごとに見ていきましょう。

実装手順

ステップ1:新規プロジェクトの作成

Android Studioで新しいプロジェクトを作成します。メニューから「File」→「New Project」を選択し、必要な項目を入力してプロジェクトを作成してください。

ステップ2:レイアウトファイル(activity_main.xml)の編集

res/layout/activity_main.xml に以下のコードを記述します。ここでは、シェイク操作を促すテキストのみのシンプルなレイアウトを用意しました。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp"
    android:orientation="vertical" >
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="24sp"
        android:textStyle="bold"
        android:text="Shake your phone to detect shake Feature...."/>
</LinearLayout>

ステップ3:MainActivity.java の実装

src/MainActivity.java に以下のコードを追加します。SensorManagerで加速度センサーを監視し、一定以上の揺れを検知したらトーストを表示します。

import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.widget.Toast;
import java.util.Objects;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
    private SensorManager sensorManager;
    private float mAccel;
    private float mAccelCurrent;
    private float mAccelLast;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        Objects.requireNonNull(sensorManager).registerListener(mSensorListener, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
        mAccel = 10f;
        mAccelCurrent = SensorManager.GRAVITY_EARTH;
        mAccelLast = SensorManager.GRAVITY_EARTH;
    }
    private final SensorEventListener mSensorListener = new SensorEventListener() {
        public void onSensorChanged(SensorEvent se) {
            float x = se.values[0];
            float y = se.values[1];
            float z = se.values[2];
            mAccelLast = mAccelCurrent;
            mAccelCurrent = (float) Math.sqrt((double) (x * x + y * y + z * z));
            float delta = mAccelCurrent - mAccelLast;
            mAccel = mAccel * 0.9f + delta;
            if (mAccel > 12) {
                Toast toast = Toast.makeText(getApplicationContext(), "Shake feature detected..", Toast.LENGTH_LONG);
                toast.show();
            }
        }
        public void onAccuracyChanged(Sensor sensor, int accuracy) {
        }
    };
    @Override
    protected void onResume() {
        super.onResume();
        sensorManager.registerListener(mSensorListener, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
    }
    @Override
    protected void onPause() {
        sensorManager.unregisterListener(mSensorListener);
        super.onPause();
    }
}

ポイントは onSensorChanged() 内の処理です。X・Y・Z 各軸の加速度から合成加速度を算出し、前回値との差分(delta)を係数0.9で平滑化することで、小さな揺れによる誤検知を抑えながらシェイクを判定しています。検知の閾値は「12」に設定されていますが、端末や用途に応じて調整すると良いでしょう。また、onPause() でリスナーを解除することで、アプリがバックグラウンド中の無駄なバッテリー消費を防げます。

ステップ4:AndroidManifest.xml の確認

androidManifest.xml に以下のコードを記述します。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
    package="app.com.sample">
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

アプリの実行と動作確認

それではアプリを実行してみましょう。実機のAndroidスマートフォンをPCに接続しているものとして説明します。Android Studioから実行するには、プロジェクト内のアクティビティファイルを開き、ツールバーのRun(【Android開発】スマホを振って画面を更新するシェイク機能の実装方法)アイコンをクリックします。デバイス選択画面でお使いのスマートフォンを選択すると、端末に初期画面が表示されます。

【Android開発】スマホを振って画面を更新するシェイク機能の実装方法

アプリを起動したら、実際にスマートフォンを振ってみてください。揺れが検知されると「Shake feature detected..」というトーストが表示されます。このタイミングで画面の再読み込み処理などを呼び出せば、「振って更新」機能の完成です。

センサーの感度は端末によって差があるため、ぜひお手持ちのデバイスでテストし、最適な閾値を見つけてみてください!

  1. 【Android】プログラムでアプリケーションを終了する方法|finish()とSystem.exit(0)の使い方

    はじめにこの記事では、Androidアプリをプログラム(コード)から終了させる方法を解説します。ボタンをタップするとアプリが終了するシンプルなサンプルアプリを通じて、実装手順をステップごとに見ていきましょう。ステップ1:新規プロジェクトの作成Android Studioを起動し、「File」→「New Project」を選択します。必要な項目をすべて入力して、新しいプロジェクトを作成してください。ステップ2:レイアウトファイルの編集res/layout/activity_main.xml に以下のコードを追加します。このレイアウトには、ガイダンス用のTextViewと、アプリを終了するためのB

  2. Android版Chromeで「Pull-to-Refresh(引っ張って更新)」機能を無効にする方法

    AndroidのGoogle Chromeでは、Webページを下に強く引っ張ると自動的に再読み込みされる「プル・トゥ・リフレッシュ(Pull-to-Refresh)」機能が標準で搭載されています。この機能はページを素早く更新したいときに便利ですが、一方で入力途中のフォーム情報が誤って消えてしまうという大きなデメリットもあります。 幸い、GoogleはChromeのフラグメニューからこの機能を無効にする方法を用意しています。無効化すれば、ページを下に引きすぎても再読み込みされなくなります。 なお、Chromeフラグにはまだテスト段階にある実験的な機能が多数収録されています。これらは安定版には正式