画像間をスクロールするだけの簡単なプロジェクトを試していますが、今のところアニメーションが非常に悪いです。
スライドして画像を切り替えると、スワイプ中に指に「くっつかない」代わりに、ぎこちなくフェードアウトし、次の画像がスライドします。使用したアニメーション パラメータに関係していると思いますが、他に何を使用すればよいかわかりません。
私が達成したいのは、アプリのタブ間を水平にスクロールするようなもので、一方の画像がスライドアウトし、もう一方の画像が横にスライドして、横にくっついているようなものです。
コードは次のとおりです。
xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<ImageSwitcher
android:id="@+id/splashScreenImages"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
</ImageSwitcher>
</RelativeLayout>
ジャバ:
package com.test.imageswitchertest02;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.animation.AnimationUtils;
import android.widget.ImageSwitcher;
import android.widget.ImageView;
import android.widget.ViewSwitcher.ViewFactory;
public class MainActivity extends Activity implements ViewFactory {
ImageSwitcher splashSwitcher;
Integer[] screensList = { R.drawable.splash_screen1, R.drawable.splash_screen2, R.drawable.splash_screen3 };
int curIndex = 0;
int downX, upX;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
splashSwitcher = (ImageSwitcher) findViewById(R.id.splashScreenImages);
splashSwitcher.setFactory(this);
splashSwitcher.setInAnimation(AnimationUtils.loadAnimation(this,android.R.anim.fade_in));
splashSwitcher.setInAnimation(AnimationUtils.loadAnimation(this,android.R.anim.fade_out));
splashSwitcher.setImageResource(screensList[curIndex]);
splashSwitcher.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
downX = (int) event.getX();
Log.i("event.getX()", " downX " + downX);
return true;
} else if (event.getAction() == MotionEvent.ACTION_UP) {
upX = (int) event.getX();
Log.i("event.getX()", "upX" + downX);
if (upX - downX > 100) {
// curIndex is the current image index being viewed
curIndex--;
if (curIndex < 0) {
curIndex = screensList.length - 1;
}
splashSwitcher.setInAnimation(AnimationUtils.loadAnimation(MainActivity.this,android.R.anim.slide_in_left));
splashSwitcher.setInAnimation(AnimationUtils.loadAnimation(MainActivity.this,android.R.anim.slide_out_right));
splashSwitcher.setImageResource(screensList[curIndex]);
} else if (downX - upX > -100) {
curIndex++;
if (curIndex > 2) {
curIndex = 0;
}
splashSwitcher.setInAnimation(AnimationUtils.loadAnimation(MainActivity.this,R.anim.slide_in_right));
splashSwitcher.setInAnimation(AnimationUtils.loadAnimation(MainActivity.this,R.anim.slide_out_left));
splashSwitcher.setImageResource(screensList[curIndex]);
}
return true;
}
return false;
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public View makeView() {
ImageView i = new ImageView(this);
i.setScaleType(ImageView.ScaleType.FIT_CENTER);
return i;
}
}