RenderNode Класс
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
RenderNode используется для создания иерархий отрисовки с аппаратным ускорением.
[Android.Runtime.Register("android/graphics/RenderNode", ApiSince=29, DoNotGenerateAcw=true)]
public sealed class RenderNode : Java.Lang.Object
[<Android.Runtime.Register("android/graphics/RenderNode", ApiSince=29, DoNotGenerateAcw=true)>]
type RenderNode = class
inherit Object
- Наследование
- Атрибуты
Комментарии
RenderNode используется для создания иерархий отрисовки с аппаратным ускорением. Каждый RenderNode содержит как отображаемый список, так и набор свойств, влияющих на отрисовку отображаемого списка. RenderNodes по умолчанию используются для всех представлений и обычно не используются напрямую.
RenderNodes используются для разделения содержимого отрисовки сложной сцены на более мелкие части, которые затем можно обновлять по отдельности более дешево. Для обновления части сцены требуется только обновить отображаемый список или свойства небольшого количества RenderNode, а не перерисовывать все с нуля. Для RenderNode требуется перезапись отображаемого списка только в том случае, если его содержимое должно быть изменено. RenderNodes также можно преобразовать без повторной записи отображаемого списка с помощью свойств преобразования.
Текстовый редактор может, например, хранить каждый абзац в собственном RenderNode. Таким образом, когда пользователь вставляет или удаляет символы, необходимо снова записать только отображаемый список затронутого абзаца.
<h3>Аппаратное ускорение</h3>
RenderNodes можно нарисовать с помощью RecordingCanvas
. Они не поддерживаются программным обеспечением. Всегда убедитесь, что объект, android.graphics.Canvas
который используется для отрисовки списка отображения, является аппаратным ускорением с помощью android.graphics.Canvas#isHardwareAccelerated()
.
<h3>Создание RenderNode</h3>
RenderNode renderNode = new RenderNode("myRenderNode");
renderNode.setPosition(0, 0, 50, 50); // Set the size to 50x50
RecordingCanvas canvas = renderNode.beginRecording();
try {
// Draw with the canvas
canvas.drawRect(...);
} finally {
renderNode.endRecording();
}
<h3>Рисование RenderNode в представлении</h3>
protected void onDraw(Canvas canvas) {
if (canvas.isHardwareAccelerated()) {
// Check that the RenderNode has a display list, re-recording it if it does not.
if (!myRenderNode.hasDisplayList()) {
updateDisplayList(myRenderNode);
}
// Draw the RenderNode into this canvas.
canvas.drawRenderNode(myRenderNode);
}
}
<h3>Освобождение ресурсов</h3>
Этот шаг не является обязательным, но рекомендуется, если вы хотите как можно скорее освободить ресурсы, хранящиеся в отображаемом списке. Наиболее важно любые растровые изображения, которые он может содержать.
// Discards the display list content allowing for any held resources to be released.
// After calling this
renderNode.discardDisplayList();
<Свойства< h3>/h3>
Кроме того, RenderNode предлагает несколько свойств, таких как #setScaleX(float)
или #setTranslationX(float)
, которые можно использовать для влияния на все команды рисования, записанные в . Например, эти свойства можно использовать для перемещения по большому количеству изображений без повторной выдачи всех отдельных canvas.drawBitmap()
вызовов.
private void createDisplayList() {
mRenderNode = new RenderNode("MyRenderNode");
mRenderNode.setPosition(0, 0, width, height);
RecordingCanvas canvas = mRenderNode.beginRecording();
try {
for (Bitmap b : mBitmaps) {
canvas.drawBitmap(b, 0.0f, 0.0f, null);
canvas.translate(0.0f, b.getHeight());
}
} finally {
mRenderNode.endRecording();
}
}
protected void onDraw(Canvas canvas) {
if (canvas.isHardwareAccelerated())
canvas.drawRenderNode(mRenderNode);
}
}
private void moveContentBy(int x) {
// This will move all the bitmaps recorded inside the display list
// by x pixels to the right and redraw this view. All the commands
// recorded in createDisplayList() won't be re-issued, only onDraw()
// will be invoked and will execute very quickly
mRenderNode.offsetLeftAndRight(x);
invalidate();
}
Некоторые свойства могут сначала оказаться избыточными, например #setElevation(float)
и #setTranslationZ(float)
. Причина этих дубликатов заключается в том, чтобы обеспечить разделение между статическими & временными использованиями. Например, рассмотрим кнопку, которая поднимается с 2dp до 8dp при нажатии. Для этого приложение может принять решение setElevation(2dip), а затем при нажатии клавиши анимировать setTranslationZ на 6dip. В сочетании это достигает конечного желаемого значения 8dip, но анимация должна заниматься только анимацией подъема после нажатия без необходимости знать начальное значение. #setTranslationX(float)
и #setTranslationY(float)
аналогичным образом предоставляются для анимации, несмотря на функциональное перекрытие с #setPosition(Rect)
.
Матрица преобразования RenderNode вычисляется во время отрисовки следующим образом:
Matrix transform = new Matrix();
transform.setTranslate(renderNode.getTranslationX(), renderNode.getTranslationY());
transform.preRotate(renderNode.getRotationZ(),
renderNode.getPivotX(), renderNode.getPivotY());
transform.preScale(renderNode.getScaleX(), renderNode.getScaleY(),
renderNode.getPivotX(), renderNode.getPivotY());
Текущая матрица преобразования холста, которая преобразуется в позицию RenderNode, затем умножается на матрицу преобразования RenderNode. Поэтому упорядочение вызывающих методы задания свойств не влияет на результат. Это значит, что:
renderNode.setTranslationX(100);
renderNode.setScaleX(100);
эквивалентно правилу
renderNode.setScaleX(100);
renderNode.setTranslationX(100);
<h3>Threading</h3>
RenderNode можно создать и использовать в любом потоке, но он не является потокобезопасной. Только один поток может взаимодействовать с RenderNode в любой момент времени. Очень важно, чтобы RenderNode использовался только в том же потоке, с которым он рисуется. Например, при использовании RenderNode с пользовательским представлением этот RenderNode должен использоваться только из потока пользовательского интерфейса.
<h3>Когда повторно отрисовка</h3>
Многие методы изменения RenderNode, например #setTranslationX(float)
, возвращают логическое значение, указывающее, действительно ли изменилось значение. Это полезно при определении необходимости отрисовки нового кадра. Типичное использование будет выглядеть следующим образом:
public void translateTo(int x, int y) {
boolean needsUpdate = myRenderNode.setTranslationX(x);
needsUpdate |= myRenderNode.setTranslationY(y);
if (needsUpdate) {
myOwningView.invalidate();
}
}
Это немного быстрее, чем выполнение более явного предварительного проверка, если значение изменилось путем сравнения требуемого значения с#getTranslationX()
, так как это сводит к минимуму переходы JNI. Фактический механизм запроса на отрисовку нового кадра будет зависеть от того, как рисуется этот объект RenderNode. Если он отрисовывается к содержательному представлению, как показано в приведенном выше фрагменте, просто сделать представление недействительным. Если вместо этого RenderNode рисуется непосредственно в Canvas, например с Surface#lockHardwareCanvas()
, то необходимо нарисовать новый кадр путем вызова Surface#lockHardwareCanvas()
, повторного рисования корневого RenderNode или любого содержимого верхнего уровня и, наконец, вызова Surface#unlockCanvasAndPost(Canvas)
. </p>
Документация по Java для android.graphics.RenderNode
.
Части этой страницы являются изменениями, основанными на работе, созданной и совместно используемой проектом Android и используемой в соответствии с условиями, Creative Commons 2.5 Attribution License.
Конструкторы
RenderNode(String) |
Создает новый RenderNode, который можно использовать для записи пакетов операций рисования и хранения и применения свойств отрисовки при рисовании. |
Свойства
Alpha |
Возвращает уровень полупрозрачность этого отображаемого списка. |
AmbientShadowColor |
RenderNode используется для создания иерархий отрисовки с аппаратным ускорением. |
Bottom |
Возвращает нижнюю позицию для RenderNode. |
CameraDistance |
Возвращает расстояние в Z камеры для этого RenderNode. |
Class |
Возвращает класс среды выполнения данного объекта |
ClipToBounds |
Возвращает значение, указывающее, является ли RenderNode обрезки границ. |
ClipToOutline |
См. раздел |
Elevation |
См. раздел |
Handle |
Дескриптор базового экземпляра Android. (Унаследовано от Object) |
HasDisplayList |
Возвращает значение, указывающее, имеет ли RenderNode отображаемый список. |
HasIdentityMatrix |
Указывает, имеет ли RenderNode преобразование идентификатора. |
HasOverlappingRendering |
Указывает, перекрывается ли содержимое этого отображаемого списка. |
HasShadow |
Проверяет, есть ли у RenderNode тень. |
Height |
Возвращает высоту RenderNode, которая является нижней — верхней. |
IsForceDarkAllowed |
См. раздел |
IsPivotExplicitlySet |
RenderNode используется для создания иерархий отрисовки с аппаратным ускорением. |
JniIdentityHashCode |
RenderNode используется для создания иерархий отрисовки с аппаратным ускорением. (Унаследовано от Object) |
JniPeerMembers |
RenderNode используется для создания иерархий отрисовки с аппаратным ускорением. |
Left |
Получает левую позицию для RenderNode. |
PeerReference |
RenderNode используется для создания иерархий отрисовки с аппаратным ускорением. (Унаследовано от Object) |
PivotX |
Возвращает сводное значение для этого отображаемого списка на оси X в пикселях. |
PivotY |
Возвращает сводное значение для этого отображаемого списка на оси Y в пикселях. |
Right |
Возвращает правильную позицию для RenderNode. |
RotationX |
Возвращает значение поворота для этого отображаемого списка вокруг оси X в градусах. |
RotationY |
Возвращает значение поворота для этого отображаемого списка вокруг оси Y в градусах. |
RotationZ |
Возвращает значение поворота для этого отображаемого списка вокруг оси Z в градусах. |
ScaleX |
Возвращает значение масштаба для этого отображаемого списка на оси X. |
ScaleY |
Возвращает значение масштаба для этого отображаемого списка на оси Y. |
SpotShadowColor |
RenderNode используется для создания иерархий отрисовки с аппаратным ускорением. |
ThresholdClass |
Этот API поддерживает инфраструктуру Mono для Android и не предназначен для использования непосредственно из кода. (Унаследовано от Object) |
ThresholdType |
Этот API поддерживает инфраструктуру Mono для Android и не предназначен для использования непосредственно из кода. (Унаследовано от Object) |
Top |
Возвращает верхнюю позицию для RenderNode. |
TranslationX |
Возвращает значение преобразования для этого отображаемого списка на оси X в пикселях. |
TranslationY |
Возвращает значение преобразования для этого отображаемого списка на оси Y в пикселях. |
TranslationZ |
Возвращает значение преобразования для этого отображаемого списка на оси Z. |
UniqueId |
Возвращает уникальный идентификатор, идентифицирующий этот RenderNode. |
UseCompositingLayer |
Возвращает значение, указывающее, требуется ли принудительное использование слоя компоновки. |
Width |
Возвращает ширину RenderNode, который является правым и левым. |
Методы
BeginRecording() |
|
BeginRecording(Int32, Int32) |
Начинает запись отображаемого списка для узла рендеринга. |
Clone() |
Создает и возвращает копию этого объекта. (Унаследовано от Object) |
ComputeApproximateMemoryUsage() |
Возвращает приблизительное использование памяти RenderNode в целях отладки. |
DiscardDisplayList() |
Сброс собственных ресурсов. |
Dispose() |
RenderNode используется для создания иерархий отрисовки с аппаратным ускорением. (Унаследовано от Object) |
Dispose(Boolean) |
RenderNode используется для создания иерархий отрисовки с аппаратным ускорением. (Унаследовано от Object) |
EndRecording() |
' Завершает запись для этого отображаемого списка. |
Equals(Object) |
Указывает, равен ли какой-то другой объект этому объекту. (Унаследовано от Object) |
GetHashCode() |
Возвращает значение хэш-кода для объекта. (Унаследовано от Object) |
GetInverseMatrix(Matrix) |
Возвращает текущее инвертированное преобразование. |
GetMatrix(Matrix) |
Возвращает текущую матрицу преобразования. |
JavaFinalize() |
Вызывается сборщиком мусора для объекта , когда сборка мусора определяет, что больше нет ссылок на объект . (Унаследовано от Object) |
Notify() |
Пробуждает один поток, ожидающий монитора этого объекта. (Унаследовано от Object) |
NotifyAll() |
Пробуждает все потоки, ожидающие на мониторе этого объекта. (Унаследовано от Object) |
OffsetLeftAndRight(Int32) |
Смещение левой и правой позиций для RenderNode |
OffsetTopAndBottom(Int32) |
Смещает верхние и нижние значения для RenderNode. |
ResetPivot() |
Очищает все сведения, ранее заданные при вызове |
SetAlpha(Single) |
Задает уровень полупрозрачность для отображаемого списка. |
SetAmbientShadowColor(Color) |
Задает цвет внешней тени, которая рисуется, когда RenderNode имеет положительное значение Z или высоты и рисуется внутри |
SetCameraDistance(Single) |
Задает расстояние вдоль оси Z (ортогональной до плоскости X/Y, на которой рисуются renderNodes) от камеры до этого RenderNode. |
SetClipRect(Rect) |
Задает дополнительный клип на RenderNode. |
SetClipToBounds(Boolean) |
Задайте, должен ли узел Render обрезать себя до своих границ. |
SetClipToOutline(Boolean) |
Включает или отключает вырезку в структуре. |
SetElevation(Single) |
Задает базовое повышение этого RenderNode в пикселях |
SetForceDarkAllowed(Boolean) |
Указывает, следует ли разрешить принудительное применение dark к этому RenderNode. |
SetHandle(IntPtr, JniHandleOwnership) |
Задает свойство Handle. (Унаследовано от Object) |
SetHasOverlappingRendering(Boolean) |
Задает значение, указывающее, отображает ли отображаемый список перекрывающееся содержимое. |
SetOutline(Outline) |
Задает контур, определяя фигуру, которая создает тень, и путь для обрезания, если задан setClipToOutline. |
SetPivotX(Single) |
Задает сводное значение для отображаемого списка на оси X |
SetPivotY(Single) |
Задает сводное значение для отображаемого списка на оси Y |
SetPosition(Int32, Int32, Int32, Int32) |
Задает положение RenderNode. |
SetPosition(Rect) |
Задает положение RenderNode. |
SetProjectBackwards(Boolean) |
Задает, должен ли объект RenderNode быть нарисован сразу после ближайшего предка RenderNode, содержащего приемник проекции. |
SetProjectionReceiver(Boolean) |
Задает, является ли RenderNode приемником проекции. |
SetRenderEffect(RenderEffect) |
Настройте для |
SetRotationX(Single) |
Задает значение поворота для отображаемого списка вокруг оси X. |
SetRotationY(Single) |
Задает значение поворота для отображаемого списка вокруг оси Y. |
SetRotationZ(Single) |
Задает значение поворота для отображаемого списка вокруг оси Z. |
SetScaleX(Single) |
Задает значение масштаба для отображаемого списка на оси X. |
SetScaleY(Single) |
Задает значение масштаба для отображаемого списка на оси Y. |
SetSpotShadowColor(Color) |
Задает цвет плашечной тени, которая рисуется, когда RenderNode имеет положительное значение Z или высоты и рисуется внутри |
SetTranslationX(Single) |
Задает значение преобразования для отображаемого списка на оси X. |
SetTranslationY(Single) |
Задает значение преобразования для отображаемого списка на оси Y. |
SetTranslationZ(Single) |
Задает значение преобразования для отображаемого списка на оси Z. |
SetUseCompositingLayer(Boolean, Paint) |
Определяет, следует ли принудить этот RenderNode отображаться в промежуточном буфере. |
ToArray<T>() |
RenderNode используется для создания иерархий отрисовки с аппаратным ускорением. (Унаследовано от Object) |
ToString() |
Возвращает строковое представление объекта. (Унаследовано от Object) |
UnregisterFromRuntime() |
RenderNode используется для создания иерархий отрисовки с аппаратным ускорением. (Унаследовано от Object) |
Wait() |
Вызывает ожидание текущего потока, пока он не пробудится, как правило, из-за <уведомления><<> или>прерывания или прерывания.>< (Унаследовано от Object) |
Wait(Int64) |
Вызывает ожидание текущего потока, пока он не пробудится, как правило, путем <уведомления><<> или>прерывания или прерывания<> или до истечения определенного количества реального времени. (Унаследовано от Object) |
Wait(Int64, Int32) |
Вызывает ожидание текущего потока, пока он не пробудится, как правило, путем <уведомления><<> или>прерывания или прерывания<> или до истечения определенного количества реального времени. (Унаследовано от Object) |
Явные реализации интерфейса
IJavaPeerable.Disposed() |
RenderNode используется для создания иерархий отрисовки с аппаратным ускорением. (Унаследовано от Object) |
IJavaPeerable.DisposeUnlessReferenced() |
RenderNode используется для создания иерархий отрисовки с аппаратным ускорением. (Унаследовано от Object) |
IJavaPeerable.Finalized() |
RenderNode используется для создания иерархий отрисовки с аппаратным ускорением. (Унаследовано от Object) |
IJavaPeerable.JniManagedPeerState |
RenderNode используется для создания иерархий отрисовки с аппаратным ускорением. (Унаследовано от Object) |
IJavaPeerable.SetJniIdentityHashCode(Int32) |
RenderNode используется для создания иерархий отрисовки с аппаратным ускорением. (Унаследовано от Object) |
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
RenderNode используется для создания иерархий отрисовки с аппаратным ускорением. (Унаследовано от Object) |
IJavaPeerable.SetPeerReference(JniObjectReference) |
RenderNode используется для создания иерархий отрисовки с аппаратным ускорением. (Унаследовано от Object) |
Методы расширения
JavaCast<TResult>(IJavaObject) |
Выполняет преобразование типа, проверенного средой выполнения Android. |
JavaCast<TResult>(IJavaObject) |
RenderNode используется для создания иерархий отрисовки с аппаратным ускорением. |
GetJniTypeName(IJavaPeerable) |
RenderNode используется для создания иерархий отрисовки с аппаратным ускорением. |