package com.yixia.camera.demo.ui.record.views;
import java.util.Iterator;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.view.View;
import com.example.wechat01.R;
import com.yixia.camera.model.MediaObject;
import com.yixia.camera.util.DeviceUtils;
public class ProgressView extends View {
/** 进度条 */
private Paint mProgressPaint;
/** 闪 */
private Paint mActivePaint;
/** 暂停/中断色块 */
private Paint mPausePaint;
/** 回删 */
private Paint mRemovePaint;
/** 三秒 */
private Paint mThreePaint;
/** 超时 */
private Paint mOverflowPaint;
private boolean mStop, mProgressChanged;
private boolean mActiveState;
private MediaObject mMediaObject;
/** 最长时长 */
private int mMaxDuration, mVLineWidth;
public ProgressView(Context paramContext) {
super(paramContext);
init();
}
public ProgressView(Context paramContext, AttributeSet paramAttributeSet) {
super(paramContext, paramAttributeSet);
init();
}
public ProgressView(Context paramContext, AttributeSet paramAttributeSet,
int paramInt) {
super(paramContext, paramAttributeSet, paramInt);
init();
}
private void init() {
mProgressPaint = new Paint();
mActivePaint = new Paint();
mPausePaint = new Paint();
mRemovePaint = new Paint();
mThreePaint = new Paint();
mOverflowPaint = new Paint();
mVLineWidth = DeviceUtils.dipToPX(getContext(), 1);
setBackgroundColor(getResources().getColor(R.color.camera_bg));
mProgressPaint.setColor(0xFF45C01A);
mProgressPaint.setStyle(Paint.Style.FILL);
mActivePaint.setColor(getResources().getColor(R.color.white));
mActivePaint.setStyle(Paint.Style.FILL);
mPausePaint.setColor(getResources().getColor(
R.color.camera_progress_split));
mPausePaint.setStyle(Paint.Style.FILL);
mRemovePaint.setColor(getResources().getColor(
R.color.camera_progress_delete));
mRemovePaint.setStyle(Paint.Style.FILL);
mThreePaint.setColor(getResources().getColor(
R.color.camera_progress_three));
mThreePaint.setStyle(Paint.Style.FILL);
mOverflowPaint.setColor(getResources().getColor(
R.color.camera_progress_overflow));
mOverflowPaint.setStyle(Paint.Style.FILL);
}
/** 闪动 */
private final static int HANDLER_INVALIDATE_ACTIVE = 0;
/** 录制中 */
private final static int HANDLER_INVALIDATE_RECORDING = 1;
private Handler mHandler = new Handler() {
@Override
public void dispatchMessage(Message msg) {
switch (msg.what) {
case HANDLER_INVALIDATE_ACTIVE:
invalidate();
mActiveState = !mActiveState;
if (!mStop)
sendEmptyMessageDelayed(0, 300);
break;
case HANDLER_INVALIDATE_RECORDING:
invalidate();
if (mProgressChanged)
sendEmptyMessageDelayed(0, 50);
break;
}
super.dispatchMessage(msg);
}
};
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
final int width = getMeasuredWidth(), height = getMeasuredHeight();
int left = 0, right = 0, duration = 0;
if (mMediaObject != null && mMediaObject.getMedaParts() != null) {
left = right = 0;
Iterator<MediaObject.MediaPart> iterator = mMediaObject
.getMedaParts().iterator();
boolean hasNext = iterator.hasNext();
// final int duration = vp.getDuration();
int maxDuration = mMaxDuration;
boolean hasOutDuration = false;
int currentDuration = mMediaObject.getDuration();
hasOutDuration = currentDuration > mMaxDuration;
if (hasOutDuration)
maxDuration = currentDuration;
while (hasNext) {
MediaObject.MediaPart vp = iterator.next();
final int partDuration = vp.getDuration();
// Logger.e("[ProgressView]partDuration" + partDuration +
// " maxDuration:" + maxDuration);
left = right;
right = left
+ (int) (partDuration * 1.0F / maxDuration * width);
if (vp.remove) {
// 回删
canvas.drawRect(left, 0.0F, right, height, mRemovePaint);
} else {
// 画进度
if (hasOutDuration) {
// 超时拍摄
// 前段
right = left
+ (int) ((mMaxDuration - duration) * 1.0F
/ maxDuration * width);
canvas.drawRect(left, 0.0F, right, height,
mProgressPaint);
// 超出的段
left = right;
right = left
+ (int) ((partDuration - (mMaxDuration - duration))
* 1.0F / maxDuration * width);
canvas.drawRect(left, 0.0F, right, height,
mOverflowPaint);
} else {
canvas.drawRect(left, 0.0F, right, height,
mProgressPaint);
}
}
hasNext = iterator.hasNext();
if (hasNext) {
// left = right - mVLineWidth;
canvas.drawRect(right - mVLineWidth, 0.0F, right, height,
mPausePaint);
}
duration += partDuration;
// progress = vp.progress;
}
}
// 画三秒
if (duration < 3000) {
left = (int) (3000F / mMaxDuration * width);
canvas.drawRect(left, 0.0F, left + mVLineWidth, height, mThreePaint);
}
// 删
//
// 闪
if (mActiveState) {
if (right + 8 >= width)
right = width - 8;
canvas.drawRect(right, 0.0F, right + 8, getMeasuredHeight(),
mActivePaint);
}
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
mStop = false;
mHandler.sendEmptyMessage(HANDLER_INVALIDATE_ACTIVE);
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
mStop = true;
mHandler.removeMessages(HANDLER_INVALIDATE_ACTIVE);
}
// public void addProgress(MediaPart part) {
// if (part != null) {
// part.index = mVideoParts.size();
// mVideoParts.add(part);
// }
// }
public void setData(MediaObject mMediaObject) {
this.mMediaObject = mMediaObject;
}
public void setMaxDuration(int duration) {
this.mMaxDuration = duration;
}
public void start() {
mProgressChanged = true;
}
public void stop() {
mProgressChanged = false;
}
}