タブレット用プログラムの書き止め

android OS & iPadOS の記録。

基礎研究。画像スクロール(カスタム仕様)

2021-08-26 17:03:58 | Android studio 日記

プロジェクトに画像を用意しておく。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);

    }

}