2010-12-07

mediaplayerを作ってみる(10)-2

結構変更。いろんなとこを。まずは、selector。checkboxの。
この間、色々拾ってきたんで。元のcheckboxがいやだったし。
参考サイト Android Wiki* の

ボタンの画像変更(CheckBox,RadioButton)

checkbox_selector.xml


<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:state_checked="true"
android:state_pressed="true"
android:drawable="@drawable/free2you5" />
<item
android:state_checked="true"
android:drawable="@drawable/free2you1" />
<item
android:state_checked="false"
android:state_pressed="true"
android:drawable="@drawable/free2you5" />
<item
android:state_checked="false"
android:drawable="@drawable/free2you6" />
</selector>

上から

チェックされてて、押された状態
チェックされてる状態
チェックされてなくて、押された状態
チェックされていない状態

それぞれの状態のbutton(icon)を設定。
色々試した結果、32x32とxmlをdrawable-mdpiに。まあ、お好みで。
上から1番目と3番目(押された状態)は、同じ画像を使ってます。まあ、お好みで。
ほいで、style。res/valuesに。

checkbox_style.xml


<?xml version="1.0" encoding="UTF-8"?>
<resources>
<style name="custom_checkbox" parent="android:Widget.CompoundButton.CheckBox">
<item name="android:button">@drawable/checkbox_selector</item>
</style>
</resources>

で、main.xml。skipボタンの列に。skipボタンもまとめて。


<LinearLayout
     android:orientation="horizontal"
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:gravity="center_horizontal">
     <CheckBox
     android:id="@+id/repeatButton"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:textSize="16sp"
     android:text="@string/repeat_button"
     android:textColor="@color/green"
     android:layout_marginLeft="10dp"
     style="@style/custom_checkbox">
     </CheckBox>
     <CheckBox
     android:id="@+id/shuffleButton"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:textSize="16sp"
     android:text="@string/shuffle_button"
     android:textColor="@color/green"
     android:layout_marginLeft="10dp"
     style="@style/custom_checkbox">
     </CheckBox>
<Button
android:id="@+id/skipButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/skip_button"
android:onClick="onClickSkip"
android:layout_marginLeft="10dp">
</Button>
</LinearLayout>

shuffle用もまとめて追加。どうせつけるんで。
表示する文字は、まあ、お好みで。
で、こんな↓感じ。

















eclipseで、画面キャプチャ出来るとは。知りませんでした。
一応メモ。DDMS→Devices→スクリーンのキャプチャー
便利だ。それはそれとして、次はMusicDirListMaker。作り変えました。

package net.asasvata.listmaker;

import java.io.File;
import java.util.ArrayList;

public class MusicDirListMaker {
private final String FILE_SEP = File.separator;

public void musicDirListMaker(ArrayList<String> list1, ArrayList<String> list2) {

int m = 0; int n = 0;
        while (list1.size() > m) {
         File subDir = new File(list1.get(m));
         try {
        String[] subFileName = subDir.list();
        n = 0;
        while (subFileName.length > n) {
        File subFile = new File(subDir.getPath() +
FILE_SEP + subFileName[n]);
        if (subFile.isDirectory()) {
        list1.add(subDir.getPath() + FILE_SEP + subFileName[n]);
        } else if (subFile.isFile() &&
        (subFile.getName().endsWith("mp3") ||
        subFile.getName().endsWith("wav"))) {
       
        if (!list2.contains(list1.get(m))) {
        list2.add(list1.get(m));
        }
        }
        n++;
        }
         } catch (NullPointerException e) {
         }
         m++;
        }
    }
}

Exceptionは、dirListMakerと同じ理由でほったらかし。いいのだろうか。
endWith()で拡張子をみてるので、追加、削除はまあ、お好みで。
あと、voidになってます。なんとなく。MusicFileListMakerもつくりました。

package net.asasvata.listmaker;

import java.io.File;
import java.util.ArrayList;

public class MusicFileListMaker {
private final String FILE_SEP = File.separator;
public void musicFileListMaker(String name, ArrayList<String> list) {
list.clear();
     File musicFile = new File(name);
     String[] musicFileList = musicFile.list();
     for (String fileName : musicFileList) {
     File file = new File(name + FILE_SEP + fileName);
     if (file.isFile() && (fileName.endsWith("mp3") || 
            fileName.endsWith("wav"))) {
     list.add(fileName);
     }
     }
}
}

"mp3"って書くのが、面倒なんで。wavはなんとなく。要らないような気も。
あと、何気なく list.clear()。 そのうちまた変わるかも。まあ、適当に。
次は、MusicPlayer。フィールドに

private SDMediaPlayerActivity sdmp; 
private CheckBox repeatButton;

2個追加。で、コンストラクタの引数に

SDMediaPlayerActivity sdmp 追加。1つ目に。

コンストラクタの中に、

this.sdmp = sdmp; 追加。

そいで、

public void setRepeatButton(CheckBox cb) {
repeatButton = cb;
}

public void onCompletion(MediaPlayer mp) {
if (++musicNum < musicList.size()) {
playMusic();
} else {
musicNum = 0;
if (repeatButton.isChecked()) {
playMusic();
} else {
if (++dirNum < dirList.size()) {
if (dirNum - 1 == sdmp.getSpinnerPosition()) {
setSpinnerAndListView();
}
sdmp.getMflm().musicFileListMaker(dirList.get(dirNum), musicList);
playMusic();
} else {
if (dirNum - 1 == sdmp.getSpinnerPosition()) {
dirNum = 0;
setSpinnerAndListView();
}
dirNum = 0;
sdmp.getMflm().musicFileListMaker(dirList.get(dirNum), musicList);
playMusic();
}
}
}
}

//spinner表示変更
public void setSpinnerAndListView() {
sdmp.getSpinner().setSelection(dirNum);
sdmp.getMflm().musicFileListMaker(dirList.get(dirNum), sdmp.getFlfv());
listView.setAdapter(sdmp.getAdapter());
}

こんだけ追加と、変更。ほいから、Activity。
フィールド

private FileListMaker flm; 削除。
private MusicFileListMaker mflm; 追加。
private int spinnerPosition; 変更。(static削除)
private String musicDirName; 削除。
private CheckBox repeatButton; 追加。

onCreate内、

musicDirList = new ArrayList<String>(); ↓の上に追加。
mdlm.musicDirListMaker(dirList, musicDirList); 変更。(引数追加)

↓は、この位置関係で。ちょっとおかしいかもしれませんが。

//CheckBoxの取得
repeatButton = (CheckBox)findViewById(R.id.repeatButton); 追加。

//musicPlayerの生成とmusicNumの取得
musicPlayer = new MusicPlayer(this,titleView); 引数変更。
musicPlayer.setRepeatButton(repeatButton); 追加。

これも忘れず。

flm = new FileListMaker(); 削除。
mflm = new MusicFileListMaker(); 追加。

次、onItemSelected内、

musicDirName = musicDirList.get(position); 削除。

fileListForListView.clear(); 削除。

flm.fileListMaker(musicDirName, "mp3", fileListForListView); 削除。

mflm.musicFileListMaker(musicDirList.get(position), 
    fileListForListView); 追加。


if (musicFileList == null) {
     musicFileList = new ArrayList<String>();
     mflm.musicFileListMaker(musicDirList.get(position), musicFileList);
}

↑変更。そいで、結構な変更。

//戻る
public void onClickBack(View view) {
int n = musicPlayer.getMusicNum() - 1;//とりあえず減らす
if (n < 0) {
if (repeatButton.isChecked()) {
     n = musicPlayer.getMusicList().size() - 1;//最後の曲を指定
     musicPlayer.setMusicNum(n);
     if (musicPlayer.isPlaying()) musicPlayer.playMusic();
        else setTitle();
} else {
int num = musicPlayer.getDirNum() - 1;
if (num < 0) {
if (num + 1 == spinnerPosition) {
num = musicDirList.size() - 1;
setSpinnerAndListView(num);
}
num = musicDirList.size() - 1;
musicPlayer.setDirNum(num);
mflm.musicFileListMaker(musicDirList.get(num), musicFileList);
    n = musicPlayer.getMusicList().size() - 1;//最後の曲を指定
    musicPlayer.setMusicNum(n);
if (musicPlayer.isPlaying()) musicPlayer.playMusic();
    else setTitle();
} else {
if (num + 1 == spinnerPosition) {
setSpinnerAndListView(num);
}
musicPlayer.setDirNum(num);
mflm.musicFileListMaker(musicDirList.get(num), musicFileList);
    n = musicPlayer.getMusicList().size() - 1;//最後の曲を指定
    musicPlayer.setMusicNum(n);
if (musicPlayer.isPlaying()) musicPlayer.playMusic();
    else setTitle();
}
}
} else {
musicPlayer.setMusicNum(n);
if (musicPlayer.isPlaying()) musicPlayer.playMusic();
else setTitle();
}
}
//進む
public void onClickNext(View view) {
int n = musicPlayer.getMusicNum() + 1;//とりあえず増やす。
if (n < musicPlayer.getMusicList().size()) {
musicPlayer.setMusicNum(n);
if (musicPlayer.isPlaying()) musicPlayer.playMusic();
   else setTitle();
} else {
n = 0;//1曲目を指定
musicPlayer.setMusicNum(n);
if (repeatButton.isChecked()){
     if (musicPlayer.isPlaying()) musicPlayer.playMusic();
     else setTitle();
} else {
int num = musicPlayer.getDirNum() + 1;
if (num < musicDirList.size()) {
if (num - 1 == spinnerPosition) {
setSpinnerAndListView(num);
}
musicPlayer.setDirNum(num);
mflm.musicFileListMaker(musicDirList.get(num), musicFileList);
if (musicPlayer.isPlaying()) musicPlayer.playMusic();
    else setTitle();
} else {
if (num - 1 == spinnerPosition) {
num = 0;
setSpinnerAndListView(num);
}
num = 0;
musicPlayer.setDirNum(num);
mflm.musicFileListMaker(musicDirList.get(num), musicFileList);
if (musicPlayer.isPlaying()) musicPlayer.playMusic();
    else setTitle();
}
}
}
}

次は、地味に変更。

public int getSpinnerPosition() {
    return spinnerPosition;
}

staticを外しただけ。も一つ地味に。setAndPlayMusic内、

if (spinnerPosition != musicPlayer.getDirNum()) {
mflm.musicFileListMaker(musicDirList.get(spinnerPosition), musicFileList);
musicPlayer.setDirNum(spinnerPosition);
}

最後に、

private void setSpinnerAndListView(int num) {
spinner.setSelection(num);
mflm.musicFileListMaker(musicDirList.get(num), fileListForListView);
listView.setAdapter(listAdapter);
}

追加。たぶん、これだけ。
次は、shuffle。ボタンもつけたし。

0 件のコメント:

コメントを投稿