Android スライドショーアプリサンプル
授業用にSDカードにある写真をスライドショーで表示するアプリを作成したので、リンクやソースを貼りつける。(0件チェックやってない、、、。)
できあがりは、
で、ボタンを押す、またはフリックで写真を切り替える。
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' }
まずは画面。こんな感じ。
今回はアニメーションをファイルに保存。以下のファイルを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
アニメーションについてはこのサイト
ありがとうございました。