【Android】使用TimePickerDialog和SeekBar获取用户选择的起始时间和持续时间使用Canvas绘制图形表示时间段的分布

要实现Android上的24小时有效时间段分布图并精确到秒,可以使用TimePickerDialogSeekBar来获取用户选择的起始时间和持续时间。然后,使用Canvas绘制图形来表示时间段的分布。

以下是实现该功能的示例代码:

  1. 在布局文件(例如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" />
  1. 在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);
    }
}
  1. 创建一个名为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;
    }
}

注意:以上代码仅实现了时间段分布图的绘制和显示,如果需要将图形保存到文件或其他操作,需要根据实际需求进行扩展。

猜你喜欢

转载自blog.csdn.net/gao511147456/article/details/131349469
今日推荐