package com.lancens.wxdoorbell.widget;
import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Rect; import android.graphics.RectF; import android.os.Handler; import android.os.Message; import android.support.annotation.Nullable; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.VelocityTracker; import android.view.View; import android.view.ViewConfiguration; import android.widget.Scroller; import java.io.Serializable; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; import java.util.Locale; /** * Created by WuJinLin on 2017/7/7. */ public class PlaybackView extends View { private static String TAG = "PlaybackView>>"; private Paint mPaint; private static final int SCALE_COLOR = 0xFF7C7C7C; private static final int VIDEO_COLOR = 0xFFffab8a; private static final int MID_COLOR = 0xFF039BE5; private static final int MID_BACKGROUND_COLOR = 0x557C7C7C; private int VIEW_BACKGROUND_COLOR = 0x00000000; private static final float TWO_MIN_SCALE_HEIGHT = 5; private static final float TEN_MIN_SCALE_HEIGHT = 10; private static final float HOUR_SCALE_HEIGHT = 15; private float widthTimes = 1.5f; private List<PlaybackVo> videos = new ArrayList<>(); private float SECOND_WIDTH = 30;//px private float MIN_SECOND_WIDTH = 5; private float MAX_SECOND_WIDTH = 30; private static final int TWO_MINUTE_SCALE_INTERVAL = 120; private static final int TEN_MINUTE_SCALE_INTERVAL = 600; private static final int TWENTY_MINUTE_SCALE_INTERVAL = 1200; private static final int ONE_HOUR_SCALE_INTERVAL = 3600; private static final int TWO_HOUR_SCALE_INTERVAL = 7200; private static final int SCALE_TEXT_SIZE = 12; private int midBackgroundWidth = 5;//dp private float mWidth, mHeight; private float mDensity;// 屏幕密度 dp*mDensity=px private Scroller mScroller; private VelocityTracker mVelocityTracker; private int mMinVelocity; private TimeAlgorithm mValue;// 当前刻度指示时间 private TimeAlgorithm selectValue;//指定移动时间 public PlaybackView(Context context) { this(context, null); } public PlaybackView(Context context, @Nullable AttributeSet attrs) { this(context, attrs, 0); } public PlaybackView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(context); } private void init(Context context) { mScroller = new Scroller(context); mVelocityTracker = VelocityTracker.obtain(); mDensity = context.getResources().getDisplayMetrics().density; mPaint = new Paint(); mPaint.setColor(SCALE_COLOR); mPaint.setAntiAlias(true); mPaint.setDither(true); mValue = new TimeAlgorithm(System.currentTimeMillis() * 1000); mMinVelocity = ViewConfiguration.get(context).getScaledMinimumFlingVelocity(); // Log.d(TAG, "init: " + mDensity); } public void moveToValue(long micros) { if (micros == mValue.getTimeInMicros()) return; Message msg = Message.obtain(); msg.what = SET_VALUE; selectValue = new TimeAlgorithm(micros); if (isCurrentDay(mValue, selectValue)) { moveX = (selectValue.getTimeInSecond() - mValue.getTimeInSecond()) * SECOND_WIDTH / SET_VALUE_AUTO_MOVE_COUNT; if (Math.abs(moveX) < SECOND_WIDTH && moveX != 0) { moveX = moveX * SECOND_WIDTH / moveX; } // Log.d(TAG, "moveToValue: " + moveX + ">>" + SECOND_WIDTH); handler.sendMessage(msg); } } public void setValue(long micros) { removeAllMessage(); mValue = new TimeAlgorithm(micros); postInvalidate(); if (listener != null) { listener.onValueChanged(mValue.getStringTimeInSecond(), mValue.getTimeInMicros()); } handler.sendEmptyMessageDelayed(DELAY_MOVE_TO_NEARBY_VIDEO, delayMoveToNearbyVideoMs); } private void removeAllMessage() { handler.removeMessages(DELAY_MOVE_TO_NEARBY_VIDEO); handler.removeMessages(SET_VALUE); } public void setViewBackgroundColor(int color) { this.VIEW_BACKGROUND_COLOR = color; } public void setVideos(List<PlaybackVo> videos) { if (videos == null || videos.size() == 0) return; this.videos = videos; moveToNearbyVideo(); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { // Log.d(TAG, "onSizeChanged: "); mWidth = w; mHeight = h; MAX_SECOND_WIDTH = mWidth / 1800; MIN_SECOND_WIDTH = mWidth / (60 * 60 * 24); SECOND_WIDTH = MAX_SECOND_WIDTH; super.onSizeChanged(w, h, oldw, oldh); } @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { // Log.d(TAG, "onLayout: " + changed + ">>left=" + le