метод.
ываясь на моем предыдущем вопросе "Как создать BottomBar в виде StickyBottomCaptureLayout в Camera2 Android API?"Я создал макет сStickyBar
(SB), который всегда заблокирован над / рядом с системной панелью. Я устанавливаю положения по умолчанию и координаты SB и другой макет вonLayout()
(именно таккак мой ответ).
Верхний макет простой обычайDrawView
который имеет ArrayListPath
s нарисовано пользователем. Когда устройство вращается, оно вызываетonDraw()
и звонит несколько разcanvas.drawPath()
, Тем не менееPath
s перерисовываются с теми же координатами, что и раньше, но с другой позицией и размером макета. Эти скриншоты демонстрируют реальное поведение:
слева: портрет - справа: пейзаж
Но я хочу сохранить те же координаты и позиции при изменении ориентации, например так:
слева: тот же портрет, что и выше - справа: пейзаж с «портретными» координатами
Блокировка моей активности сandroid:orientation="portrait"
не ожидаемое решение. я используюandroid:configChanges="orientation"
иOrientationListener
обнаружить вращение и предотвратить полное воссозданиеActivity
.
onLayout()
но, очевидно, это не правильный путь.Я ранее пытался преобразовать множественноеPath
вот так:
for (Path path : mPathList) {
Matrix matrix = new Matrix();
RectF bounds = new RectF();
path.computeBounds(bounds, true);
// center points to rotate
final float px = bounds.centerX();
final float py = bounds.centerY();
// distance points to move
final float dx; // ?
final float dy; // ?
/** I tried many calculations without success, it's
not worth to paste these dumb calculations here... **/
matrix.postRotate(rotation, px, py); // rotation is 90°, -90° or 0
matrix.postTranslate(dx, dy); // ?
path.transform(matrix);
}
Я также попытался повернуть холст следующим образом:
@Override
protected void onDraw(Canvas canvas) {
canvas.save();
canvas.rotate(rotation); // rotation is 90°, -90° or 0
canvas.drawColor(mDrawHelper.getBackgroundViewColor());
for (int i=0; i < mPathList.size(); i++) {
canvas.drawPath(mPathList.get(i), mPaintList.get(i));
}
if (mPath != null && mPaint != null)
canvas.drawPath(mPath, mPaint);
canvas.restore();
}
Во всяком случае, я попробовал много манипуляций, но, похоже, ничего не работает в этом конкретном случае. У кого-нибудь есть яркая и невероятная идея, которой можно поделиться, которая может привести меня в правильном направлении?
Заранее спасибо за помощь.