// Runnable 本体
MyDirectoryListAdapter.MyRunnableDataクラスをデータ受け渡しに使っている。
全てが有効に使えるか分からない。テストを繰り返して使える事を探す。
public class MyDirectoryIconRunnable implements Runnable {
private File mTargetDir = null;
private File mCacheDir = null;
private List< mString> mItemeNames = null;
private List< String> mItemType = null;
private static final int DIR_SAVE_SIZE = 96; // ディレクトリとファイルのサイズを変えている
private static final int FILE_SAVE_SIZE = 160;
private int saveSize;
private MyDirectoryListAdapter.MyRunnableData mDirectoryListAdapter = null;
MyDirectoryIconRunnable( MyDirectoryListAdapter.MyRunnableData rData ) {
mTargetDir = rData.getTargetDir();
mItemType = rData.getListType();
mItemeNames = rData.getListName();
mCacheDir = rData.getCacheDir();
mDirectoryListAdapter = rData;
}
@Override
public void run() {
if (mCacheDir == null || !mCacheDir.exists() || !mCacheDir.isDirectory()) {
finish();
return;
}
File[] files = mCacheDir.listFiles(); // 作業ディレクトリ内のファイル削除
if ( files != null && files.length != 0 ) {
boolean b;
for ( File file: files ) {
b = file.delete();
}
}
for (int i = 0; i < mItemeNames.size(); i++) {
switch ( mItemType.get(i) ) {
case "D":
dirThumbnaile(i);
break;
case "F":
fileThumbnaile(i);
break;
default:
}
mDirectoryListAdapter.setNotifyItemChanged(i); // 何かの加減で問題が発生するかも
}
finish();
}
private void dirThumbnaile(int index) {
String name = mItemeNames.get(index) + ".jpg";
File cacheFile = new File( mCacheDir, name );
if (cacheFile.exists()) return; // キャッシュファイルが有る
File childDir = new File( mTargetDir, mItemeNames.get(index) );
MyDirectory_FileCheck childDirData = new MyDirectory_FileCheck( childDir );// 画像ファイル1枚だけ取り出す
File imageFile = childDirData.getImageFile(); // 取り出した1枚のFile
if ( imageFile == null )
makeThumbnailToCache( null, cacheFile ); // dummy を作る
else {
saveSize = DIR_SAVE_SIZE;
makeThumbnailToCache(imageFile, cacheFile);// アイコン用サムネイル画像の変換と保存
}
}
private void fileThumbnaile(int index ) {
String name = mItemeNames.get(index);
File cacheFile = new File( mCacheDir, name ); // create cache file
if ( cacheFile.exists() ) return;
File souDir = new File( mTargetDir, name );
saveSize = FILE_SAVE_SIZE;
makeThumbnailToCache( souDir, cacheFile ); // 子ディレクトリ内の画像ファイル & キャッシュファイル
}
private void makeThumbnailToCache( File souFile, File cacheFile ) {
if ( souFile == null ) {
try {
boolean flag = cacheFile.createNewFile();
} catch (Exception ignored) {
}
return;
}
Bitmap bitmap = thumbnaileImage( souFile ); // ソース画像ファイルからサムネイル画像を作成
if ( bitmap != null && cacheFile != null ) {// サムネイル画像をキャッシュに保存
try {
FileOutputStream fos = new FileOutputStream( cacheFile );
bitmap.compress( Bitmap.CompressFormat.JPEG, 100, fos );
fos.close();
} catch (IOException e) {
return;
}
if ( !bitmap.isRecycled() ) bitmap.recycle();
}
}
public Bitmap thumbnaileImage( File file ) {
if ( file == null || !file.exists() || !file.isFile() ) return null;
Bitmap scaleBitmap = null;
try {
BitmapFactory.Options op = new BitmapFactory.Options();
op.inJustDecodeBounds = true;
InputStream istream = new FileInputStream( file );
BitmapFactory.decodeStream( istream, null, op );
op.inSampleSize = calculateInSampleSize( op, saveSize, saveSize );
op.inJustDecodeBounds = false;
istream.close();
istream = new FileInputStream( file );
scaleBitmap = BitmapFactory.decodeStream( istream, null, op );
istream.close();
if ( scaleBitmap == null ) return null;
Matrix matrix = new Matrix();
float mag = calcMag( scaleBitmap.getWidth(), scaleBitmap.getHeight(),saveSize, saveSize );
matrix.postScale( mag, mag );
scaleBitmap = Bitmap.createBitmap( scaleBitmap, 0, 0, scaleBitmap.getWidth(), scaleBitmap.getHeight(), matrix, true);
} catch (IOException e) {
return null;
}
return scaleBitmap;
}
public float calcMag( int souX, int souY, int desX, int desY ) {
省略
}
public int calculateInSampleSize(BitmapFactory.Options op, int reqWidth, int reqHeight ) {
省略
}
public void finish() {
mItemType.clear();
mItemType = null;
mItemeNames.clear();
mItemeNames = null;
mTargetDir = null;
mCacheDir = null;
mDirectoryListAdapter = null;
}
}