エンジニア未満がエンジニア以上を目指す日々(仮)

戦力外通告の悔しさをバネに自身の技術力向上を目指した技術ブログ

ランダム画像表示機能 - 壁紙変更アプリ (13)

ディレクトリ内の画像をランダムで壁紙に設定する機能を追加してみます。
具体的には、ディレクトリ選択すると画像ファイル一覧を取得して、
そこからランダムで壁紙を設定する。かな。

MainActivity のボタン押下から、ランダム用の Activity を起こします。
まずは、layout を変更してボタンの text と id を変更します。

f:id:hielf:20140907132703p:plain:w300

そして、MainActivity を修正します。

            case R.id.Button_Random:
                Intent intentRandom = new Intent(MainActivity.this, SubActivityRandom.class);
                startActivity(intentRandom);
                break;

で、元々使っていた画像選択の SubActivity をコピーして SubActivityRandom を追加。
これで Random ボタンを押すと、元々の SubActivity と同じ動作をするはず。
…エラーでました。。

f:id:hielf:20140907132720p:plain:w300

あ、AndroidManifest の修正忘れてた。
結構忘れやすいので気をつけねば。

        <activity
            android:name=".SubActivityRandom"
            android:label="Wallpaper changer random">
        </activity>

これで、元々の SubActivity と同じ動作が出来るようになりました。
今度は SubActivityRandom を修正していきます。

と、その前に layout でボタンを追加します。

f:id:hielf:20140907132744p:plain:w300

ボタンを押されると、カレントディレクトリの画像ファイルリストから、
ランダムに壁紙設定するようにします。

ディレクトリを選択する辺りは画像選択の SubActivity と同じです。
ただ、ファイルを選択するわけではないので、ファイルは非表示にします。

    /**
     * Crate file list
     */
    private void createFileList() {
        if (!curPath.equals("/")) {
            item_list.add("..");
        }
        if (files != null) {
            for (int i = 0; i < files.length; i++) {
                if(files[i].isDirectory()) {
                    item_list.add(files[i].getName());
                }
            }
        }
    }

次に、ボタンを押された際に処理するため、
setOnClickListener を登録して匿名クラスで実装します。
ボタンを押されると、画像ファイルのみのリストを作成し、
Random を使用して選択します。

        Button button;
        button = (Button) findViewById(R.id.Button_SetDirectory);
        button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                Log.v(TAG, "curPath = " + curPath);
                item_list_random.clear();
                createFileListForRandom();
                int random_choose = item_list_random.size();
                Log.v(TAG, "random_choose = " + random_choose);

                Random random = new Random();
                int random_position = random.nextInt(random_choose) - 1;

                File curFile = new File(curPath, item_list_random.get(random_position));
                bmpImageFile = BitmapFactory.decodeFile(curFile.toString());

                //Bitmap resizeBmp = Bitmap.createScaledBitmap(bmpImageFile, 1920, 1200, true);
                try {
                    mWM.setBitmap(bmpImageFile);
                    mWM.suggestDesiredDimensions(1200, 1920);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                finish();
            }
        });
    }
    private void createFileListForRandom() {
        if (files != null) {
            for (int i = 0; i < files.length; i++) {
                if(files[i].isDirectory()) {
                    // Nothing to do
                    // item_list.add(files[i].getName());
                } else {
                    String fileName = files[i].getName();
                    for (int n = 0; n < permExte.length; n++) {
                        if (fileName.substring(fileName.lastIndexOf(".") + 1).equals(permExte[n])) {
                            item_list_random.add(fileName);
                            break;
                        }
                    }
                }
            }
        }
    }

で、実際に動作させるとこんな感じ。

f:id:hielf:20140907132809p:plain:w300
f:id:hielf:20140907132821p:plain:w300
f:id:hielf:20140907132836p:plain:w300

一応、ランダムで表示されているようですが、
・リストが下詰で表示される
・画像ファイルが出てこないので、Set を押す場所がわからない
・そもそもカレントディレクトリがどこかわからない
と、色々いまいちですね。

次回はこの辺りを修正します。