初心者でもAndroidアプリ開発を1から学習できる1日集中入門セミナー。

STEP4.スワイプ画面を表示してみよう

概要

スワイプ画面を新しく作成し、シェイク画面の表示時に端末を一定回数以上振ったときスワイプ画面へ遷移するようにする。

目次

このステップのポイント

  • Androidのバイブレーションを理解する
  • インテントを使った画面遷移方法を復習する
  • Androidで使用できるサービスを理解する

新しいファイルを作成する

まずは、スワイプ画面を作成するために必要なファイルを新しく作成しましょう。
新規ファイルを作成する方法はSTEP3と 同様の方法でおこなっていきます。
Customize the Activityという画面を表示し、項目の中から一番上のActivity Nameを以下の内容を設定します。

項目 設定内容 備考
Activity Name SwipeActivity アクティビティファイル名を設定する項目。記述ミスがないように注意!
Layout Name activity_swipe 画面レイアウトファイル名を設定する項目。
アクティビティファイル名に応じたファイル名に自動で変わります。
Make-SwipeActivity

設定が完了したら、「終了(F)」をクリックします。

プロジェクトを確認し、新しくSwipeActivityactivity_swipe.xmlがあることを 確認してください。

Make-SwipeActivity-result

スワイプ画面の画面レイアウトを修正する

スワイプ画面のファイルを新しく作成したら、先ほど作成したactivity_swipe.xmlを編集します。activity_swipe.xmlを開いてください。
最初に、テキストビューが1つ配置されていますので、Deleteキーを押してテキストビューを削除します。
今回作成するスワイプ画面は画面の背景のみを設定します。RelativeLayoutの属性を以下の表にしたがって変更してみましょう。

項目 設定内容 備考
background @drawable/background_swipe レイアウトの背景画像を設定します。

設定をおこない、編集画面が以下のような表示になれば完了です。

add-background-of-layout-swipe

バイブレーションを有効にする

シェイク画面のアクティビティを修正する前に、まずはアプリケーション内でバイブレーションを使用できるようにします。
バイブレーションを有効にするにはAndroidManifest.xmlファイル内に1行記述を追加する必要があります。 AndroidManifest.xmlは「manifests」フォルダの中に格納されています。まずはファイルを開いてください。

step5-androidmanifest1

以下のようなウインドウが表示されます。
AndroidManifest.xmlはファイルはアプリケーション自体の全体的な設定をおこなうファイルで、例えばバイブレーションやインターネット接続の許可設定や、使用するアクティビティの設定などをおこないます。

step5-androidmanifest2

ソースコードを修正する

AndroidManifest.xmlに以下のソースコードを貼り付けます。

[修正] AndroidManifest.xml

[フォルダ] manifests

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.school.it.kanda.kandaomikuji" >

    <uses-permission android:name="android.permission.VIBRATE" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".StartActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".ShakeActivity"
            android:label="@string/title_activity_shake" >
        </activity>
        <activity
            android:name=".SwipeActivity"
            android:label="@string/title_activity_swipe" >
        </activity>
    </application>

</manifest>

新しく追加された記述は5行目になります。
uses-permissionという記述を使用し、バイブレーションの利用を許可する設定になります。
この記述がないと、バイブレーションの処理をおこなう際にアプリケーションが落ちてしまいますのでご注意ください。

シェイク画面のアクティビティを修正する

バイブレーションの設定が完了したら、シェイク画面のアクティビティを修正しましょう。
今回は端末を一定回数振ったら、インテントを使ってスワイプ画面に遷移できるようにします。

ソースコードを修正する

ShakeActivityの記述を一旦全て削除し、以下のソースコードをコピー&ペーストで貼り付けます。

[修正] ShakeActivity

[フォルダ] java/com.school.it.kanda.kandaomikuji

package com.school.it.kanda.kandaomikuji;

import android.content.Intent;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Vibrator;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import java.util.List;


public class ShakeActivity extends AppCompatActivity implements SensorEventListener {

    private static final int LOWEST_SPEED = 3000;  //1カウントに必要な端末の最低速度
    private static final int SHAKE_TIMEOUT = 1000;    //端末が最低速度で振られるまでの時間
    private static final int SHAKE_COUNT = 15; //端末が振るのに必要なカウント数
    private int shakeCount = 0;  //端末が振られたカウント数
    private long lastTimeDetectAcceleration = 0;    //一番最後に端末が最低速度以上の速度で振られた時間
    private float xDimen = 0;  //端末が一番最後に振られたときのX座標の位置
    private float yDimen = 0;  //端末が一番最後に振られたときのY座標の位置
    private float zDimen = 0;  //端末が一番最後に振られたときのZ座標の位置
    private SensorManager manager;
    private Vibrator vibrator;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_shake);

        //センサーサービスを利用する
        manager = (SensorManager)getSystemService(SENSOR_SERVICE);

        //バイブレーションのサービスを利用する
        vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);

    }

    @Override
    protected void onResume() {
        super.onResume();

        //加速度センサーの値を取得する
        List<Sensor> sensors = manager.getSensorList(Sensor.TYPE_ACCELEROMETER);

        if(sensors.size() > 0) {
            Sensor s = sensors.get(0);
            //リスナーの登録
            manager.registerListener(this, s, SensorManager.SENSOR_DELAY_UI);
        }
    }


    @Override
    protected void onPause(){
        super.onPause();

        //イベントリスナーの登録解除
        if(manager != null){
            manager.unregisterListener(this);
        }
    }

    /*
     * 端末が動いたときに呼び出される処理
     *  @param event : 端末の座標
     *  @return なし
     */
    @Override
    public void onSensorChanged(SensorEvent event) {

        // 現在の時間をチェック
        long now = System.currentTimeMillis();

        // 現在の時間と最後に加速度を検知した時間の差を計算する
        long diffTime = now - lastTimeDetectAcceleration;

        // 一定時間を越えていたとき
        if(diffTime > SHAKE_TIMEOUT){

            //カウントをリセットする
            shakeCount = 0;
        }

        //端末の座標位置を取得する
        float x = event.values[0];  //x座標
        float y = event.values[1];  //y座標
        float z = event.values[2];  //z座標

        //振られている端末の縦の速度を取得
        float speed = Math.abs(x + y + z - xDimen - yDimen - zDimen) / diffTime * 10000;

        //端末が動いた速度が一定速度よりも速い場合
        if(speed > LOWEST_SPEED){

            //バイブレーションを振動
            vibrator.vibrate(40);

            //カウントを1回増やす
            ++shakeCount;

            //端末のカウントが一定回数を超えた場合
            if(shakeCount >= SHAKE_COUNT){

                //バイブレーションを振動
                vibrator.vibrate(1000);

                //SwipeActivityに遷移するように設定
                Intent intent = new Intent(getApplicationContext(),SwipeActivity.class);

                //インテントの開始
                startActivity(intent);

                //ShakeActivityの終了
                finish();
            }

        }

        //一番最後に端末が振られたときの時間と位置をセット
        lastTimeDetectAcceleration = now;
        xDimen = x;
        yDimen = y;
        zDimen = z;
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {

    }
}

ここでは、端末を一定間隔で上下に振った時にスワイプ画面へ遷移するような処理を記述しています。
端末が振られたかどうかを認識するために、Android端末内に備わっている、端末の位置情報を検出できる機能を利用しています。
それを用いて端末の座標を検出し、端末が縦に一定間隔以上の距離が動いたときに、振った回数を1つずつカウントしています
また振った時間の間隔についてもチェックし、一点間隔以上時間が空くとカウントはリセットされます。
一定間隔以上の時間を空けずに、振ったカウントが一定回以上(15回以上)振られると、次の画面に遷移できるような処理を記述しています。

端末上で確認する

ソースコードの確認ができたら、一度実機上で実行してみましょう。
正しく画面遷移できていれば完了です。

step5-result
PAGETOP
Copyright © 2015 FusionOne Co.,Ltd. All rights reserved.