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

android OS & iPadOS の記録。

基礎。画像サムネイル表示。main部分。

2021-09-19 00:16:54 | Android studio 日記

サムネイルクラスでレイアウト情報は設定しているので、メインではクラスのメソッドにindex と bitmap データを渡すだけ。サムネイル数は、getSize()で分かるのでその数だけデータを渡せばよい。bitmap をnull にすると非表示になる。bitmapデータは縮小したものを渡す。原画サイズを渡してもサムネイル表示されるがメモリの無駄だから。

 

MainActivity.java

    private MyDirectory mFolderItemList = null;
    private RelativeLayout mR_Layout = null;
    private MyThumbnailImages mThumbnailImages = null;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        File dir = new File( getFilesDir(),"image1" ); // assetsフォルダーからこのフォルダに移動したので。
        mFolderItemList = new MyDirectory( dir );

        mR_Layout = (RelativeLayout)findViewById( R.id.thumbnail_image );
        mThumbnailImages = new MyThumbnailImages( this, mR_Layout );
        initThumbnail ();

    }


    private void initThumbnail() {
        int n = mThumbnailImages.getSize();
        int tw = mThumbnailImages.getThumbnailWidth();
        int th = mThumbnailImages.getThumbnailHeight();
        File f;
        String fName;

        for ( int i=0; i < n; i++ ) {
            fName = mFolderItemList.getFileName( i );
            if ( fName == null ) continue;
            f = new File( mFolderItemList.getTargetDir().getAbsolutePath() + "/" + fName );
            if ( !f.exists() || !f.isFile() ) continue;
            try {
                InputStream istream = new FileInputStream( f );
                Bitmap bitmap = BitmapFactory.decodeStream(istream);
                float mag = calcThumbnailMag( bitmap.getWidth(), bitmap.getHeight(), tw, th );
                int width = (int) ((float) bitmap.getWidth() * mag );
                int height = (int) ((float) bitmap.getHeight() * mag );
                Bitmap scaleBitmap = Bitmap.createScaledBitmap( bitmap, width, height, true);
                mThumbnailImages.setThumbnailImage( i, scaleBitmap );
                mThumbnailImages.setThumbnailText( i, fName );
                bitmap.recycle();
                istream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }


    private float calcThumbnailMag( int bitmapW, int bitmapH, int reqW, int reqH ) {
        float magW = (float) reqW / (float) bitmapW;
        float magH = (float) reqH / (float) bitmapH;

        return Math.max( magW, magH );
    }

 

 

dimen を指定するように変更。

activity_main.xml

    < RelativeLayout
        android:id="@+id/thumbnail_image"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="@dimen/margin_start"
        android:layout_marginTop="@dimen/margin_top"
        android:layout_marginEnd="@dimen/margin_end"
        android:layout_marginBottom="@dimen/margin_bottom"
        tools:ignore="MissingConstraints" >

   

 

数値はここで設定する。

res/values/dimens.xml

< resources>
    10dp
    10dp
    10dp
    20dp