プロジェクトに画像を用意しておく。MyImageViewクラス、MyNumbersInStringクラスは別記事参照。
テストプロジェクト:
package com.android.test2;
import …
public class MainActivity extends AppCompatActivity {
private final ArrayList<MyNumbersInString> mFileNameList = new ArrayList<>();
private AssetManager mAssetManager;
private int targetIndexNo;
private MyImageView imageView1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
targetIndexNo = 0;
mAssetManager = getResources().getAssets();
setFileNameList();
imageView1 = (MyImageView)findViewById(R.id.image_view1);
setImage(imageView1, "image/" + mFileNameList.get(targetIndexNo).getName());
}
float mTouchX, mTouchY;
boolean mImageViewFlag = false;
@Override
public boolean onTouchEvent(MotionEvent event) {
switch ( event.getActionMasked() ) {
case MotionEvent.ACTION_DOWN:
mTouchX = event.getX();
mTouchY = event.getY();
break;
case MotionEvent.ACTION_MOVE:
mImageViewFlag = true;
float x = event.getX();
float y = event.getY();
scrollImage( imageView1, (mTouchX-x), (mTouchY-y) );
mTouchX = x;
mTouchY = y;
return true;
case MotionEvent.ACTION_UP:
if ( mImageViewFlag ) {
scrollFinish( imageView1 );
mImageViewFlag = false;
return true;
}
break;
}
return super.onTouchEvent(event);
}
private void scrollImage ( MyImageView view, float x, float y ) {
view.scrollBy((int) x, (int) y );
}
private void scrollFinish ( MyImageView view ) {
int sw = getScreenWidth(); // デバイススクリーンサイズ
int sh = getScreenHeight();
int iw = view.getImageWidth();// 原画像サイズ
int ih = view.getImageHeight();
int scrX = view.getScrollX(); // スクロール時の左上ポイント。(画像上)
int scrY = view.getScrollY();
int cX = 0, cY = 0; // 補正量
int dx = ( iw - sw ); // 画像とスクリーンサイズの差
int dy = ( ih - sh );
// スライドした時、はみ出して空白になった分を戻す。scaletypeなどで加工していない場合のみ
if ( dx > 0 ) { // 実画像が大きい
if ( scrX <= 0 ) // 空白が左に出ている
cX = -scrX; // getScrollX() が0になるように補正
else if ( scrX > dx ) // 空白が右に出ている
cX = -( scrX - dx ); // getScrollX() がdxになるように補正
} else
cX = -scrX;
if ( dy > 0 ) {
if ( scrY <= 0 )
cY = -scrY;
else if ( scrY > dy )
cY = -( scrY - dy );
} else
cY = -scrY;
view.scrollBy( cX, cY );
}
private int getScreenWidth() {
// 以前の記事から参照
}
private int getScreenHeight() {
// 以前の記事から参照
}
private void setPaddingImageView(MyImageView view, int bx, int by) {
// 以前の記事から参照
}
private void setImage( MyImageView view, String fName) {
try {
InputStream istream = mAssetManager.open(fName);
Bitmap mBitmap = BitmapFactory.decodeStream(istream);
if (mBitmap != null) {
view.setImageBitmap(mBitmap);
setPaddingImageView(view, mBitmap.getWidth(), mBitmap.getHeight());
}
istream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
private void setFileNameList() {
// 以前の記事から参照
}
@Override
protected void onResume() {
super.onResume();
// フルスクリーン表示
int uiOptions = 0;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
uiOptions = View.SYSTEM_UI_FLAG_LOW_PROFILE
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
uiOptions = View.SYSTEM_UI_FLAG_LOW_PROFILE
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
} else {
uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
}
View decorView = getWindow().getDecorView();
decorView.setSystemUiVisibility(uiOptions);
}
}