캔버스에 대해 자세히 알아보기
이상하게 들리나요? 잠깐만.
컴포저블은 사용자 인터페이스의 구성 요소입니다. 그대로 사용하거나 사전 구축된 기능으로 수정할 수 있습니다. 먼저, 그대로:
Text("Hello Compose")
컴포저블의 모양과 동작을 모두 맞춤설정하려면 다음을 사용합니다
modifier
.Text(
modifier = Modifier.border(
1.dp,
MaterialTheme.colors.primary
)
.padding(8.dp)
.shadow(4.dp, shape = CircleShape, clip = true),
text = "Hello Compose"
)
보시다시피 보더, 섀도우 및 패딩을 추가하여 컴포저블을 상당히 수정, 수정했습니다. 사전 빌드된 수정자가 많이 있습니다. 그러나 이들 중 어느 것도 귀하의 필요에 맞지 않으면 어떻게 합니까? 직접 굴려보세요. 곧 알게 되겠지만 Compose를 사용하면 매우 쉽습니다. 하지만 먼저 내부 작동 방식을 살펴보겠습니다.
수정자는 수정자 요소의 정렬된 불변 컬렉션입니다.
androidx.compose.ui.Modifier
는 이러한 컬렉션을 정의하는 데 도움이 되는 인터페이스입니다. then()
는 현재 한정자를 나타내는 Modifier
를 반환하고 그 뒤에 다른 시퀀스가 뒤따릅니다. 이 인터페이스를 구현하는 컴패니언 객체도 있습니다. 수정자 확장 팩토리 표현식의 시작으로 사용될 수 있습니다. 이것이 무엇을 의미하는지 곧 알게 될 것입니다. 지금은 padding()
를 살펴보십시오.보시다시피
then()
는 PaddingModifier
를 수신합니다(androidx.compose.foundation.layout.Padding.kt
내부의 개인 클래스). 이것은 그리기보다 레이아웃에 더 많은 영향을 미치므로 이에 대해 자세히 설명하지 않겠습니다. 중요한 사항: this
는 Modifier
인터페이스의 또 다른 구현입니다. 어느 것이 이전에 호출된 다른 확장 함수에 따라 다릅니다. 내 예에서는 border()
가 먼저 호출됩니다. 이제 이 수정자 확장 팩터리 표현을 다루겠습니다. border()
의 일부 라인은 다음과 같습니다.composed()
및 factory
를 받는 inspectorInfo
수정자의 결과를 반환합니다.팩토리는
Modifier
의 구성 가능 기능이자 확장 기능입니다. 그것은 ComposedModifier
로 래핑되고 차례로 then()
로 전달됩니다. ComposedModifier
는 추상InspectorValueInfo
을 확장하고 Modifier.Element
체인에 포함된 단일 요소인 Modifier
를 구현하는 전용 클래스입니다. 하지만 언제 then()
를 사용합니까? 그리고 언제 공장이 선호됩니까? 다행히 대부분의 경우 이러한 질문을 처리할 필요가 없습니다. Modifier
, drawWithContent()
및 drawBehind()
와 같은 몇 가지 확장 함수drawWithCache()
가 있기 때문입니다.fun Modifier.drawOnYellow() = this.drawBehind {
drawRect(Color.Yellow)
}
이 수정자는 함께 수정되는 컴포저블 뒤에 노란색 직사각형을 그립니다.
Text(
modifier = Modifier.drawOnYellow(),
text = "Hello Compose"
)
귀하의 람다는
androidx.compose.ui.graphics.drawscope.DrawScope
인스턴스를 수신합니다. 이 인터페이스는a scoped drawing environment with the provided
Canvas
.
This provides a declarative, stateless API to draw shapes
and paths without requiring consumers to maintain
underlyingCanvas
state information.
다음.
drawWithContent()
레이아웃의 내용 앞이나 뒤에 그릴 수 있습니다.fun Modifier.drawRedCross() = this.drawWithContent {
drawContent()
drawLine(
Color.Red, Offset(0f, 0f),
Offset(size.width - 1, size.height - 1),
blendMode = BlendMode.SrcAtop,
strokeWidth = 8f
)
drawLine(
Color.Red, Offset(0f, size.height - 1),
Offset(size.width - 1, 0f),
blendMode = BlendMode.SrcAtop,
strokeWidth = 8f
)
}
Text(
modifier = Modifier.drawRedCross(),
text = "Imperative"
)
람다에서
drawContent()
의 위치는 콘텐츠가 그려지는 시기를 정의합니다. 마지막으로 drawWithCache()
는a
DrawScope
with content that is persisted across
draw calls as long as the size of the drawing area is
the same or any state objects that are read have not
changed. In the event that the drawing area changes, or
the underlying state values that are being read
change, this method is invoked again to recreate objects
to be used during drawing
이 게시물에서 본 것처럼 캔버스에 그림을 그려 컴포저블을 수정할 수 있는 확장 함수를 작성하는 것은 매우 쉽습니다.
Canvas
와 관련하여 다루었으면 하는 다른 주제가 있습니까? 댓글로 여러분의 생각을 공유해주세요.
Reference
이 문제에 관하여(캔버스에 대해 자세히 알아보기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/tkuenneth/more-on-canvas-70g텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)