From 9a569169da45745d1acc424925a9cec9e0bd756a Mon Sep 17 00:00:00 2001 From: lihongwei Date: Thu, 19 Sep 2024 18:17:55 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=BF=9B=E5=BA=A6=E6=9D=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../player/helper/CircularProgressBar.java | 102 ++++++++++++++++++ .../player/ui/fragmnt/AHomeFragment.java | 44 +------- app/src/main/res/layout/activity_ahome.xml | 16 +-- 3 files changed, 108 insertions(+), 54 deletions(-) create mode 100644 app/src/main/java/com/hi/music/player/helper/CircularProgressBar.java diff --git a/app/src/main/java/com/hi/music/player/helper/CircularProgressBar.java b/app/src/main/java/com/hi/music/player/helper/CircularProgressBar.java new file mode 100644 index 0000000..e824383 --- /dev/null +++ b/app/src/main/java/com/hi/music/player/helper/CircularProgressBar.java @@ -0,0 +1,102 @@ +package com.hi.music.player.helper; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.util.AttributeSet; +import android.view.View; + +public class CircularProgressBar extends View { + private Paint progressPaint; + private Paint backgroundPaint; + private float progress = 0; + private float maxProgress = 100; + + private int fixedSize = 47; // 固定圆环的直径(dp) + private int progressWidth = 5; // 固定进度条宽度(dp) + + public CircularProgressBar(Context context) { + super(context); + init(); + } + + public CircularProgressBar(Context context, AttributeSet attrs) { + super(context, attrs); + init(); + } + + public CircularProgressBar(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + init(); + } + + private void init() { + // 初始化用于绘制进度条的画笔 + progressPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + progressPaint.setStyle(Paint.Style.STROKE); + progressPaint.setStrokeWidth(dpToPx(progressWidth)); // 设置进度条宽度(10dp) + progressPaint.setColor(Color.WHITE); // 设置进度条颜色为白色 + + // 初始化用于绘制背景环的画笔 + backgroundPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + backgroundPaint.setStyle(Paint.Style.STROKE); + backgroundPaint.setStrokeWidth(dpToPx(progressWidth)); + backgroundPaint.setColor(Color.GRAY); // 设置背景环颜色为灰色 + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + // Convert dp to pixels + int diameterPx = dpToPx(fixedSize); + int size = diameterPx + dpToPx(progressWidth) * 2; + setMeasuredDimension(size, size); + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + + // 获取视图中心坐标 + float centerX = getWidth() / 2f; + float centerY = getHeight() / 2f; + + // 固定圆环的半径 + float radius = (Math.min(getWidth(), getHeight()) - dpToPx(progressWidth)) / 2f; + + // 绘制背景环 + canvas.drawCircle(centerX, centerY, radius, backgroundPaint); + + // 计算进度条的起始角度和扫过的角度 + float startAngle = -90f; // 从顶部开始 + float sweepAngle = 360f * progress / maxProgress; // 根据进度计算扫过的角度 + // 绘制进度条 + canvas.drawArc( + centerX - radius, // 左上角 X 坐标 + centerY - radius, // 左上角 Y 坐标 + centerX + radius, // 右下角 X 坐标 + centerY + radius, // 右下角 Y 坐标 + startAngle, // 起始角度 + sweepAngle, // 扫过的角度 + false, // 是否使用扇形 + progressPaint // 使用的画笔 + ); + } + + public void setProgress(float progress) { + this.progress = Math.max(0, Math.min(progress, maxProgress)); // 限制进度值在 0 到 maxProgress 之间 + invalidate(); // 请求重新绘制视图 + } + + public void setMaxProgress(float maxProgress) { + this.maxProgress = maxProgress; + this.progress = Math.max(0, Math.min(this.progress, maxProgress)); // 调整当前进度值以适应新的最大值 + invalidate(); // 请求重新绘制视图 + } + + // 将 dp 转换为 px + private int dpToPx(int dp) { + float density = getResources().getDisplayMetrics().density; + return Math.round(dp * density); // 将 dp 值乘以屏幕密度转换为 px + } +} diff --git a/app/src/main/java/com/hi/music/player/ui/fragmnt/AHomeFragment.java b/app/src/main/java/com/hi/music/player/ui/fragmnt/AHomeFragment.java index bdc0001..e0e502a 100644 --- a/app/src/main/java/com/hi/music/player/ui/fragmnt/AHomeFragment.java +++ b/app/src/main/java/com/hi/music/player/ui/fragmnt/AHomeFragment.java @@ -10,52 +10,10 @@ import android.view.ViewGroup; import com.hi.music.player.R; -/** - * A simple {@link Fragment} subclass. - * Use the {@link AHomeFragment#newInstance} factory method to - * create an instance of this fragment. - */ + public class AHomeFragment extends Fragment { - // TODO: Rename parameter arguments, choose names that match - // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER - private static final String ARG_PARAM1 = "param1"; - private static final String ARG_PARAM2 = "param2"; - // TODO: Rename and change types of parameters - private String mParam1; - private String mParam2; - - public AHomeFragment() { - // Required empty public constructor - } - - /** - * Use this factory method to create a new instance of - * this fragment using the provided parameters. - * - * @param param1 Parameter 1. - * @param param2 Parameter 2. - * @return A new instance of fragment AHomeFragment. - */ - // TODO: Rename and change types and number of parameters - public static AHomeFragment newInstance(String param1, String param2) { - AHomeFragment fragment = new AHomeFragment(); - Bundle args = new Bundle(); - args.putString(ARG_PARAM1, param1); - args.putString(ARG_PARAM2, param2); - fragment.setArguments(args); - return fragment; - } - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - if (getArguments() != null) { - mParam1 = getArguments().getString(ARG_PARAM1); - mParam2 = getArguments().getString(ARG_PARAM2); - } - } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, diff --git a/app/src/main/res/layout/activity_ahome.xml b/app/src/main/res/layout/activity_ahome.xml index 5a9d5eb..4f9ca99 100644 --- a/app/src/main/res/layout/activity_ahome.xml +++ b/app/src/main/res/layout/activity_ahome.xml @@ -45,17 +45,12 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> - - + + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center"/> -