- 遇到的需求:
- 豎直的顯示進度/或者當(dāng)前的比例
- 可以動態(tài)的展示進度
- 顏色有可能隨時更改
已經(jīng)知道了具體的需求凰浮,讓我們一步步開始實現(xiàn)吧
1.自定義 VerticalProgressBar
-
就是簡單的自定義控件,繼承ProgressBar就行。
代碼: public class VerticalProgressBar extends ProgressBar { public VerticalProgressBar(Context context) { super(context); } public VerticalProgressBar(Context context, AttributeSet attrs) { super(context, attrs); } public VerticalProgressBar(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) public VerticalProgressBar(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(h, w, oldh, oldw); } @Override protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); } /* * 重點在這里 */ @Override protected synchronized void onDraw(Canvas canvas) { canvas.rotate(-90); canvas.translate(-getHeight(), 0); super.onDraw(canvas); }
}
就是這么直接干脆的寫完了,接下來將 VerticalProgressBar 放到 布局xml 中而线,就ok了雾袱。
2. 布局 & 初始化動畫
-
xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"> <com.starpavilion.battery.batteryprotection.view.VerticalProgressBar android:id="@+id/iv_progressBar" android:layout_width="20dp" android:layout_height="227dp" style="@android:style/Widget.ProgressBar.Horizontal" android:layout_marginTop="30dp" android:progressDrawable="@drawable/layer_list_progress_drawable" android:layout_centerInParent="true" android:max="100" /> </RelativeLayout>
在代碼中 初始化動畫
上個完整的 初始化代碼
public class ProgressBarActivity extends BaseActivity {
@BindView(R.id.iv_progressBar)
VerticalProgressBar ivProgressBar;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_progress_bar);
ButterKnife.bind(this);
initProgressBar();
}
//設(shè)置值動畫 progressbar動起來
private void initProgressBar() {
ValueAnimator valueAnimator = ValueAnimator.ofInt(10, 100);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
ivProgressBar.setProgress((Integer) valueAnimator.getAnimatedValue());
}
});
valueAnimator.setDuration(1000);
valueAnimator.setRepeatMode(ValueAnimator.REVERSE);
valueAnimator.setRepeatCount(1);
valueAnimator.start();
valueAnimator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationCancel(Animator animation) {
super.onAnimationCancel(animation);
}
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
ivProgressBar.setProgress(50);
}
});
}
}
- 奏是這么簡單。