/**
|
* @Title CustomImageView.java
|
* @Package null
|
* @Description null
|
* @Copyright null
|
* @author
|
* @date 2012-7-12 下午8:43:22
|
* @version 1.0
|
*/
|
|
package com.videogo.ui.remoteplayback;
|
|
import android.content.Context;
|
import android.content.res.Configuration;
|
import android.graphics.Canvas;
|
import android.graphics.Paint;
|
import android.graphics.Rect;
|
import android.graphics.Typeface;
|
import android.util.AttributeSet;
|
import android.util.DisplayMetrics;
|
import android.widget.ImageView;
|
|
import com.videogo.constant.Constant;
|
import com.videogo.openapi.bean.resp.CloudFile;
|
import com.videogo.remoteplayback.RemoteFileInfo;
|
import com.videogo.util.LocalInfo;
|
import com.videogo.util.LogUtil;
|
import com.videogo.util.Utils;
|
|
import java.util.ArrayList;
|
import java.util.Calendar;
|
import java.util.List;
|
|
import ezviz.ezopensdk.R;
|
|
public class RemoteFileTimeBar extends ImageView {
|
private static final String TAG = "RemoteFileTimeBar";
|
private List<RemoteFileInfo> mFileList;
|
|
private List<CloudFile> mCloudFileList;
|
|
private Calendar mStartTime;
|
|
private Calendar mEndTime;
|
|
private int mLeftX = 0;
|
|
private int mRightX = 0;
|
|
private float mMeasuredHeight;
|
|
private float mScreenWidth;
|
|
private float mHalfScreenWidth;
|
|
private float mHourWith;
|
|
private ArrayList<String> mClockList;
|
|
private Paint mPaint = new Paint();
|
|
private Paint mAlarmPaint = new Paint();
|
|
private Paint mTransPaint = new Paint();
|
|
private Paint mTimePaint = new Paint();
|
|
private Context mContext;
|
|
public RemoteFileTimeBar(Context context) {
|
super(context);
|
}
|
|
public RemoteFileTimeBar(Context context, AttributeSet attrs) {
|
super(context, attrs);
|
init(context);
|
}
|
|
public RemoteFileTimeBar(Context context, AttributeSet attrs, int defStyle) {
|
super(context, attrs, defStyle);
|
}
|
|
private void init(Context context) {
|
mContext = context;
|
mClockList = new ArrayList<String>();
|
for (int i = 0; i < 25; i++) {
|
String temp = String.format("%02d", i) + ":00";
|
mClockList.add(temp);
|
}
|
|
mPaint.setColor(mContext.getResources().getColor(R.color.remotefile_timebar_color));
|
mAlarmPaint.setColor(mContext.getResources().getColor(R.color.remotefile_timebar_alarm_color));
|
mTransPaint.setColor(mContext.getResources().getColor(R.color.transparent));
|
|
mTimePaint.setColor(mContext.getResources().getColor(R.color.remotefile_timebar_color));
|
mTimePaint.setStrokeWidth(Utils.dip2px(context, 2));
|
mTimePaint.setTypeface(Typeface.DEFAULT_BOLD);
|
mTimePaint.setTextSize(Utils.dip2px(context, 12));
|
|
DisplayMetrics dm = context.getResources().getDisplayMetrics();
|
mMeasuredHeight = getMeasuredHeight();
|
LogUtil.d(TAG, "init measuredHeight:" + mMeasuredHeight);
|
mScreenWidth = dm.widthPixels; // 屏幕宽(像素,如:480px)
|
mHalfScreenWidth = mScreenWidth / 2;
|
mHourWith = mScreenWidth * 5L / 24L;
|
// screenHeight = dm.heightPixels; // 屏幕高(像素,如:800px)
|
LogUtil.d(TAG, "init screenWidth:" + mScreenWidth);
|
}
|
|
public float getScrollPosByPlayTime(long playTime, int config) {
|
if(mStartTime == null) {
|
return 0;
|
}
|
long deltams = playTime - mStartTime.getTimeInMillis();
|
float pos = (float) deltams * (getWidthByOrient(config) * 5) / Constant.MILLISSECOND_ONE_DAY;
|
return pos;
|
}
|
|
public Calendar pos2Calendar(int pos, int config) {
|
if(mStartTime == null) {
|
return null;
|
}
|
long time = pos * Constant.MILLISSECOND_ONE_DAY / 5 / getWidthByOrient(config)
|
+ mStartTime.getTimeInMillis();
|
Calendar startCalendar = Calendar.getInstance();
|
startCalendar.setTimeInMillis(time);
|
return startCalendar;
|
}
|
|
private int getWidthByOrient(int config) {
|
if (config == Configuration.ORIENTATION_LANDSCAPE) {
|
return LocalInfo.getInstance().getScreenHeight();
|
} else {
|
return LocalInfo.getInstance().getScreenWidth();
|
}
|
}
|
|
public void drawFileLayout(List<RemoteFileInfo> fileList, List<CloudFile> cloudFileList, Calendar startTime, Calendar endTime) {
|
mFileList = fileList;
|
mCloudFileList = cloudFileList;
|
mStartTime = startTime;
|
mEndTime = endTime;
|
|
// 触发调用onDraw
|
postInvalidate();
|
}
|
|
public void setX(int left, int right) {
|
mScreenWidth = right / 6f; // 屏幕宽(像素,如:480px)
|
mHalfScreenWidth = mScreenWidth / 2;
|
mHourWith = mScreenWidth * 5L / 24L;
|
|
mLeftX = (int) (left + mHalfScreenWidth);
|
mRightX = (int) (right - mHalfScreenWidth);
|
}
|
|
@Override
|
protected void onDraw(Canvas canvas) {
|
drawTimeText(canvas);
|
drawTimeLine(canvas);
|
drawTimePoint(canvas);
|
// 计算显示区域
|
int top = Utils.dip2px(mContext, 37);
|
List<Rect> fileRect = getFileRect(top, (int) mMeasuredHeight);
|
List<Rect> fileCloundRect = getCloudFileRect(top, (int) mMeasuredHeight);
|
if ((fileRect == null || fileRect.size() == 0) && (fileCloundRect == null || fileCloundRect.size() == 0)) {
|
canvas.drawRect(0, top, mScreenWidth * 6, mMeasuredHeight, mTransPaint);
|
return;
|
}
|
|
// 背景设置为灰色
|
if (fileRect != null && fileRect.size() > 0) {
|
for (int i = 0; i < fileRect.size(); i++) {
|
Rect aRect = fileRect.get(i);
|
if (isAlarmRecord(i)) {
|
canvas.drawRect(aRect, mAlarmPaint);
|
} else {
|
canvas.drawRect(aRect, mPaint);
|
}
|
}
|
}
|
if (fileCloundRect != null && fileCloundRect.size() > 0) {
|
for (int i = 0; i < fileCloundRect.size(); i++) {
|
Rect aRect = fileCloundRect.get(i);
|
canvas.drawRect(aRect, mAlarmPaint);
|
}
|
}
|
}
|
|
private boolean isAlarmRecord(int i) {
|
RemoteFileInfo fileInfo = mFileList.get(i);
|
int iFileType = fileInfo.getFileType();
|
int oldFileType = fileInfo.getFileType();
|
if (iFileType == 1 && oldFileType == 1) {
|
return false;
|
}
|
if (iFileType == 0) {
|
return true;
|
}
|
if (oldFileType != 0) {
|
return true;
|
}
|
return false;
|
}
|
|
private void drawTimePoint(Canvas canvas) {
|
int startY = Utils.dip2px(mContext, 22);
|
int stopY = Utils.dip2px(mContext, 32);
|
int minStopY = Utils.dip2px(mContext, 27);
|
float startX = 0;
|
float minStartX = 0;
|
mPaint.setStrokeWidth(Utils.dip2px(mContext, 1));
|
for (int i = 0; i < 25; i++) {
|
startX = mHalfScreenWidth + mHourWith * i;
|
canvas.drawLine(startX, startY, startX, stopY, mPaint);
|
if(i < 24) {
|
for (int j = 1; j <= 3; j++) {
|
minStartX = startX + mHourWith * j / 4;
|
canvas.drawLine(minStartX, startY, minStartX, minStopY, mPaint);
|
}
|
}
|
}
|
// startY = Utils.dip2px(mContext, 21);
|
// mPaint.setStrokeWidth(Utils.dip2px(mContext, 2));
|
// startX = mHalfScreenWidth;
|
// canvas.drawLine(startX, startY, startX, stopY, mPaint);
|
// startX = mHalfScreenWidth + mHourWith * 24;
|
// canvas.drawLine(startX, startY, startX, stopY, mPaint);
|
}
|
|
private void drawTimeLine(Canvas canvas) {
|
int startY = Utils.dip2px(mContext, 22);
|
mPaint.setStrokeWidth(Utils.dip2px(mContext, 2));
|
canvas.drawLine(mLeftX-mHalfScreenWidth, startY, mRightX+mHalfScreenWidth, startY, mPaint);
|
}
|
|
private void drawTimeText(Canvas canvas) {
|
int textY = Utils.dip2px(mContext, 12);
|
int offsetX = Utils.dip2px(mContext, 14);
|
for (int i = 0; i < 25; i++) {
|
canvas.drawText(mClockList.get(i), mHalfScreenWidth - offsetX + mHourWith * i, textY, mTimePaint);
|
}
|
}
|
|
private List<Rect> getFileRect(int top, int bottom) {
|
if (mFileList == null) {
|
return null;
|
}
|
|
int size = mFileList.size();
|
if (size <= 0) {
|
return null;
|
}
|
|
List<Rect> fileRect = new ArrayList<Rect>(size);
|
float width = mRightX - mLeftX;
|
|
for (int i = 0; i < size; i++) {
|
RemoteFileInfo info = mFileList.get(i);
|
Calendar startTime = info.getStartTime();
|
Calendar endTime = info.getStopTime();
|
// 计算区域
|
Rect aRect = new Rect();
|
aRect.top = top;
|
aRect.bottom = bottom;
|
long referStartTime = mStartTime.getTimeInMillis();
|
long referEndTime = mEndTime.getTimeInMillis();
|
// LogUtil.d(TAG, "refer time(" + referStartTime + ", " + referEndTime + ")");
|
// LogUtil.d(TAG, "real time(" + startTime + ", " + endTime + ")");
|
// LogUtil.d(TAG, "(" + mLeftX + ", " + mRightX + ")");
|
if (startTime.getTimeInMillis() <= referStartTime) {
|
aRect.left = mLeftX;
|
} else {
|
// 计算左坐标
|
float deltaMillis = startTime.getTimeInMillis() - referStartTime;
|
aRect.left = mLeftX + (int) (deltaMillis * width / (float) Constant.MILLISSECOND_ONE_DAY);
|
}
|
|
if (endTime.getTimeInMillis() > referEndTime) {
|
aRect.right = mRightX;
|
} else {
|
// 计算右坐标
|
float deltaMillis = endTime.getTimeInMillis() - referStartTime;
|
aRect.right = mLeftX + (int) ((deltaMillis * width / (float) Constant.MILLISSECOND_ONE_DAY));
|
}
|
|
// LogUtil.d(TAG, "LR(" + aRect.left + "," + aRect.right + ")");
|
|
fileRect.add(aRect);
|
|
}
|
|
return fileRect;
|
}
|
|
private List<Rect> getCloudFileRect(int top, int bottom) {
|
if (mCloudFileList == null) {
|
return null;
|
}
|
|
int size = mCloudFileList.size();
|
if (size <= 0) {
|
return null;
|
}
|
|
List<Rect> fileRect = new ArrayList<Rect>(size);
|
float width = mRightX - mLeftX;
|
|
for (int i = 0; i < size; i++) {
|
CloudFile info = mCloudFileList.get(i);
|
long startTime = Utils.get19TimeInMillis(info.getStartTime());
|
long endTime = Utils.get19TimeInMillis(info.getEndTime());
|
|
// 计算区域
|
Rect aRect = new Rect();
|
aRect.top = top;
|
aRect.bottom = bottom;
|
long referStartTime = mStartTime.getTimeInMillis();
|
long referEndTime = mEndTime.getTimeInMillis();
|
// .LogUtil.d("setStopTime", "refer time(" + referStartTime + ", " + referEndTime
|
// + ")");
|
// LogUtil.d(TAG, "real time(" + startTime + ", " + endTime + ")");
|
// LogUtil.d(TAG, "(" + mLeftX + ", " + mRightX + ")");
|
if (startTime <= referStartTime) {
|
aRect.left = mLeftX;
|
} else {
|
// 计算左坐标
|
float deltaMillis = startTime - referStartTime;
|
aRect.left = mLeftX + (int) (deltaMillis * width / (float) Constant.MILLISSECOND_ONE_DAY);
|
}
|
|
if (endTime > referEndTime) {
|
aRect.right = mRightX;
|
} else {
|
// 计算右坐标
|
float deltaMillis = endTime - referStartTime;
|
aRect.right = mLeftX + (int) ((deltaMillis * width / (float) Constant.MILLISSECOND_ONE_DAY));
|
}
|
|
// LogUtil.d(TAG, "LR(" + aRect.left + "," + aRect.right + ")");
|
|
fileRect.add(aRect);
|
|
}
|
|
return fileRect;
|
}
|
|
@Override
|
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
|
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
|
int width;
|
int height;
|
width = (int) (mScreenWidth * 6);
|
height = heightSize;
|
mMeasuredHeight = height;
|
LogUtil.d(TAG, "onMeasure measuredHeight:" + mMeasuredHeight);
|
// MUST CALL THIS
|
setMeasuredDimension(width, height);
|
}
|
|
public Calendar getLastStopTime() {
|
if (mCloudFileList == null && mCloudFileList.size() == 0) {
|
return mEndTime;
|
}
|
|
long cloudStopTime = 0;
|
if (mCloudFileList.size() > 0) {
|
cloudStopTime = Utils.get19TimeInMillis(mCloudFileList.get(mCloudFileList.size() - 1).getEndTime());
|
}
|
|
if (cloudStopTime == 0) {
|
return mEndTime;
|
}
|
|
if(cloudStopTime > mEndTime.getTimeInMillis()) {
|
return mEndTime;
|
} else {
|
Calendar cloudStop = Calendar.getInstance();
|
cloudStop.setTimeInMillis(cloudStopTime);
|
return cloudStop;
|
}
|
}
|
}
|