需求
- 下载按钮颜色,文字显示下载,可点击
- 下载过程中有进度显示,文字显示下载中,不可点击
- 下载完成后按钮颜色,文字显示下载完成,不可点击
思考
下载,下载完成可以使用同一个Button显示,下载过程可以使用ProgressBar显示,然后把这个状态切换等一系列逻辑封装成一个自定义view.
- 实现
1.首先,因为需要初始化两个view,我们自定义一个ProgressButton 继承RelativeLayout承载这两个view
2.有view状态切换,这里我们采用简单使用的流式代码
progressButton.setText("下载完成").finish().invalidate();
ProgressButton具体代码
package com.wind.process.progrss.view;
import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.wind.process.progrss.R;
/**
* Created by jiagf
*/
public class ProgressButton extends RelativeLayout {
private RelativeLayout viewRoot;
private TextView progressTv;
private ProgressBar progressBar;
private Builder builder;
public ProgressButton(Context context) {
super(context);
initViews();
}
public ProgressButton(Context context, AttributeSet attrs) {
super(context, attrs);
initViews();
}
public ProgressButton(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initViews();
}
public ProgressButton(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr);
initViews();
}
public class Builder {
private String text;
private int progress;
private int progressDrawable;
private int textSize;
public Builder setText(String text) {
this.text = text;
return this;
}
public Builder setProgress(int progress) {
this.progress = progress;
return this;
}
public Builder setProgressDrawable(int progressDrawable) {
this.progressDrawable = progressDrawable;
return this;
}
public Builder setTextSize(int textSize) {
this.textSize = textSize;
return this;
}
public Builder finish(){
return finish(R.drawable.download_finished);
}
public Builder finish(int progressDrawable){
this.progressDrawable = progressDrawable;
return this;
}
public void invalidate() {
if (text != null) {
progressTv.setText(text);
}
if (textSize != 0) {
progressTv.setTextSize(textSize);
}
if (progressDrawable != 0) {
progressBar.setProgressDrawable(getContext().getResources().getDrawable(progressDrawable));
}
if (progress != 0) {
progressBar.setProgress(progress);
if(progressBar.getVisibility() != View.VISIBLE){
progressBar.setVisibility(View.VISIBLE);
}
}
}
}
private void initViews() {
builder = new Builder();
viewRoot = (RelativeLayout) LayoutInflater.from(getContext()).inflate(R.layout.view_progress_button, null);
addView(viewRoot, LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
progressBar = (ProgressBar) viewRoot.findViewById(R.id.view_progress_button_pb);
progressTv = (TextView) viewRoot.findViewById(R.id.view_progress_button_tv);
progressTv.setText("下载");
}
public Builder getBuilder() {
return builder;
}
public Builder setText(String text) {
builder.setText(text);
return builder;
}
public Builder setProgress(int progress) {
builder.setProgress(progress);
return builder;
}
public Builder setProgressDrawable(int progressDrawable) {
builder.setProgressDrawable(progressDrawable);
return builder;
}
public Builder setTextSize(int textSize) {
builder.setTextSize(textSize);
return builder;
}
}
ProgressBar样式
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 背景 -->
<item android:id="@android:id/background">
<shape>
<corners android:radius="20dp" />
<solid android:color="@color/green" />
<stroke android:color="#f0ffffff" android:width="1dp"/>
<padding android:left="1dp" android:top="1dp" android:right="1dp" android:bottom="1dp"/>
</shape>
</item>
<!-- 进度条 -->
<item android:id="@android:id/progress">
<clip>
<shape>
<corners android:radius="20dp" />
<solid android:color="@color/red" />
</shape>
</clip>
</item>
</layer-list>