(mValue-startvalue) * mDensity * (mLineDivider); endXPosition = mWidth/2 + (endvalue-mValue) * mDensity * (mLineDivider);
canvas.drawRect(startXPosition,0,endXPosition,mHeight,shadowPaint); }
Мы также должны разобраться в преобразовании между временем и делениями шкалы.
/**
Получение значения mvalue, соответствующего времени timestamp
@param time временной отрезок time
@return / private int getmValue(long time) { /*
Получение времени, соответствующего значению mValue
@param mValue
@return */ public static String getTime(float mValue) { // TODO: 2017/10/23 Обработка превышения 24 часов и меньше 0 часов
int day = (int) (mValue * valueToSencond / (3600 * 24)); // количество дней int hour = (int) ((mValue * valueToSencond - (60 * 60 * 24) * day) / 3600); int minute = (int) (mValue * valueToSencond - 3600 * hour - (60 * 60 * 24) * day) / 60; int second = (int) mValue * valueToSencond - hour * 3600 - minute * 60 - (60 * 60 * 24) * day;
AXLog.e("wzytest", "hour:" + hour + " minute:" + minute + " second:" + second + " day:" + day); Calendar calendar1 = Calendar.getInstance(); SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
/**
String moveDate = sdf1.format(calendar1.getTime()); return moveDate; } Когда происходит обработка перемещения и масштабирования пальцем
case MotionEvent.ACTION_MOVE: if (event.getPointerCount() == 1) { mMove = xPosition - mlastX; xMove = (int) (mMove / (mLineDivider * mDensity)); mValue -= xMove; notifyValueChange(); invalidate(); } break;
Также есть сложная проблема, которую нужно решить: при масштабировании, если масштаб становится слишком большим или слишком маленьким, мы должны изменить точность масштаба, чтобы он соответствовал изменениям на странице, иначе текст может перекрываться или страница может выглядеть пустой. Эта обработка довольно сложна, общая идея заключается в том, что интервал между делениями будет изменяться в соответствии с масштабированием пальца, и когда масштаб станет слишком большим или слишком малым, мы изменим точность масштаба.
else if (event.getPointerCount() == 2) { // Два пальца находятся на экране и перемещаются, это состояние масштабирования centerPointBetweenFingers(event); double fingerDis = distanceBetweenFingers(event);
if (fingerDis > lastFingerDis) {
currentStatus = STATUS_ZOOM_OUT;
} else {
currentStatus = STATUS_ZOOM_IN;
}
if(Mode==Mode_0&¤tStatus==STATUS_ZOOM_OUT||Mode==Mode_4&¤tStatus==STATUS_ZOOM_IN){
AXLog.e("wzytest","Mode_0 при увеличении и Mode_4 при уменьшении не обрабатываются");
}else{
scaledRatio = (float) (fingerDis / lastFingerDis );
shadowPaint.setStrokeWidth(6*scaledRatio);
mLineDivider = lastItemDivider * scaledRatio; //расстояние после масштабирования одного деления на экране
}
if(currentStatus==STATUS_ZOOM_IN&&Mode==Mode_0){
if(2*mLineDivider<LINE_DIVIDER){
// Сброс, изменение режима шкалы
mLineDivider = 2;
lastItemDivider = 2;
useString = timeString1;
Mode = Mode_1;
valueToSencond = 2*valueToSencond;
AXLog.e("wzytest","mvalue:"+mValue);
//Получить текущее значение заново
mValue = getNowValue();
//Пересчитать синюю временную шкалу видео
initData();
}
}else if(currentStatus==STATUS_ZOOM_IN&&Mode==Mode_1){
if(3*mLineDivider<LINE_DIVIDER){
// Сброс, изменение режима шкалы
В этом тексте присутствуют фрагменты кода, но они не содержат ошибок и выглядят как фрагменты рабочего кода. valueToSencond = valueToSencond/2;
//重新获取当前value
mValue = getNowValue();
//重新计算蓝色录像时间轴
initData();
}
}
AXLog.e("wzytest","itemDivider:"+mLineDivider+" lastItemDivider:"+lastItemDivider);
postInvalidate();
}
Данная часть кода является достаточно сложной, рекомендуется заинтересованным читателям скачать исходный код для исследования.
## Три, прочие связанные моменты
Автор запустил асинхронный поток, который с интервалом в одну секунду увеличивает время записываемого файла на одну секунду. Цель этого действия — имитировать процесс записи и обеспечить движение синей области в соответствии с течением времени.
## Четыре, заключение
При столкновении со сложными проблемами следует тщательно анализировать их суть, разбивать проблему на более мелкие части и постепенно решать их. Как говорится, путь в тысячу ли начинается с первого шага, а большие реки начинаются с маленьких ручьёв.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )