Android Studio入門

Android Studio 入門【 画面分割③ 】~下揃え~

Android-【画面分割】 下揃え 768

画面下部にキャラクター(画像)を並べるレイアウトです。
もちろん、アイコンやメニューを並べることも可能です。

この動画はシリーズ物です。以下の順にご覧ください。

  1. 【 画面分割① 】~均等分割~
  2. 【 画面分割② 】~比率で配置~
  3. 【 画面分割③ 】~下揃え~
  4. 【 画面分割④ 】~複数レイアウト~

画面が縦でも横でもそれなりに見える作りを目指しました。

Android レイアウト 縦横画面対応

レイアウトと画像の順番、配置にご注意してください。

Android Studio デザインタブ

画面下部に画像を配置します。
横画面、縦画面でも比率を守って表示されると思います。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.test.rpggame.MainActivity">

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="centerCrop"
        android:src="@drawable/back" />

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <ImageView
            android:scaleType="fitEnd"
            android:layout_weight="1"
            android:src="@drawable/p0"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
             />

        <ImageView
            android:scaleType="fitEnd"
            android:layout_weight="1"
            android:src="@drawable/p1"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
        <ImageView
            android:scaleType="fitEnd"
            android:layout_weight="1"
            android:src="@drawable/p2"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
        <ImageView
            android:scaleType="fitEnd"
            android:layout_weight="1"
            android:src="@drawable/p3"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </LinearLayout>


</RelativeLayout>

Android レイアウト【XML解説】

Android Studio入門

Android Studio 入門【 画面分割② 】~比率で配置~

Android-【画面分割】比率で配置-768

画像の幅や高さを比率で配置ます。
具体的には「画面の3割」や「2対1」などで配置できます。

この動画はシリーズ物です。以下の順にご覧ください。

  1. 【 画面分割① 】~均等分割~
  2. 【 画面分割② 】~比率で配置~
  3. 【 画面分割③ 】~下揃え~
  4. 【 画面分割④ 】~複数レイアウト~

前回の【 画面分割① 】~均等分割~ とほぼ同じですが、以下を変更しています。


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.test.rpggame.MainActivity">

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="centerCrop"
        android:src="@drawable/back" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <ImageView
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="2"
            android:src="@drawable/m0" />

        <ImageView
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:src="@drawable/p0" />
    </LinearLayout>

</RelativeLayout>

アンドロイド XML図解2

Android Studio入門

Android Studio 入門【 画面分割① 】~均等分割~

Android-【画面分割】均等分割-768

画像を均等に並べる方法です。
縦画面でも横画面でも対応できます。

この動画はシリーズ物です。以下の順にご覧ください。

  1. 【 画面分割① 】~均等分割~
  2. 【 画面分割② 】~比率で配置~
  3. 【 画面分割③ 】~下揃え~
  4. 【 画面分割④ 】~複数レイアウト~

画面が縦でも横でもそれなりに見える作りを目指します。

Nexus4 Nexus5 Nexus9 比較

RPG画面 使用素材 モンスター
m0:モンスター
RPG画面 使用素材 プレーヤー
p0:プレーヤー
RPG画面 使用素材 ヒロイン
p1:ヒロイン
RPG画面 使用素材 武器屋
p2:武器屋
RPG画面 使用素材 雑貨屋
p3:雑貨屋
RPG画面使用素材 背景
back:背景

レイアウトや画像の並びを確認しておきます。

android Studio デザインタブ

高さを均等で配置しています。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.test.rpggame.MainActivity">

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="centerCrop"
        android:src="@drawable/back" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <ImageView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:src="@drawable/m0" />

        <ImageView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:src="@drawable/p0" />
    </LinearLayout>

</RelativeLayout>

Android 画面分割 【XML図解】

Android Studio入門

15分で作る? 【バイブレーション④】~ チェック版 ~

Android-Studio-入門【チェック版】タイトル768

バイブレーションの最終回です。
本体のバイブレーション機能をチェックし、有ればバイブを鳴らし、無ければトーストを表示します。

この動画はシリーズ物です。以下の順にご覧ください。

  1. 【バイブレーション①】~ 基礎編 ~
  2. 【バイブレーション②】~ 停止処理 ~
  3. 【バイブレーション③】~ リズム版 ~
  4. 【バイブレーション④】~ チェック版 ~

前回と全く一緒ですので変更は不要です。

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

    <uses-permission android:name="android.permission.VIBRATE" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        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>

前回と全く一緒ですので変更は不要です。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity">

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onStart"
        android:text="START"
        android:textSize="50dp" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onStop"
        android:text="STOP"
        android:textSize="50dp" />
    
</LinearLayout>

本体にバイブレーション機能がある場合はバイブレーションが鳴り、無い場合はトーストを表示します。
※ エミュレーターではトーストが表示される様子

package com.test.vibration;

import android.content.Context;
import android.os.Vibrator;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

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

    // STARTボタン    //////////////////////////////////
    public void onStart(View v) {
       // バイブレーターが存在するか?
       if(((Vibrator) getSystemService(Context.VIBRATOR_SERVICE)).hasVibrator()) {
           // バイブレーションスタート(1秒:1000ミリ秒)
           ((Vibrator) getSystemService(Context.VIBRATOR_SERVICE))
                   .vibrate(new long[]{500, 200, 500, 2000}, 0);
       } else {
           Toast.makeText(this, "起動出来ません", Toast.LENGTH_SHORT).show();
       }
    }
    // STOPボタン    //////////////////////////////////
    public void onStop(View v) {
        // キャンセル
        ((Vibrator) getSystemService(Context.VIBRATOR_SERVICE)).cancel();
    }

    // 強制停止処理   //////////////////////////////////
    @Override
    protected void onPause() {
        super.onPause();
        // キャンセル処理
        ((Vibrator) getSystemService(Context.VIBRATOR_SERVICE)).cancel();
    }
}

15分で作る? 【バイブレーション③】~ リズム版 ~

Android-Studio-入門【リズム版】タイトル768

バイブレーションをアレンジします。
複雑なリズムを付けたり、繰り返しを指定することが出来ます。

この動画はシリーズ物です。以下の順にご覧ください。

  1. 【バイブレーション①】~ 基礎編 ~
  2. 【バイブレーション②】~ 停止処理 ~
  3. 【バイブレーション③】~ リズム版 ~
  4. 【バイブレーション④】~ チェック版 ~

前回と全く一緒ですので変更は不要です。

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

    <uses-permission android:name="android.permission.VIBRATE" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        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>

前回と全く一緒ですので変更は不要です。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity">

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onStart"
        android:text="START"
        android:textSize="50dp" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onStop"
        android:text="STOP"
        android:textSize="50dp" />
    
</LinearLayout>

バイブレーションにリズムをつけます。

package com.test.vibration;

import android.content.Context;
import android.os.Vibrator;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends AppCompatActivity {

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

    // STARTボタン    //////////////////////////////////
    public void onStart(View v) {
        // バイブスタート(0.5秒停止、0.2秒鳴る、0.5秒停止、2秒鳴る、を繰り返す)
        ((Vibrator) getSystemService(Context.VIBRATOR_SERVICE))
                .vibrate( new long[]{500,200, 500,2000}, 0 );
    }

    // STOPボタン    //////////////////////////////////
    public void onStop(View v) {
        // キャンセル処理
        ((Vibrator) getSystemService(Context.VIBRATOR_SERVICE)).cancel();
    }

    // 強制停止処理   //////////////////////////////////
    @Override
    protected void onPause() {
        super.onPause();
        // キャンセル処理
        ((Vibrator) getSystemService(Context.VIBRATOR_SERVICE)).cancel();
    }
}

バイブレーションにリズムをつけます。

package com.test.vibration;

import android.content.Context;
import android.os.Vibrator;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends AppCompatActivity {

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

    // STARTボタン    //////////////////////////////////
    public void onStart(View v) {
        // バイブスタート(0.1秒停止、0.1秒鳴る、を3回繰り返し、5秒鳴って終了する)
        ((Vibrator) getSystemService(Context.VIBRATOR_SERVICE))
            .vibrate( new long[]{100,100, 100,100, 100,100, 100,5000}, -1 );
    }

    // STOPボタン    //////////////////////////////////
    public void onStop(View v) {
        // キャンセル処理
        ((Vibrator) getSystemService(Context.VIBRATOR_SERVICE)).cancel();
    }

    // 強制停止処理   //////////////////////////////////
    @Override
    protected void onPause() {
        super.onPause();
        // キャンセル処理
        ((Vibrator) getSystemService(Context.VIBRATOR_SERVICE)).cancel();
    }
}
Android Studio入門

15分で作る? 【バイブレーション②】~ 停止処理 ~

Android Studio 入門【停止処理】タイトル768

バイブレーションの停止処理を追加します。
通常の停止処理だけでなく、トラブル時の対応も追加しています。

この動画はシリーズ物です。以下の順にご覧ください。

  1. 【バイブレーション①】~ 基礎編 ~
  2. 【バイブレーション②】~ 停止処理 ~
  3. 【バイブレーション③】~ リズム版 ~
  4. 【バイブレーション④】~ チェック版 ~

バイブレーションの停止もとても簡単です。
以下の1行を適切な場所に張付けるだけで停止することが出来ます。

((Vibrator) getSystemService(Context.VIBRATOR_SERVICE)).cancel();

前回と全く一緒ですので変更は不要です。

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

    <uses-permission android:name="android.permission.VIBRATE" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        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>

画面中央にボタンを配置します。
バイブレーションのスタートボタンになります。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity">

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onStart"
        android:text="START"
        android:textSize="50dp" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onStop"
        android:text="STOP"
        android:textSize="50dp" />
    
</LinearLayout>

ボタンクリック時にバイブレーションが鳴ります。
本体の「バイブレーション有無」はチェックしていません。

package com.test.vibration;

import android.content.Context;
import android.os.Vibrator;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends AppCompatActivity {

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

    // STARTボタン    //////////////////////////////////
    public void onStart(View v) {
        // バイブレーションスタート(1秒:1000ミリ秒)
        ((Vibrator) getSystemService(Context.VIBRATOR_SERVICE)).vibrate(10000);
    }

    // STOPボタン    //////////////////////////////////
    public void onStop(View v) {
        // キャンセル処理
        ((Vibrator) getSystemService(Context.VIBRATOR_SERVICE)).cancel();
    }


    // 強制停止処理   //////////////////////////////////
    @Override
    protected void onPause() {
        super.onPause();
        // キャンセル処理
        ((Vibrator) getSystemService(Context.VIBRATOR_SERVICE)).cancel();
    }
}

Android Studio入門

15分で作る? 【バイブレーション①】~ 基礎編 ~

Android-Studio-入門【簡易版】タイトル768C

「15分で作る」シリーズはある程度知識のある方向けの動画です。
未経験の方でもコピペで再現出来るように目指していますが、理解には「RPGで学ぶ」「3分で学ぶ」を先にご覧ください。

バイブレーション(振動)を起動します。
限りなくシンプルに「とにかく起動すればOK」を目指した動画です。

難易度:★★☆☆☆ 未経験でも再現は簡単、アレンジは難しい

※ エミュレーターでは起動しません。
※ バイブ機能の有る実機のみテスト出来ます。

この動画はシリーズ物です。以下の順にご覧ください。

  1. 【バイブレーション①】~ 基礎編 ~
  2. 【バイブレーション②】~ 停止処理 ~
  3. 【バイブレーション③】~ リズム版 ~
  4. 【バイブレーション④】~ チェック版 ~

バイブレーションの起動はとても簡単です。
最短2行の入力とインポートだけで起動する事ができます。

バイブレーションの使用許可を記載します。

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

バイブレーションの実行を記載します。

((Vibrator) getSystemService(Context.VIBRATOR_SERVICE)).vibrate(1000);

AndroidManifest.xmlにパーミッション(使用許可)を1行追加します。
サンプルソースの5行目になります。

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

    <uses-permission android:name="android.permission.VIBRATE" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        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>

画面中央にボタンを配置します。
バイブレーションのスタートボタンになります。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity">

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onStart"
        android:text="START"
        android:textSize="50dp" />
    
</LinearLayout>

ボタンクリック時にバイブレーションが鳴ります。
本体の「バイブレーション有無」はチェックしていません。

package com.test.vibration;

import android.content.Context;
import android.os.Vibrator;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends AppCompatActivity {

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

    // STARTボタン    //////////////////////////////////
    public void onStart( View v){

        // バイブレーションスタート(1秒:1000ミリ秒)
        ((Vibrator) getSystemService(Context.VIBRATOR_SERVICE)).vibrate(1000);

    }
}

15分で作る?【 60秒ストップウォッチ 】

Android 開発【 60秒ストップウォッチ 】768

以前公開した【 アニメストップウォッチ 】に時間による変化を追加します。

具体的には60秒以降にはイラストを変えて、にゃんこが慌てます。

難易度:★★★☆☆

  1. コピペでの再現は可能
  2. Java初歩の知識でアレンジ可能

動画では「簡易的な解説」ですませ、皆さんの「PCで再現」を目指します。
理解やアレンジには、相当なスキルが必要ですので「RPGで学ぶ」や市販テキストの学習をオススメします。

以下の画像を追加します。
クリック後の画像を保存してください。

Android アプリ【タイトル素材】
cat0
Android アプリ【パラパラアニメ素材2】
cat2
Android アプリ【パラパラアニメ素材1】
cat1
cat3
cat3
cat4
cat4
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <Chronometer
        android:id="@+id/c"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="60sp" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="onStart"
        android:text="スタート"
        android:textSize="40sp" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="onStop"
        android:text="ストップ"
        android:textSize="40sp" />

    <ImageView
        android:id="@+id/iv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="centerCrop"
        android:src="@drawable/cat0" />

</LinearLayout>

少々ややこしいので、上から順に入力+解説していきます。


package com.test.stopwatch;

import android.os.SystemClock;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Chronometer;
import android.widget.ImageView;

public class MainActivity extends AppCompatActivity implements Chronometer.OnChronometerTickListener {

    int x = 0;  // 表示回数カウント

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

    // スタート //////////////////////
    public void onStart(View v) {
        ((Chronometer)findViewById(R.id.c)).setBase(SystemClock.elapsedRealtime());
        ((Chronometer)findViewById(R.id.c)).start();
        ((Chronometer)findViewById(R.id.c)).setOnChronometerTickListener(this);
    }

    // ストップ ///////////////////////
    public void onStop(View v) {
        ((Chronometer)findViewById(R.id.c)).stop();
        ((ImageView)findViewById(R.id.iv)).setImageResource(R.drawable.cat0);
    }

    // 定期処理(約1秒毎)//////////////////////
    @Override
    public void onChronometerTick(Chronometer chronometer) {

                x++;    // 表示回数カウントを+1

        // 表示タイム = ( 現在時刻 - アプリ起動時刻 ) / 1000
        long time = (SystemClock.elapsedRealtime() - chronometer.getBase()) / 1000;

        if( time < 60 ) {       // 60秒未満?
            if (x % 2 == 0) {   // 偶数?
                ((ImageView) findViewById(R.id.iv)).setImageResource(R.drawable.cat1);
            } else {
                ((ImageView) findViewById(R.id.iv)).setImageResource(R.drawable.cat2);
            }
        } else {
            if (x % 2 == 0) { 
                ((ImageView) findViewById(R.id.iv)).setImageResource(R.drawable.cat3);
            } else {
                ((ImageView) findViewById(R.id.iv)).setImageResource(R.drawable.cat4);
            }
        }
    }
}
Android Studio入門

15分で作る?【 アニメストップウォッチ 】~パラパラアニメ~

Android 開発 【ストップウォッチ2】1367

以前公開した【 簡易ストップウォッチ 】にパラパラアニメを連動させる方法です。

難易度:★★★★☆
・コピペでの再現は可能
・詳細の理解やアレンジは難しい

動画では「簡易的な解説」ですませ、皆さんの「PCで再現」を目指します。
理解やアレンジには、相当なスキルが必要ですので「RPGで学ぶ」や市販テキストの学習をオススメします。

Android アプリ【タイトル素材】
cat0
Android アプリ【パラパラアニメ素材2】
cat2
Android アプリ【パラパラアニメ素材1】
cat1
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <Chronometer
        android:id="@+id/c"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="60sp" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="onStart"
        android:text="スタート"
        android:textSize="40sp" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="onStop"
        android:text="ストップ"
        android:textSize="40sp" />

    <ImageView
        android:id="@+id/iv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="centerCrop"
        android:src="@drawable/cat0" />

</LinearLayout>
package com.hakoniwadesign.stopwatch;

import android.os.SystemClock;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Chronometer;
import android.widget.ImageView;

public class MainActivity extends AppCompatActivity  {

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

    // スタート
    public void onStart(View v) {
        ((Chronometer)findViewById(R.id.c)).setBase(SystemClock.elapsedRealtime());
        ((Chronometer)findViewById(R.id.c)).start();

        // 画像変更
        ((ImageView)findViewById(R.id.iv)).setImageResource(R.drawable.cat1);
    }

    // ストップ
    public void onStop(View v) {
        ((Chronometer)findViewById(R.id.c)).stop();
        ((ImageView)findViewById(R.id.iv)).setImageResource(R.drawable.cat0);
    }
}
package com.hakoniwadesign.stopwatch;

import android.os.SystemClock;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Chronometer;
import android.widget.ImageView;

public class MainActivity extends AppCompatActivity {

    int x = 0;  // 表示回数カウント

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

    // スタート
    public void onStart( View v ){
        ((Chronometer)findViewById(R.id.c)).setBase(SystemClock.elapsedRealtime());
        ((Chronometer)findViewById(R.id.c)).start();

        // 条件分析
        x++;    // xを+1させる
        if( x % 2 ==0 ) {   // 偶数ですか?
            // YESの場合
            ((ImageView) findViewById(R.id.iv)).setImageResource(R.drawable.cat1);
        }else {
            // NOの場合
            ((ImageView) findViewById(R.id.iv)).setImageResource(R.drawable.cat2);
        }
    }

    // ストップ
    public void onStop( View v ){
        ((Chronometer)findViewById(R.id.c)).stop();
        ((ImageView)findViewById(R.id.iv)).setImageResource(R.drawable.cat0);
    }
}

package com.hakoniwadesign.stopwatch;

import android.os.SystemClock;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Chronometer;
import android.widget.ImageView;

// 定期的処理① メソッドの使用宣言
public class MainActivity extends AppCompatActivity implements Chronometer.OnChronometerTickListener {

    int x = 0;  // 表示回数カウント

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

    // スタート
    public void onStart( View v ){
        ((Chronometer)findViewById(R.id.c)).setBase(SystemClock.elapsedRealtime());
        ((Chronometer)findViewById(R.id.c)).start();

        // 定期的処理③ 処理のスタート
        ((Chronometer)findViewById(R.id.c)).setOnChronometerTickListener(this);
    }

    // ストップ
    public void onStop( View v ){
        ((Chronometer)findViewById(R.id.c)).stop();
        ((ImageView)findViewById(R.id.iv)).setImageResource(R.drawable.cat0);
    }

    // 定期的処理② 約1秒毎に実行する具体的処理
    @Override
    public void onChronometerTick(Chronometer chronometer) {
        // 条件分析
        x++;    // xを+1させる
        if( x % 2 ==0 ) {   // 偶数ですか?
            // YESの場合
            ((ImageView) findViewById(R.id.iv)).setImageResource(R.drawable.cat1);
        }else {
            // NOの場合
            ((ImageView) findViewById(R.id.iv)).setImageResource(R.drawable.cat2);
        }
    }
}
Android Studio入門

Android Studio 入門【 HorizontalScrollView 】写真の横スクロール

Android Studio 入門【スクロールビュー】写真 768

写真を横スクロールさせる方法です。
前回のScrollViewの復習になりますので、解説はほぼ省いています。

教材のサンプル写真です。
以下の素材サイト様からお借りしています。

写真素材ぱくたそ https://www.pakutaso.com

* 注意 *
・画像をご自身で要するにはファイル名やファイルサイズ、拡張子に注意する必要があります。
・ファイル名は半角小文字の英数(a~z 0~9)とアンダーバー( _ )のみで、最初の1文字目は半角英字( a ~ z)のみです。
・ファイルサイズが大きすぎるとエラーが出る場合があります。

ScrollView【写真のスクロール】
i1
ScrollView【写真のスクロール】
i2
ScrollView【写真のスクロール】
i3
ScrollView【写真のスクロール】
i4
ScrollView【写真のスクロール】
i5
ScrollView【写真のスクロール】
i6
ScrollView【写真のスクロール】
i7
ScrollView【写真のスクロール】
i8

ScrollView【写真のスクロール】
i9
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity">

    <HorizontalScrollView
        android:id="@+id/horizontalScrollView"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="horizontal">

            <ImageView
                android:id="@+id/imageView"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/i1" />

            <ImageView
                android:id="@+id/imageView2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/i2" />

            <ImageView
                android:id="@+id/imageView3"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/i3" />

            <ImageView
                android:id="@+id/imageView4"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/i4" />
        </LinearLayout>
    </HorizontalScrollView>
</RelativeLayout>