LevelListDrawableの使い方を説明します。
LevelListDrawableは「画像」と「範囲」の組をリスト化し設定した値が含まれる「範囲」の「画像」を表示します。
使いどころは、特定の条件によって画像を切り替える必要がある場合です。
例は「キャラクターのレベルによって画像を変えたい」や「状態によってい画像を変えたい」などなど.
上記の例ではImageView#setImageResourceで設定をすることもできますが、Javaコード内にif文が大量に記述されるため可読性が低下します。
xmlで設定する属性は下記の3つです。
- drawable:表示する画像
- maxLevel:上限レベル
- minLevel:下限レベル
今回はサンプルとして下記の仕様を持ったコードを作成しました。
- LevelListDrawableを使って表示する。
- Seekbarのつまみを移動させ、位置によって画像を変更する。
- Seekbarのprogressは0~99に設定
- 画像は5枚あり、progressの値を0~19/20~39/40~59/60~79/80~99の5個の範囲で分ける。
- 現在のprogressを表示する。
<?xml version="1.0" encoding="utf-8"?>
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:drawable="@android:drawable/ic_dialog_alert"
android:maxLevel="19"
android:minLevel="0" />
<item
android:drawable="@android:drawable/ic_dialog_dialer"
android:maxLevel="39"
android:minLevel="20" />
<item
android:drawable="@android:drawable/ic_dialog_email"
android:maxLevel="59"
android:minLevel="40" />
<item
android:drawable="@android:drawable/ic_dialog_info"
android:maxLevel="79"
android:minLevel="60" />
<item
android:drawable="@android:drawable/ic_dialog_map"
android:maxLevel="99"
android:minLevel="80" />
</level-list>
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout linearLayout = new LinearLayout(this);
linearLayout.setOrientation(LinearLayout.VERTICAL);
linearLayout.setBackgroundColor(Color.BLACK);
linearLayout.setGravity(Gravity.CENTER_HORIZONTAL);
//SeekBarを使ってLevelListDrawableのLevelを変更する。
SeekBar seekBar = new SeekBar(this);
seekBar.setMax(100);
//LevelListDrawableを表示するImageView
final ImageView imageView = new ImageView(this);
imageView.setLayoutParams(new ViewGroup.LayoutParams(500,500));
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
//LevelListDrawableを設定する
imageView.setImageResource(R.drawable.level_list);
//現在のLevelを表示するTextView
final TextView nowLevel = new TextView(this);
nowLevel.setTextColor(Color.RED);
nowLevel.setTextSize(30);
nowLevel.setText("level:0");
linearLayout.addView(imageView);
linearLayout.addView(seekBar);
linearLayout.addView(nowLevel);
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
//SeekBarのprogressをそのままLevelListDrawableのLevelに設定する。
LevelListDrawable drawable = (LevelListDrawable) imageView.getDrawable();
drawable.setLevel(progress);
//現在のLevelを表示する。
nowLevel.setText("Level:" + progress);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
setContentView(linearLayout);
}
}