1、android 自定义进度条 分三块 每块颜色不同
要实现这个功能,您可以考虑自定义一个 View,然后在 View 中绘制三个矩形,每个矩形对应一个进度块,再根据进度的大小来确定每个矩形的宽度。
下面是一个简单的示例代码,可以根据自己的需求进行修改:
public class CustomProgressBar extends View {
private Paint mPaint1, mPaint2, mPaint3; // 三个画笔,对应三个进度块的颜色
private int mWidth, mHeight; // View 的宽度和高度
private float mProgress1, mProgress2, mProgress3; // 三个进度块的进度值,取值范围为 0-1
public CustomProgressBar(Context context) {
super(context);
init();
}
public CustomProgressBar(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public CustomProgressBar(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
// 初始化三个画笔,分别设置对应的颜色
mPaint1 = new Paint();
mPaint1.setColor(Color.RED);
mPaint2 = new Paint();
mPaint2.setColor(Color.YELLOW);
mPaint3 = new Paint();
mPaint3.setColor(Color.GREEN);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
// 获取 View 的宽度和高度
mWidth = w;
mHeight = h;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 计算每个进度块的宽度
float width1 = mWidth / 3 * mProgress1;
float width2 = mWidth / 3 * mProgress2;
float width3 = mWidth / 3 * mProgress3;
// 绘制三个矩形
canvas.drawRect(0, 0, width1, mHeight, mPaint1);
canvas.drawRect(width1, 0, width1 + width2, mHeight, mPaint2);
canvas.drawRect(width1 + width2, 0, mWidth, mHeight, mPaint3);
}
// 设置三个进度块的进度值
public void setProgress(float progress1, float progress2, float progress3) {
mProgress1 = progress1;
mProgress2 = progress2;
mProgress3 = progress3;
invalidate(); // 刷新 View
}
}
使用时,可以通过 setProgress() 方法设置进度值,例如:
CustomProgressBar progressBar = findViewById(R.id.progress_bar);
progressBar.setProgress(0.3f, 0.5f, 0.7f);
这将会让进度条的第一个进度块占据整个 View 的三分之一,第二个进度块占据整个 View 的三分之二,第三个进度块占据整个 View 的全部。
这里根据你要的进度已经可以用这个代码,但是呢,哪有那么简单的需求。。。
2、Android 自定义进度条 3个不同颜色的模块 根据音乐的进度
要实现根据音乐进度动态更新自定义进度条的功能,可以在 View 中添加一个公开的 setProgress() 方法,通过这个方法更新进度值并刷新界面。在 onDraw() 方法中,根据当前的进度值来计算每个进度块的宽度,并绘制不同颜色的矩形。
下面是一个示例代码,可以根据自己的需求进行修改
public class MusicProgressBar extends View {
private Paint mPaint1, mPaint2, mPaint3; // 三个画笔,对应三个进度块的颜色
private int mWidth, mHeight; // View 的宽度和高度
private float mProgress1, mProgress2, mProgress3; // 三个进度块的进度值,取值范围为 0-1
public MusicProgressBar(Context context) {
super(context);
init();
}
public MusicProgressBar(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public MusicProgressBar(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
// 初始化三个画笔,分别设置对应的颜色
mPaint1 = new Paint();
mPaint1.setColor(Color.RED);
mPaint2 = new Paint();
mPaint2.setColor(Color.YELLOW);
mPaint3 = new Paint();
mPaint3.setColor(Color.GREEN);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
// 获取 View 的宽度和高度
mWidth = w;
mHeight = h;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 计算每个进度块的宽度
float width1 = mWidth / 3 * mProgress1;
float width2 = mWidth / 3 * mProgress2;
float width3 = mWidth / 3 * mProgress3;
// 绘制三个矩形
canvas.drawRect(0, 0, width1, mHeight, mPaint1);
canvas.drawRect(width1, 0, width1 + width2, mHeight, mPaint2);
canvas.drawRect(width1 + width2, 0, mWidth, mHeight, mPaint3);
}
// 设置音乐播放进度,根据进度值计算并更新进度条的三个块的长度
public void setProgress(int progress, int total) {
float ratio = (float) progress / (float) total; // 计算进度比例
if (ratio < 0.33f) {
mProgress1 = ratio / 0.33f;
mProgress2 = 0;
mProgress3 = 0;
} else if (ratio < 0.67f) {
mProgress1 = 1;
mProgress2 = (ratio - 0.33f) / 0.34f;
mProgress3 = 0;
} else {
mProgress1 = 1;
mProgress2 = 1;
mProgress3 = (ratio - 0.67f) / 0.33f;
}
// 刷新界面
invalidate();
}
}
在 Activity 中,可以使用定时器来定时更新进度条的进度,例如每隔 100 毫秒更新一次:
public class MainActivity extends AppCompatActivity {
private MusicProgressBar mProgressBar;
private Timer mTimer;
private int mProgress;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mProgressBar = findViewById(R.id.progress_bar);
// 启动定时器,每隔 100 毫秒更新进度条的进度
mTimer = new Timer();
mTimer.schedule(new TimerTask() {
@Override
public void run() {
mProgressBar.setProgress(mProgress++, 100);
if (mProgress > 100) {
mProgress = 0;
}
}
}, 0, 100);
}
@Override
protected void onDestroy() {
super.onDestroy();
// 取消定时器
mTimer.cancel();
}
}
能用吗?不清楚啊,但是明显不是我想要的,起码暂停开始要一致吧,再改吧
3、android 写一个音乐进度条,要求3个模块,每个模块颜色不一样,根据音乐的开始进度条开始,音乐暂停进度条就暂停
首先,我们可以自定义一个 View,例如名为 MusicProgressBar。在这个 View 中,我们可以使用三个矩形来表示进度条的三个模块,然后根据当前进度的比例,来计算每个模块的长度和颜色。
以下是 MusicProgressBar 的简单实现:
public class MusicProgressBar extends View {
// 进度条的三个模块颜色
private int mColor1 = Color.parseColor("#66CCFF");
private int mColor2 = Color.parseColor("#FFBB33");
private int mColor3 = Color.parseColor("#FF4444");
// 进度条的三个模块长度
private float mProgress1 = 0f;
private float mProgress2 = 0f;
private float mProgress3 = 0f;
public MusicProgressBar(Context context) {
super(context);
}
public MusicProgressBar(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MusicProgressBar(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 获取 View 的宽度和高度
int width = getWidth();
int height = getHeight();
// 绘制进度条的三个模块
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setStyle(Paint.Style.FILL);
// 绘制第一个模块
paint.setColor(mColor1);
canvas.drawRect(0, 0, mProgress1 * width, height, paint);
// 绘制第二个模块
paint.setColor(mColor2);
canvas.drawRect(mProgress1 * width, 0, (mProgress1 + mProgress2) * width, height, paint);
// 绘制第三个模块
paint.setColor(mColor3);
canvas.drawRect((mProgress1 + mProgress2) * width, 0, width, height, paint);
}
/**
* 设置进度条的进度
*
* @param progress 进度,范围为 [0, 100]
* @param duration 音乐的总时长,单位为毫秒
*/
public void setProgress(int progress, long duration) {
// 计算进度的比例
float ratio = (float) progress / 100f;
// 计算每个模块的长度和颜色
if (ratio <= 0.33f) {
mProgress1 = ratio / 0.33f;
mProgress2 = 0f;
mProgress3 = 0f;
} else if (ratio <= 0.67f) {
mProgress1 = 1f;
mProgress2 = (ratio - 0.33f) / 0.34f;
mProgress3 = 0f;
} else {
mProgress1 = 1f;
mProgress2 = 1f;
mProgress3 = (ratio - 0.67f) / 0.33f;
}
// 刷新界
postInvalidate();
}
}
在代码中,我们通过三个变量 mProgress1、mProgress2 和 mProgress3 来记录每个模块的长度,然后在 setProgress 方法中,根据当前进度的比例来计算每个模块的长度和颜色。
比如,当进度为 50% 时,我们可以将第一个模块的长度设置为 1,第二个模块的长度设置为 0.5,第三个模块的长度设置为 0,然后绘制出对应颜色的矩形即可。
如果你想让进度条跟随音乐播放进度更新,可以在 Activity 或 Fragment 中使用 Handler 定时更新进度条的进度,例如每 100 毫秒更新一次。具体实现可以参考以下代码:
private Handler mHandler = new Handler();
private Runnable mUpdateProgressRunnable = new Runnable() {
@Override
public void run() {
// 更新进度条的进度
int progress = getMusicProgress();
mMusicProgressBar.setProgress(progress, mMusicDuration);
// 继续定时更新进度条的进度
mHandler.postDelayed(this, 100);
}
};
// 获取音乐的播放进度
private int getMusicProgress() {
// TODO: 实现获取音乐播放进度的逻辑
return 0;
}
// 开始更新进度条的进度
private void startUpdateProgress() {
mHandler.post(mUpdateProgressRunnable);
}
// 停止更新进度条的进度
private void stopUpdateProgress() {
mHandler.removeCallbacks(mUpdateProgressRunnable);
}
在代码中,我们使用一个名为 mUpdateProgressRunnable 的 Runnable 来定时更新进度条的进度,然后在 getMusicProgress 方法中实现获取音乐播放进度的逻辑。在 Activity 或 Fragment 中,你可以在 onStart 方法中调用 startUpdateProgress 方法开始更新进度条的进度,在 onStop 方法中调用 stopUpdateProgress 方法停止更新进度条的进度。
最后,在布局文件中,我们可以使用自定义的 MusicProgressBar 控件来展示音乐进度条。以下是一个简单的布局文件示例:
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- 音乐进度条 -->
<com.example.MusicProgressBar
android:id="@+id/music_progress_bar"
android:layout_width="match_parent"
android:layout_height="10dp"
android:layout_centerVertical="true"
android:paddingLeft="10dp"
android:paddingRight="10dp" />
<!-- 播放按钮 -->
<ImageButton
android:id="@+id/play_button"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:background="@android:color/transparent"
android:src="@drawable/ic_play" />
</RelativeLayout>
在布局文件中,我们将 MusicProgressBar 控件和播放按钮放置在一个 RelativeLayout 中,并设置了一些简单的布局属性。注意,我们将 MusicProgressBar 的高度设置为 10dp,这是因为我们在自定义 View 中使用了 hard-coded value 来定义了每个模块的高度,所以在布局文件中设置高度不会对每个模块的长度产生影响。
这样,我们就完成了一个简单的 Android 自定义进度条,支持根据音乐进度更新进度条的进度,并且可以自定义每个模块的颜色。当然,这只是一个简单的示例,你可以根据自己的需求进行定制和扩展。
代码跑一下吧