Android自定义进度条VIEW

最近做开发遇到的 要写一个小视频录制的功能,本来采用的趣拍的SDK,但是方法数超了,所以没有办法就用了一个开源的录制功能自己来写页面,这次就先分享一下我自定义的进度条view,实现的功能是按下拍摄进度条走同时视频拍摄,抬起手 进度条暂停,拍摄暂停,再次按下进度条继续走动,拍摄继续,全部完成了拍摄合成一个小视频,这一次就先分享这个进度条,下一次再来分享拍摄的部分。
下面上代码,先是XML文件

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:Android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto" android:orientation="vertical" tools:context=".MainActivity"> <com.example.zzy.progreeviewdemo.ProgressView android:id="@+id/my_progress_view" android:layout_width="match_parent" app:topcolor="@color/colorAccent" android:layout_height="40dp" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="0.48" android:orientation="horizontal"> <Button android:id="@+id/tv_start" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="开始" /> <Button android:id="@+id/tv_reset" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:gravity="center" android:text="重拍" /> </LinearLayout> </LinearLayout>

这个就是主页面包含了一个自定义的进度条和一个开始的按钮还有一个重拍的按钮

Android自定义进度条VIEW


 

接下来上java代码

public class ProgressView extends View { private Context mContext; private WindowManager mWindowManager; public ProgressView(Context context) { this(context, null); this.mContext = context; } public ProgressView(Context context, AttributeSet attrs) { this(context, attrs, 0); this.mContext = context; } public ProgressView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); this.mContext = context; progressPaint = new Paint(); TypedArray a = context.getTheme().obtainStyledAttributes( attrs, R.styleable.ProgressView, 0, 0); int topColor = a.getColor(R.styleable.ProgressView_topcolor, mContext.getResources().getColor(R.color.default_color)); progressPaint.setColor(topColor); maxProgressSize = a.getInteger(R.styleable.ProgressView_time, 10 * millisecond); this.mContext = context; init(); } private int millisecond = 1000; private float maxProgressSize = 8 * millisecond;//总进度是8 private float eachProgressWidth = 0; private Paint progressPaint; public void setMaxProgressSize(float maxProgressSize) { this.maxProgressSize = maxProgressSize; } private void init() { //设置每一刻度的宽度 DisplayMetrics dm = new DisplayMetrics(); mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE); mWindowManager.getDefaultDisplay().getMetrics(dm); eachProgressWidth = dm.widthPixels / (maxProgressSize * 1.0f); //进度条的背景颜色 setBackgroundColor(Color.parseColor("#19000000")); //进度条的前景颜色,画笔 progressPaint = new Paint(); progressPaint.setStyle(Paint.Style.FILL); // progressPaint.setColor(Color.parseColor("#ffffff")); } private long initTime = -1;//上一次刷新完成后的时间 private boolean isStart = false; private float countWidth = 0;//进度条进度的进程,每次调用invalidate()都刷新一次 @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (!isStart) { canvas.drawRect(0, 0, countWidth, getMeasuredHeight(), progressPaint); return; } if (initTime == -1) { initTime = System.currentTimeMillis(); canvas.drawRect(0, 0, countWidth, getMeasuredHeight(), progressPaint); invalidate(); return; } //这次刷新的时间,用于与上一次刷新完成的时间作差得出进度条需要增加的进度 long thisTime = System.currentTimeMillis(); countWidth += eachProgressWidth * (thisTime - initTime) * 1.0f; if (countWidth > getMeasuredWidth()) { countWidth = getMeasuredWidth(); } canvas.drawRect(0, 0, countWidth, getMeasuredHeight(), progressPaint); //如果都了最大长度,就不再调用invalidate();了 if (countWidth < getMeasuredWidth() && isStart) { initTime = System.currentTimeMillis(); invalidate(); } else { // c isStart = false; } } public float getTime() { return countWidth/getMeasuredWidth() * maxProgressSize; } public float getMaxProgressSize() { return maxProgressSize; } //开始或暂停进度条进度刷新 public void setIsStart(boolean isStart) { if (isStart == this.isStart) return; this.isStart = isStart; if (isStart) { initTime = -1; invalidate(); } } //重置进度条 public void reset() { countWidth = 0; initTime = -1; isStart = false; invalidate(); } }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/f6c90377add697765e673073e709e85a.html