近来合营社老总给了个职责让自己做2个基于Json格式的富文本UMG插件,领会UE4Slate的都应当掌握,其实UE四中自带了三个富文本Slate控件—SRichTextBlock,该控件首即使对XML文本实行解析,落成了Fancy
Text,Hyperlink,Wiget,Image的效劳,本文将SRichTextBlock的兑现方式做二个简约的辨析,也算是专门的学问笔记吧。

UE4随笔

void SRichTextBlock::Construct( const FArguments& InArgs )
{
BoundText = InArgs._Text;
HighlightText = InArgs._HighlightText;

TextStyle = *InArgs._TextStyle;
WrapTextAt = InArgs._WrapTextAt;
AutoWrapText = InArgs._AutoWrapText;
WrappingPolicy = InArgs._WrappingPolicy;
Margin = InArgs._Margin;
LineHeightPercentage = InArgs._LineHeightPercentage;
Justification = InArgs._Justification;
MinDesiredWidth = InArgs._MinDesiredWidth;

{
    TSharedPtr<IRichTextMarkupParser> Parser = InArgs._Parser;
    if ( !Parser.IsValid() )
    {
        Parser = FDefaultRichTextMarkupParser::Create();
    }

    TSharedPtr<FRichTextLayoutMarshaller> Marshaller = InArgs._Marshaller;
    if (!Marshaller.IsValid())
    {
        Marshaller = FRichTextLayoutMarshaller::Create(Parser, nullptr, InArgs._Decorators, InArgs._DecoratorStyleSet);
    }

    for (const TSharedRef< ITextDecorator >& Decorator : InArgs.InlineDecorators)
    {
        Marshaller->AppendInlineDecorator(Decorator);
    }

    TextLayoutCache = MakeUnique<FTextBlockLayout>(TextStyle, InArgs._TextShapingMethod, InArgs._TextFlowDirection, InArgs._CreateSlateTextLayout, Marshaller.ToSharedRef(), nullptr);
    TextLayoutCache->SetDebugSourceInfo(TAttribute<FString>::Create(TAttribute<FString>::FGetter::CreateLambda([this]{ return FReflectionMetaData::GetWidgetDebugInfo(this); })));
}
}

int32 SRichTextBlock::OnPaint( const FPaintArgs& Args, const FGeometry&         AllottedGeometry, const FSlateRect& MyCullingRect, FSlateWindowElementList& OutDrawElements, int32 LayerId, const FWidgetStyle& InWidgetStyle, bool bParentEnabled ) const
{
// OnPaint will also update the text layout cache if required
LayerId = TextLayoutCache->OnPaint(Args, AllottedGeometry, MyCullingRect, OutDrawElements, LayerId, InWidgetStyle, ShouldBeEnabled(bParentEnabled));

return LayerId;
}

通过分析以上代码,简单看出,SRichTextBlock是在 TUniquePtr<
FTextBlockLayout > TextLayoutCache
中达成的,在TextLayoutCache的贯彻进度中都经验了哪些步骤呢?
一、构造Parser,用于解析XML文本,解析结果存储在FTextLineParseResults中,FTextLineParseResults中有多少个分子变量FTextRange
Range,TArray< FTextRunParseResults >
Runs,个中Range表示解析文本的限制,Runs中贮存了每一种要素的渲染属性,其结构如下所示:

struct SLATE_API FTextRunParseResults
{
FTextRunParseResults( FString InName, const FTextRange& InOriginalRange)
    : Name( InName )
    , OriginalRange( InOriginalRange )
    , MetaData()
{

}

FTextRunParseResults( FString InName, const FTextRange& InOriginalRange, const FTextRange& InContentRange)
    : Name( InName )
    , OriginalRange( InOriginalRange )
    , ContentRange( InContentRange )
    , MetaData()
{

}

FString Name;
FTextRange OriginalRange;
FTextRange ContentRange;
TMap< FString, FTextRange > MetaData; 

};

Name为因素名称,OriginalRange为3个要素如Image在XML文本中的范围,ContentRange为要素所带文本在XML文本中的范围如Hyperlink中的文本,MeteData存款和储蓄了要素的脾性消息。

2、构造Decorator,用于获取要素对应的Style并创办响应的ISlateRun如FSlateImageRun,每一种成分都有3个一见还是的ISlateRun,要素的渲染在其相应的ISlateRun的OnPaint中完成。

叁、构造马歇尔er,马歇尔er其实正是一个代理,其效果是在TextLayOutCache中施行Parser和Decorator的有关操作。

类的架构图如下所示:

SRichTextBlock架构图

对富文本的辨析就先写到这里,内容只是点到结束,不甚透顶可是希望得以对大家有所帮忙!

相关文章

网站地图xml地图