要实现Android上的24小时有效时间段分布图并精确到秒,可以使用TimePickerDialog
和SeekBar
来获取用户选择的起始时间和持续时间。然后,使用Canvas绘制图形来表示时间段的分布。
以下是实现该功能的示例代码:
- 在布局文件(例如
activity_main.xml
)中添加一个Button
和一个TextView
来显示用户选择的时间段:
<Button
android:id="@+id/btn_select_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Select Time" />
<TextView
android:id="@+id/tv_selected_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="Selected Time: "
android:textSize="18sp" />
- 在Activity的Java代码中,添加以下代码来实现时间选择和时间段分布图的绘制:
import android.app.TimePickerDialog;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.TimePicker;
import androidx.appcompat.app.AppCompatActivity;
import java.util.Calendar;
public class MainActivity extends AppCompatActivity {
private Button btnSelectTime;
private TextView tvSelectedTime;
private int startHour, startMinute, duration;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnSelectTime = findViewById(R.id.btn_select_time);
tvSelectedTime = findViewById(R.id.tv_selected_time);
btnSelectTime.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showTimePickerDialog();
}
});
}
private void showTimePickerDialog() {
Calendar currentTime = Calendar.getInstance();
int hour = currentTime.get(Calendar.HOUR_OF_DAY);
int minute = currentTime.get(Calendar.MINUTE);
TimePickerDialog timePickerDialog = new TimePickerDialog(this,
new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
startHour = hourOfDay;
startMinute = minute;
showSeekBarDialog();
}
}, hour, minute, true);
timePickerDialog.show();
}
private void showSeekBarDialog() {
final int MAX_DURATION = 86400; // 24 hours in seconds
SeekBarDialog seekBarDialog = new SeekBarDialog(this);
seekBarDialog.setMax(MAX_DURATION);
seekBarDialog.setSeekBarChangeListener(new SeekBarDialog.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(int progress) {
duration = progress;
drawTimeDistribution();
}
});
seekBarDialog.show();
}
private void drawTimeDistribution() {
// 获取绘制时间段分布图的Canvas
// 可以是一个ImageView或其他支持绘图的View
// 这里假设使用一个名为"canvasView"的自定义View
Canvas canvas = canvasView.getCanvas();
// 清空画布
canvas.drawColor(Color.WHITE);
// 绘制时间段分布图
int startX = 0;
int startY = 0;
int endX = canvas.getWidth();
int endY = canvas.getHeight();
Paint paint = new Paint();
paint.setColor(Color.GREEN);
paint.setStyle(Paint.Style.FILL);
// 计算起始时间的秒数
int startSeconds = startHour * 3600 + startMinute * 60;
// 计算持续时间的秒数
int durationSeconds = duration;
// 计算终止时间的秒数
int endSeconds = startSeconds + durationSeconds;
// 绘制时间段矩形
canvas.drawRect(startX, startY, endX, endY, paint);
// 更新显示选择的时间段
int endHour = endSeconds / 3600;
int endMinute = (endSeconds % 3600) / 60;
String selectedTime = String.format("%02d:%02d - %02d:%02d",
startHour, startMinute, endHour, endMinute);
tvSelectedTime.setText("Selected Time: " + selectedTime);
}
}
- 创建一个名为
SeekBarDialog
的自定义对话框类,用于显示一个SeekBar
来让用户选择持续时间:
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.SeekBar;
public class SeekBarDialog extends Dialog {
private SeekBar seekBar;
private OnSeekBarChangeListener seekBarChangeListener;
public SeekBarDialog(Context context) {
super(context);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT
);
seekBar = new SeekBar(getContext());
seekBar.setLayoutParams(layoutParams);
seekBar.setMax(86400); // 24 hours in seconds
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (seekBarChangeListener != null) {
seekBarChangeListener.onProgressChanged(progress);
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
LinearLayout layout = new LinearLayout(getContext());
layout.setOrientation(LinearLayout.VERTICAL);
layout.addView(seekBar);
setContentView(layout);
}
public interface OnSeekBarChangeListener {
void onProgressChanged(int progress);
}
public void setSeekBarChangeListener(OnSeekBarChangeListener listener) {
this.seekBarChangeListener = listener;
}
}
注意:以上代码仅实现了时间段分布图的绘制和显示,如果需要将图形保存到文件或其他操作,需要根据实际需求进行扩展。