次にImageSwitcher について。
Bitmap を bitmapDrawable に変換して、mImageSwitcherにセットするだけ。
次にセットした画像を前に表示しているものとアニメーションで交換してくれる。(検索:AnimationUtils)
ImageView view;
view = (ImageView)mImageSwitcher.getCurrentView(); // 表示View
view = (ImageView)mImageSwitcher.getNextView() // 待機View
int imageWidth = view.getDrawable().getIntrinsicWidth();
int scrollOffsetX = view.getScrollX();
何となく、セットした画像サイズ、オフセットが取り出せる。
imageView.setScaleType() でフィット表示させていて、スクロール処理に入っちゃうとまずいことになる。
フィットモードの時はスクロールをはじくこと。
view.getDrawable().getIntrinsicWidth()は元画像のサイズを返すから正常にスクロールしない。
public class MainActivity extends AppCompatActivity {
private ImageSwitcher mImageSwitcher = null;
private AnimationSet mAnimationSet;
private ImageView.ScaleType imageViewScaleType = ImageView.ScaleType.MATRIX;
private BitmapDrawable bitmapDrawable;
private Bitmap mBitmap = null, mBitmap0 = null;
private boolean flag = true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mImageSwitcher = findViewById(R.id.image_switcher);
mImageSwitcher.setFactory(new ViewSwitcher.ViewFactory() {
@Override
public View makeView() {
ImageView imageView = new ImageView(getApplicationContext());
imageView.setScaleType(imageViewScaleType);
return imageView;
}
});
setNextAnimation();
File f = getExternalStoragePublicDirectory(DIRECTORY_PICTURES);
File f1 = new File(f.getAbsolutePath() + "/image1/182.jpg");
File f2 = new File(f.getAbsolutePath() + "/image1/1.jpg");
mBitmap0 = BitmapFactory.decodeFile(f1.getAbsolutePath());
mBitmap = BitmapFactory.decodeFile(f2.getAbsolutePath());
bitmapDrawable = new BitmapDrawable( getResources(),mBitmap );
mImageSwitcher.setImageDrawable(bitmapDrawable);
setPaddingImageView( (ImageView) mImageSwitcher.getNextView(), mBitmap.getWidth(), mBitmap.getHeight() );
}
public void loadImage(int y) { // タッチイベントで呼べば、切り替えをしてくれる。今回省略。
if ( y < 400 ) setNextAnimation();
else setPrevAnimation();
if (flag) {
setPaddingImageView( (ImageView) mImageSwitcher.getNextView(), mBitmap0.getWidth(), mBitmap0.getHeight() );
mImageSwitcher.setImageDrawable(new BitmapDrawable(getResources(), mBitmap0));
} else {
setPaddingImageView( (ImageView) mImageSwitcher.getNextView(), mBitmap.getWidth(), mBitmap.getHeight() );
mImageSwitcher.setImageDrawable(new BitmapDrawable(getResources(), mBitmap));
}
flag = !flag;
mImageSwitcher.getCurrentView().scrollTo( 0,0 );
}
private void setNextAnimation() { // resフォルダ内に anim フォルダを作り、next_in_animation_set.xml ファイルを作る。
mImageSwitcher.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.next_in_animation_set));
mImageSwitcher.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.next_out_animation_set));
}
private void setPrevAnimation() {
mImageSwitcher.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.prev_in_animation_set));
mImageSwitcher.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.prev_out_animation_set));
}
public void setPaddingImageView(ImageView view, int bx, int by) {
int screenWidth = getScreenWidth();
int screenHeight = getScreenHeight();
int paddingX, paddingY;
if (bx < screenWidth) {
paddingX = (screenWidth - bx) / 2;
} else paddingX = 0;
if (by < screenHeight) {
paddingY = (screenHeight - by) / 2;
} else paddingY = 0;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
view.setPaddingRelative(paddingX, paddingY, paddingX, paddingY);
} else
view.setPadding(paddingX, paddingY, paddingX, paddingY);
}
public int getScreenWidth() {
WindowManager wManager = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
WindowMetrics mWindowMetrics = wManager.getMaximumWindowMetrics();
return mWindowMetrics.getBounds().width();
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
DisplayMetrics mDisplayMetrics = new DisplayMetrics();
wManager.getDefaultDisplay().getRealMetrics(mDisplayMetrics);
return mDisplayMetrics.widthPixels;
}
Point realSize = new Point();
wManager.getDefaultDisplay().getSize(realSize);
return realSize.x;
}
public int getScreenHeight() {
WindowManager wManager = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
WindowMetrics mWindowMetrics = wManager.getCurrentWindowMetrics();
return mWindowMetrics.getBounds().height();
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
DisplayMetrics mDisplayMetrics = new DisplayMetrics();
wManager.getDefaultDisplay().getRealMetrics(mDisplayMetrics);
return mDisplayMetrics.heightPixels;
}
Point realSize = new Point();
wManager.getDefaultDisplay().getSize(realSize);
return realSize.y;
}
}
【next_in_animation_set.xml】下から上に移動指示。
< ?xml version="1.0" encoding="utf-8"?>
< set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="@android:anim/decelerate_interpolator">
< translate
android:fromYDelta="100%"
android:toYDelta="0%"
android:fillAfter="true"
android:duration="250" />
< /set>
他は省略。