1 package mhr.appandroid.views;
3 import java.text.DecimalFormat;
5 import mhr.appandroid.R;
6 import android.content.Context;
7 import android.content.res.TypedArray;
8 import android.graphics.drawable.Drawable;
9 import android.util.AttributeSet;
10 import android.view.View;
11 import android.widget.EditText;
12 import android.widget.LinearLayout;
13 import android.widget.SeekBar;
14 import android.widget.SeekBar.OnSeekBarChangeListener;
15 import android.widget.TextView;
17 public class LabelledSeekBar extends LinearLayout implements OnSeekBarChangeListener {
41 valueSB.setProgress(Math.round((v -
min) / factor));
52 baseFactor = factor /
base;
64 valueSB.setProgress((
int) Math.round(
count * (Math.log((v + baseFactor -
min) / baseFactor) / Math.log(
base))));
85 protected float min = 0;
86 protected float max = 100;
93 protected DecimalFormat
format =
new DecimalFormat(
"#.##");
104 setGravity(0x03 | 0x10);
105 labelTV =
new TextView(getContext());
106 valueTV =
new EditText(getContext());
107 valueTV.setBackgroundDrawable(null);
108 valueTV.setPadding(0, 0, 0, 0);
110 valueTV.setOnFocusChangeListener(
new OnFocusChangeListener() {
113 public void onFocusChange(View v,
boolean hasFocus) {
115 String str =
valueTV.getText().toString();
118 if (!str.equals(orig)) {
120 float d = Float.parseFloat(str);
122 }
catch (NumberFormatException e) {
132 valueSB =
new SeekBar(getContext());
134 valueSB.setLayoutParams(
new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
135 valueSB.setOnSeekBarChangeListener(
this);
144 protected void initView(Context context, AttributeSet attrs) {
146 TypedArray a = context.getTheme().obtainStyledAttributes(attrs,
R.styleable.LabelledSeekBar, 0, 0);
148 switch (a.getInt(
R.styleable.LabelledSeekBar_Scale, 0)) {
156 format =
new DecimalFormat(a.getString(
R.styleable.LabelledSeekBar_ValueStringFormat));
158 setParams(a.getFloat(
R.styleable.LabelledSeekBar_Min,
min), a.getFloat(
R.styleable.LabelledSeekBar_Max,
max), a.getFloat(
R.styleable.LabelledSeekBar_Count,
count),
159 a.getFloat(
R.styleable.LabelledSeekBar_ExpBase,
base));
161 labelTV.setTextAppearance(getContext(), a.getResourceId(
R.styleable.LabelledSeekBar_TextAppearance, 0));
162 labelTV.setWidth((
int) a.getDimension(
R.styleable.LabelledSeekBar_LabelWidth, 0));
163 labelTV.setText(a.getString(
R.styleable.LabelledSeekBar_Label));
165 valueTV.setTextAppearance(getContext(), a.getResourceId(
R.styleable.LabelledSeekBar_TextAppearance, 0));
166 valueTV.setWidth((
int) a.getDimension(
R.styleable.LabelledSeekBar_ValueWidth, 0));
168 valueSB.setProgressDrawable(a.getDrawable(
R.styleable.LabelledSeekBar_ProgressDrawable));
169 valueSB.setThumb(a.getDrawable(
R.styleable.LabelledSeekBar_ScrubberDrawable));
185 super(context, attrs);
191 super(context, attrs, defStyle);
209 progress = (progress < min) ? min : (progress >
max) ?
max : progress;
214 this.count = Math.round(count);
252 this.format =
new DecimalFormat(format);
256 labelTV.setTextAppearance(getContext(), resId);
257 valueTV.setTextAppearance(getContext(), resId);
261 valueSB.setProgressDrawable(dr);