最近做開(kāi)發(fā)遇到的 要寫(xiě)一個(gè)小視頻錄制的功能起惕,本來(lái)采用的趣拍的SDK专肪,但是方法數(shù)超了适袜,所以沒(méi)有辦法就用了一個(gè)開(kāi)源的錄制功能自己來(lái)寫(xiě)頁(yè)面哲泊,這次就先分享一下我自定義的進(jìn)度條view剩蟀,實(shí)現(xiàn)的功能是按下拍攝進(jìn)度條走同時(shí)視頻拍攝催蝗,抬起手 進(jìn)度條暫停切威,拍攝暫停,再次按下進(jìn)度條繼續(xù)走動(dòng)丙号,拍攝繼續(xù)先朦,全部完成了拍攝合成一個(gè)小視頻缰冤,這一次就先分享這個(gè)進(jìn)度條,下一次再來(lái)分享拍攝的部分喳魏。
下面上代碼棉浸,先是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="開(kāi)始" />
<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>
這個(gè)就是主頁(yè)面包含了一個(gè)自定義的進(jìn)度條和一個(gè)開(kāi)始的按鈕還有一個(gè)重拍的按鈕
接下來(lái)上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;//總進(jìn)度是8
private float eachProgressWidth = 0;
private Paint progressPaint;
public void setMaxProgressSize(float maxProgressSize) {
this.maxProgressSize = maxProgressSize;
}
private void init() {
//設(shè)置每一刻度的寬度
DisplayMetrics dm = new DisplayMetrics();
mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
mWindowManager.getDefaultDisplay().getMetrics(dm);
eachProgressWidth = dm.widthPixels / (maxProgressSize * 1.0f);
//進(jìn)度條的背景顏色
setBackgroundColor(Color.parseColor("#19000000"));
//進(jìn)度條的前景顏色,畫(huà)筆
progressPaint = new Paint();
progressPaint.setStyle(Paint.Style.FILL);
// progressPaint.setColor(Color.parseColor("#ffffff"));
}
private long initTime = -1;//上一次刷新完成后的時(shí)間
private boolean isStart = false;
private float countWidth = 0;//進(jìn)度條進(jìn)度的進(jìn)程,每次調(diào)用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;
}
//這次刷新的時(shí)間刺彩,用于與上一次刷新完成的時(shí)間作差得出進(jìn)度條需要增加的進(jìn)度
long thisTime = System.currentTimeMillis();
countWidth += eachProgressWidth * (thisTime - initTime) * 1.0f;
if (countWidth > getMeasuredWidth()) {
countWidth = getMeasuredWidth();
}
canvas.drawRect(0, 0, countWidth, getMeasuredHeight(), progressPaint);
//如果都了最大長(zhǎng)度迷郑,就不再調(diào)用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;
}
//開(kāi)始或暫停進(jìn)度條進(jìn)度刷新
public void setIsStart(boolean isStart) {
if (isStart == this.isStart)
return;
this.isStart = isStart;
if (isStart) {
initTime = -1;
invalidate();
}
}
//重置進(jìn)度條
public void reset() {
countWidth = 0;
initTime = -1;
isStart = false;
invalidate();
}
}
再寫(xiě)一個(gè)管理類
public class ProgressViewMag{
private Button start;
private ProgressView progressView;
private Button restart;
public ProgressViewMag(Button start, ProgressView progressView, Button restart) {
this.start = start;
this.progressView = progressView;
this.restart = restart;
initView();
}
private void initView() {
Start();
restart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
progressView.reset();
}
});
}
public float getTime() {
return progressView.getTime();
}
public float getMaxProgressSize(){
return progressView.getMaxProgressSize();
}
public void Start() {
start.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
progressView.setIsStart(false);
}
if (event.getAction() == MotionEvent.ACTION_DOWN) {
progressView.setIsStart(true);
}
return false;
}
});
}
}
然后是主頁(yè)
public class MainActivity extends Activity {
private Button start;
private ProgressView progressView;
private Button restart;
ProgressViewMag manager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
start = (Button) findViewById(R.id.tv_start);
restart = (Button) findViewById(R.id.tv_reset);
progressView = (ProgressView)findViewById(R.id.my_progress_view);
manager = new ProgressViewMag(start,progressView,restart);
}
}
這就是實(shí)現(xiàn)自定義進(jìn)度條的全部代碼了,寫(xiě)的可能有些糙创倔,如果有錯(cuò)誤的地方歡迎給我指出嗡害,下次我會(huì)更新配上拍攝視頻的部分。