<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      UE 實現英雄聯盟手游 備注名文本超框自動截斷

      UE 實現英雄聯盟手游 備注名文本超框自動截斷

      效果如圖

      需求由來

      • 策劃要求

      實現流程

      • UTextBlock 新增一個超框截斷功能開關
      • 獲取TextBlock的Size X長度
      • 獲取STextBlock文本渲染需要長度
      • 判斷文本長度是否超過設計長度
      • 循環減少字符直至滿足設計長度

      關鍵代碼(這里只展示修改源碼情況 也可以使用繼承 復寫)

      • UTextBlock.h

        public:
           /** 超框自動截斷 填補"..." */
           UPROPERTY(EditAnywhere, BlueprintReadOnly, Category=Appearance, AdvancedDisplay)
           bool bAutoCut;
           
        protected:
           virtual TSharedRef<SWidget> RebuildWidget() override;
        
      • UTextBlock.cpp

        TSharedRef<SWidget> UTextBlock::RebuildWidget()
        {
           if (bWrapWithInvalidationPanel && !IsDesignTime())
           {
              TSharedPtr<SWidget> RetWidget = SNew(SInvalidationPanel)
              [
                 SAssignNew(MyTextBlock, STextBlock)
                 .SimpleTextMode(bSimpleTextMode)
              ];
              return RetWidget.ToSharedRef();
           }
           else
           {
              MyTextBlock =
                 SNew(STextBlock)
                 .SimpleTextMode(bSimpleTextMode);
        
              MyTextBlock->SetAutoCut(bAutoCut);
        
              return MyTextBlock.ToSharedRef();
           }
        }
        
      • STextBlock.h

        private:
            /** 超框自動截斷 填補"..." */
            bool bAutoCut = false;
        public:
        	void SetAutoCut(bool AutoCut);
        
      • STextBlock.cpp

        void STextBlock::SetAutoCut(bool AutoCut)
        {
           bAutoCut = AutoCut;
        }
        FVector2D STextBlock::ComputeDesiredSize(float LayoutScaleMultiplier) const
        {
        	SCOPE_CYCLE_COUNTER(Stat_SlateTextBlockCDS);
        
        	if (bSimpleTextMode)
        	{
        		const FVector2D LocalShadowOffset = GetShadowOffset();
        
        		const float LocalOutlineSize = GetFont().OutlineSettings.OutlineSize;
        
        		// Account for the outline width impacting both size of the text by multiplying by 2
        		// Outline size in Y is accounted for in MaxHeight calculation in Measure()
        		const FVector2D ComputedOutlineSize(LocalOutlineSize * 2, LocalOutlineSize);
        		const FVector2D TextSize = FSlateApplication::Get().GetRenderer()->GetFontMeasureService()->Measure(GetText(), GetFont()) + ComputedOutlineSize + LocalShadowOffset;
        
        		CachedSimpleDesiredSize = FVector2D(FMath::Max(MinDesiredWidth.Get(0.0f), TextSize.X), TextSize.Y);
        		return CachedSimpleDesiredSize.GetValue();
        	}
        	else
        	{
        		if (bAutoCut != true)
        		{
        			// ComputeDesiredSize will also update the text layout cache if required
        			const FVector2D TextSize = TextLayoutCache->ComputeDesiredSize(
        				FSlateTextBlockLayout::FWidgetArgs(BoundText, HighlightText, WrapTextAt, AutoWrapText, WrappingPolicy, TransformPolicy, Margin, LineHeightPercentage, Justification),
        				LayoutScaleMultiplier, GetComputedTextStyle()
        			);
        
        			return FVector2D(FMath::Max(MinDesiredWidth.Get(0.0f), TextSize.X), TextSize.Y);
        		}
        		else
        		{
        			TAttribute<FText> DisplayText = BoundText;
        			const FString BoundString = BoundText.Get(FText::GetEmpty()).ToString();
        			int Lenght = 0;
        			do
        			{
        				const FVector2D TextSize = TextLayoutCache->ComputeDesiredSize(
        					FSlateTextBlockLayout::FWidgetArgs(DisplayText, HighlightText, WrapTextAt, AutoWrapText, WrappingPolicy, TransformPolicy, Margin, LineHeightPercentage, Justification),
        					LayoutScaleMultiplier, GetComputedTextStyle()
        				);
        				
        				const FVector2D DisplayTextSize = FVector2D(FMath::Max(MinDesiredWidth.Get(0.0f), TextSize.X), TextSize.Y);
        				//容器寬度大于文本顯示寬度
        				if (GetTickSpaceGeometry().GetLocalSize().X >= DisplayTextSize.X)
        				{
        					return DisplayTextSize;
        				}
        
        				Lenght++;
        
        				//處理截取到最后一個字符 還超框的情況
        				if (Lenght == BoundString.Len())
        				{
        					return DisplayTextSize;
        				}
        		
        				FString NewBoundString = BoundString.Left(BoundString.Len() - Lenght) + "...";
        		
        				FText NewText = FText::FromString(NewBoundString);
        		
        				DisplayText = TAttribute<FText>::Create(TAttribute<FText>::FGetter::CreateLambda(
        					[NewText]()
        					{
        						return NewText;
        					}));
        			}
        			while (true);
        		}
        	}
        }
        
      posted @ 2021-11-12 19:56  鄒強  閱讀(325)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 7878成人国产在线观看| 四虎国产精品永久地址99| 国产超碰无码最新上传| 不卡在线一区二区三区视频| 日韩在线视频线观看一区| 17岁日本免费bd完整版观看| 久久精品第九区免费观看| 亚洲色丰满少妇高潮18p| 日本边添边摸边做边爱喷水| 亚洲色最新高清AV网站| 色欧美片视频在线观看| 99久久久无码国产精品免费| 亚在线观看免费视频入口| 亚洲最大天堂在线看视频| 国产成人精品无码免费看夜聊软件 | 免费吃奶摸下激烈视频| 国产免费播放一区二区三区| 亚洲在线一区二区三区四区| 亚洲中文字幕在线二页| 国产精品无码a∨麻豆| 亚洲国产成人无码电影| 国产成人不卡无码免费视频| 最新国产精品亚洲| 国产一区二区三区黄色片| 亚洲国产成人字幕久久| AV最新高清无码专区| 小嫩模无套内谢第一次| 久久久亚洲精品无码| 九九成人免费视频| 欧美极品色午夜在线视频| 国产草草影院ccyycom| 国产福利永久在线视频无毒不卡| 欧洲熟妇色xxxxx欧美| 亚洲国产欧美一区二区好看电影| 激情综合色综合久久综合 | 牲欲强的熟妇农村老妇女视频| 精品国产精品午夜福利| 肥臀浪妇太爽了快点再快点| 黄石市| 精品人妻蜜臀一区二区三区| 伊人久久大香线蕉aⅴ色|