Не могу разобраться, как можно реализовать циклическую прокрутку шкалы.
Рисую ее в customview:
public void onDraw(Canvas canvas){
startingPoint = mainPoint;
counter = 0;
for (int i = 1;; i++) {
if (startingPoint > screenSize) {
break;
}
if(i % 4 == 0) {
size = scaleHeight / 4;
counter = counter + 1;
} else {
if(i % 2 == 0) {
size = scaleHeight / 8;
} else {
size = scaleHeight / 16;
}
}
canvas.drawLine(startingPoint, endPoint - size, startingPoint, endPoint, rulerPaint);
if (i % 4 == 0) {
String c = Integer.toString(counter);
canvas.drawText(c, startingPoint, endPoint - (size + 20), textPaint);
}
startingPoint = startingPoint + pxmm;
}
Ограничиваю ее до одиннадцати длинных делений:
Но мне нужна бесконечная шкала:
Допустим, можно убрать проверку значения counter в onDraw методе, но как это скажется на производительности? Даже если ставлю его значение 1000, уже заметны "подлагивания" при скроллинге.
Вот мой onScroll:
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
mainPoint = mainPoint - distanceX;
invalidate();
return true;
}
И onMeasure:
protected void onMeasure(int w, int h) {
DisplayMetrics metrics = new DisplayMetrics(); ((Activity)getContext()).getWindowManager().getDefaultDisplay().getMetrics(metrics);
h = metrics.heightPixels / 5;
w = metrics.widthPixels;
setMeasuredDimension(w, h);
scaleHeight = h;
scaleWidth = w;
screenSize = w;
endPoint = h;
midScreenPoint = w / 2;
pxmm = screenSize / 28;
}
Каким образом реализуются подобные задачи?
Ответ
Надо рисовать шкалу от начала экрана до его конца. Т.е. цикл должен быть не по шкале, а по ширине экрана. А в цикле уже вести счетчик по шкале, как только он достигнет 11, обнулять.
Такой подход позволит легко рисовать и шкалу со смещением, просто присваиваете счетчику шкалы это смещение вначале и готово. Скроллинг будет не нужным.
Комментариев нет:
Отправить комментарий