android自定义view写一个时间刻度尺
时间: 2024-05-14 13:12:11 浏览: 18
时间刻度尺是一个常见的自定义view,用于显示时间或者长度的刻度。下面是一个简单的时间刻度尺的实现代码:
```java
public class TimeRulerView extends View {
private int mWidth;
private int mHeight;
private int mPaddingLeft;
private int mPaddingRight;
private int mPaddingTop;
private int mPaddingBottom;
private int mTickWidth;
private int mTickHeight;
private int mTickGap;
private int mTickColor;
private int mLabelColor;
private int mLabelTextSize;
private int mMinValue;
private int mMaxValue;
private int mValue;
private OnValueChangeListener mListener;
public TimeRulerView(Context context) {
this(context, null);
}
public TimeRulerView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public TimeRulerView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.TimeRulerView);
mTickWidth = ta.getDimensionPixelSize(R.styleable.TimeRulerView_tickWidth, dp2px(1));
mTickHeight = ta.getDimensionPixelSize(R.styleable.TimeRulerView_tickHeight, dp2px(10));
mTickGap = ta.getDimensionPixelSize(R.styleable.TimeRulerView_tickGap, dp2px(10));
mTickColor = ta.getColor(R.styleable.TimeRulerView_tickColor, Color.BLACK);
mLabelColor = ta.getColor(R.styleable.TimeRulerView_labelColor, Color.BLACK);
mLabelTextSize = ta.getDimensionPixelSize(R.styleable.TimeRulerView_labelTextSize, sp2px(12));
mMinValue = ta.getInt(R.styleable.TimeRulerView_minValue, 0);
mMaxValue = ta.getInt(R.styleable.TimeRulerView_maxValue, 24);
mValue = ta.getInt(R.styleable.TimeRulerView_value, 0);
ta.recycle();
}
public void setValue(int value) {
if (value < mMinValue) {
value = mMinValue;
} else if (value > mMaxValue) {
value = mMaxValue;
}
if (value != mValue) {
mValue = value;
invalidate();
if (mListener != null) {
mListener.onValueChange(mValue);
}
}
}
public void setOnValueChangeListener(OnValueChangeListener listener) {
mListener = listener;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
mWidth = MeasureSpec.getSize(widthMeasureSpec);
mHeight = MeasureSpec.getSize(heightMeasureSpec);
mPaddingLeft = getPaddingLeft();
mPaddingRight = getPaddingRight();
mPaddingTop = getPaddingTop();
mPaddingBottom = getPaddingBottom();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.save();
canvas.translate(mPaddingLeft, mPaddingTop);
drawTicks(canvas);
drawLabels(canvas);
canvas.restore();
}
private void drawTicks(Canvas canvas) {
Paint paint = new Paint();
paint.setColor(mTickColor);
paint.setStrokeWidth(mTickWidth);
for (int i = mMinValue; i <= mMaxValue; i++) {
int x = i * mTickGap;
int y1 = 0;
int y2 = mTickHeight;
canvas.drawLine(x, y1, x, y2, paint);
}
}
private void drawLabels(Canvas canvas) {
Paint paint = new Paint();
paint.setColor(mLabelColor);
paint.setTextSize(mLabelTextSize);
paint.setTextAlign(Paint.Align.CENTER);
Paint.FontMetrics fm = paint.getFontMetrics();
int baseline = (int) ((mTickHeight + fm.bottom - fm.top) / 2 - fm.bottom);
for (int i = mMinValue; i <= mMaxValue; i++) {
int x = i * mTickGap;
String text = String.valueOf(i);
canvas.drawText(text, x, mTickHeight + baseline + dp2px(5), paint);
}
}
private int dp2px(float dpValue) {
float scale = getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
private int sp2px(float spValue) {
float scale = getResources().getDisplayMetrics().scaledDensity;
return (int) (spValue * scale + 0.5f);
}
public interface OnValueChangeListener {
void onValueChange(int value);
}
}
```
上面的代码中,我们定义了一些自定义属性,如刻度线的宽度、高度、间距、颜色,标签的颜色、大小等。在onDraw方法中,我们先绘制刻度线,再绘制标签。在setValue方法中,我们检查输入值是否超出范围,并且通知监听器更新值。
在布局文件中,我们可以这样使用:
```xml
<com.example.timeruler.TimeRulerView
android:id="@+id/time_ruler"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:tickWidth="1dp"
app:tickHeight="10dp"
app:tickGap="10dp"
app:tickColor="#000000"
app:labelColor="#000000"
app:labelTextSize="12sp"
app:minValue="0"
app:maxValue="24"
app:value="0"/>
```
最后,我们可以在Activity中设置监听器,获取时间刻度尺的值:
```java
TimeRulerView timeRuler = findViewById(R.id.time_ruler);
timeRuler.setOnValueChangeListener(new TimeRulerView.OnValueChangeListener() {
@Override
public void onValueChange(int value) {
Log.d("TimeRulerView", "Value changed: " + value);
}
});
```
这样,我们就实现了一个简单的时间刻度尺。