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

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);

    }

}


  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

基礎研究。ImageView の継承。

2021-08-26 13:20:23 | Android studio 日記

 imageView にセットした原画像のサイズが取得できないので継承を使い、プロパティで保存しておく。

 

public class MyImageView extends AppCompatImageView {

    /* お約束の3メソッド */
    public MyImageView(Context context, AttributeSet attrs, int defStyle){
        super(context, attrs, defStyle);
    }

    public MyImageView(Context context, AttributeSet attrs){
        super(context, attrs);
    }

    public MyImageView(Context context){
        super(context);
    }
    /*********/

    private int myImageWidth;  // セットした時の原画サイズ
    private int myImageHeight;

    @Override
    public void setImageBitmap(Bitmap bm) {
        myImageWidth = bm.getWidth();
        myImageHeight = bm.getHeight();
        super.setImageBitmap(bm); // 元のメソッドを忘れずに呼ぶ
    }

    public int getImageWidth() {
        return myImageWidth;
    }

    public int getImageHeight() {
        return myImageHeight;
    }
}

 

【xml】ファイル記入例

    <com.android.test2.MyImageView
        android:id="@+id/image_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

 

 

 bitmap データをセットした時のみ。

 


  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

基礎研究。imageview

2021-08-25 17:34:28 | Android studio 日記

 ScrollViewを使わずに ImageView をスクロールさせる方法は理屈では理解できる。自分のイメージ通り動かす時に ImageView に設定した画像の元サイズを取得したい。だが、手段がない。

 ImageView.getWidth() は、表示されている領域の幅。画像の幅ではない。

 bitmap画像をimageView に設定する時にサイズを保存しておく。ImageViewを継承した新しいクラスにプロパティを新設し、読み出しメソッドで取得するしかないか。


  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

考察

2021-08-12 13:17:58 | Android studio 日記

赴くままプログラミングしてきたので綻びが出てきた。やってきた事と何がしたいのか考える。

画像ファイルを読み込み表示させる。
スクリーンサイズより画像サイズが大きい場合はスクロール。
フォルダ内の画像ファイルを切り替え表示させる。
表示モードをリアルサイズとフィットサイズの二つにする。
フィットサイズモード時、画像の縦横比とデバイス縦横比が合うように画像を回転表示する。
画像ファイルの切り替えは、ViewSwicher を利用する。

そして、設定画面、ファイラー画面などへ切り替え。ここで問題噴出。
タップ処理、データのやり取り、色々とフラグメントとアクティビティーで一長一短が有り迷う。
スクロール処理を自前で用意すれば、すっきりするのかな?

で、したい事。
フルパスで画像ファイルを指定。記憶。表示(モードやスクロール有)。
フォルダ内の画像ファイルを順次表示。
特定のアクションでフォルダ移動の画面へ移行。画面内サムネイル表示。フォルダ、ファイル区別。
別のアクションで設定画面へ移行。
表示画像をお気に入り登録、お気に入り画面で編集、読み出し。

メモリ消費量を極力少なくしたい。サムネイル無しか・・。スクロール無しにして viewSwitcher 切り替えでサムネイル数の固定で書き換え表示ならいけるかな。viewSwitcher の切り替えアニメーション使えば、それなりに見えるし・・。まだまだ先の事だな。
画面切り替えでフラグメントか、アクティビティーかが決められない。タップ処理、画面切り替えの時間・・。アプリ起動時にアクティビティー全部開いておいて非表示にしてスタンバイさせておくとか?無理だわ。データ受け渡しが起動時だ。

画像スクロール自前でフラグメント利用が自分にとって分かりやすいのかな。試行錯誤は続く。

 


  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする