かざいむ日誌

IT関係で知ったことなどを記事としてあげていきます。内容に不備や質問などあればぜひコメントをよせてください。

Android スライドショーアプリサンプル

授業用にSDカードにある写真をスライドショーで表示するアプリを作成したので、リンクやソースを貼りつける。(0件チェックやってない、、、。)

できあがりは、
f:id:name_untitled:20161205143539p:plainf:id:name_untitled:20161205143543p:plain
で、ボタンを押す、またはフリックで写真を切り替える。

build.gradleはターゲットSDKを下げてコード量を減らしている、、、。
build.gradle

apply plugin: 'com.android.application'

android {
    compileSdkVersion 24
    buildToolsVersion "24.0.2"

    defaultConfig {
        applicationId "la.fe_nuol.myapplication"
        minSdkVersion 21
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:24.2.1'
}


まずは画面。こんな感じ。
f:id:name_untitled:20161205143458p:plain

今回はアニメーションをファイルに保存。以下のファイルをanimフォルダに作成。
Animation
zoom_in_next.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:fillAfter="true">
    <scale
        android:duration="500"
        android:fromXScale="0.1"
        android:fromYScale="0.1"
        android:toXScale="1"
        android:toYScale="1"
        android:pivotX="50%"
        android:pivotY="50%"
        />
    <translate android:fromXDelta="100%"
        android:toXDelta="0" android:duration="500"/>
</set>

zoom_in_prev.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:fillAfter="true">
    <scale
        android:duration="500"
        android:fromXScale="0.1"
        android:fromYScale="0.1"
        android:toXScale="1"
        android:toYScale="1"
        android:pivotX="50%"
        android:pivotY="50%"
        />
    <translate android:fromXDelta="-100%"
        android:toXDelta="0" android:duration="500"/>
</set>

zoom_out_next.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:fillAfter="false">
    <scale
        android:duration="500"
        android:fromXScale="1"
        android:fromYScale="1"
        android:toXScale="0.1"
        android:toYScale="0.1"
        android:pivotX="50%"
        android:pivotY="50%"
        />
    <translate android:fromXDelta="0"
        android:toXDelta="-100%" android:duration="500"/>
</set>

zoom_out_prev.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:fillAfter="false">
    <scale
        android:duration="500"
        android:fromXScale="1"
        android:fromYScale="1"
        android:toXScale="0.1"
        android:toYScale="0.1"
        android:pivotX="50%"
        android:pivotY="50%"
        />
    <translate android:fromXDelta="0"
        android:toXDelta="100%" android:duration="500"/>
</set>[f:id:name_untitled:20161205143458p:plain]

MainActivity.java

package la.fe_nuol.myapplication;

import android.database.Cursor;
import android.gesture.GestureOverlayView;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.provider.MediaStore;
import android.support.v4.view.GestureDetectorCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
import android.widget.ViewFlipper;

public class MainActivity extends AppCompatActivity implements
    GestureDetector.OnGestureListener{

    private GestureDetectorCompat mDetector;
    private ViewFlipper viewFlipper;
    Cursor cursor;

    private ImageView getImage() {
        String filePath =
                cursor.getString(
                        cursor.getColumnIndex(
                                MediaStore.Images.Media.DATA));
        ImageView imageView = new ImageView(this);
        Bitmap bmImg = BitmapFactory.decodeFile(filePath);
        imageView.setImageBitmap(bmImg);
        return imageView;
    }

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

        cursor = getContentResolver().query(
                MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                null,null,null,null);
        cursor.moveToFirst();
        viewFlipper = (ViewFlipper)findViewById(R.id.viewFlipper);
        viewFlipper.addView(getImage());
        mDetector = new GestureDetectorCompat(this,this);
    }

    public void onPreviousClick(View view){
        if(cursor.isFirst()) return;
        cursor.moveToPrevious();
        viewFlipper.addView(getImage(),0);
        viewFlipper.setInAnimation(
                AnimationUtils.loadAnimation(this,R.anim.zoom_in_prev)
        );
        viewFlipper.setOutAnimation(
                AnimationUtils.loadAnimation(this,R.anim.zoom_out_prev)
        );
        viewFlipper.showPrevious();
        if(viewFlipper.getChildCount()<=1) return;
        viewFlipper.removeViewAt(viewFlipper.getChildCount()-1);
    }

    public void onNextClick(View view){
        if(cursor.isLast()) return;
        cursor.moveToNext();
        viewFlipper.addView(getImage());
        viewFlipper.setInAnimation(
                AnimationUtils.loadAnimation(this,R.anim.zoom_in_next));
        viewFlipper.setOutAnimation(
                AnimationUtils.loadAnimation(this,R.anim.zoom_out_next));
        viewFlipper.showNext();
        if(viewFlipper.getChildCount()<=1) return;
        viewFlipper.removeViewAt(0);
    }

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2,
                           float vx, float vy) {
        float dx = Math.abs(e1.getX() - e2.getX());
        float dy = Math.abs(e1.getY() - e2.getY());
        if (dx > dy) {
            if (vx > 0) {
                onPreviousClick(null);
            } else {
                onNextClick(null);
            }
            return true;
        }
        return false;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return mDetector.onTouchEvent(event);
    }

    @Override
    public boolean onDown(MotionEvent event) { return true;}

    @Override
    public void onLongPress(MotionEvent event) {}

    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2,
        float f1, float f2) {return true;}

    @Override
    public void onShowPress(MotionEvent event) {}

    @Override
    public boolean onSingleTapUp(MotionEvent event) {return true;}
}

ジェスチャーのイベントの実装の仕方(フリック)を説明。
developer.android.com



やり方としてAsyncもあるが、今回は見送り
Tumbling Dice — [Android]Viewが表示された時のイベントを設定する


主にこのサイトを参考にしました。
techbooster.jpn.org
motogeneralpurpose.blogspot.jp


アニメーションについてはこのサイト

android.keicode.com

ありがとうございました。