91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

UWP中如何用GetAlphaMask實現陰影

發布時間:2020-06-18 16:56:42 來源:億速云 閱讀:210 作者:元一 欄目:編程語言

1. 前言

要在UWP中制作長陰影的話,可以用GetAlphaMask拿到輪廓,做成灰色,然后復制一百幾十個擺在后面。GetAlphaMask的使用場景十分有限,Github上能搜到的內容都是用來配合DropShadow的,所以這篇文章也以介紹DropShadow為主。

2. 合成陰影

先介紹一下合成陰影。Compositor.CreateDropShadow()可以創建一個DropShadow,將這個DropShadowDropShadow賦值到SpriteVisual的Shadow屬性,然后使用ElementCompositionPreview.SetElementChildVisual 將這個SpriteVisual設置到某個UIElement的可視化層里,再將這個UIElement放到需要陰影的元素后面,這樣基本的合成陰影就完成了。

具體代碼如下:

<Grid VerticalAlignment="Center" 
      HorizontalAlignment="Center">
    <Grid x:Name="BackgroundGrid"/>
    <Grid Background="Turquoise" 
          x:Name="Host">
        <TextBlock Text="I need shadow" 
                   Foreground="White" 
                   HorizontalAlignment="Center"
                   VerticalAlignment="Center"
                   FontSize="36"
                   Margin="16"/>
    </Grid>
</Grid>
private readonly Compositor _compositor;
private readonly SpriteVisual _backgroundVisual;
private readonly DropShadow _dropShadow;
public MainPage() : base()
{
    InitializeComponent();
    _compositor = ElementCompositionPreview.GetElementVisual(this).Compositor;

    //創建并配置DropShadow
    _dropShadow = _compositor.CreateDropShadow();
    _dropShadow.BlurRadius = 16;
    _dropShadow.Offset = new Vector3(8);

    //創建SpriteVisual并設置Shadow
    _backgroundVisual = _compositor.CreateSpriteVisual();
    _backgroundVisual.Shadow = _dropShadow;

    //將SpriteVisual放到可視化樹
    ElementCompositionPreview.SetElementChildVisual(BackgroundGrid, _backgroundVisual);

    Host.SizeChanged += OnHostSizeChanged;
}

private void OnHostSizeChanged(object sender, SizeChangedEventArgs e)
{
    Vector2 newSize = new Vector2(0, 0);
    Vector3 centerPoint = new Vector3(0, 0, 0);
    if (Host != null)
    {
        newSize = new Vector2((float)Host.ActualWidth, (float)Host.ActualHeight);
        centerPoint = new Vector3((float)Host.ActualWidth / 2, (float)Host.ActualHeight / 2, 0);
    }
    _backgroundVisual.CenterPoint = centerPoint;
    _backgroundVisual.Size = newSize;
}

3. 使用GetAlphaMask裁剪陰影

上面的代碼需要可以實現陰影,但只能實現矩形的陰影,在WPF和Silverlight中常用的Shape的陰影,或者文字的陰影都做不出來。

例如將XAML改成這樣的話,結果絕不是我想要的東西:

<Grid VerticalAlignment="Center" 
      HorizontalAlignment="Center">
    <Grid x:Name="BackgroundGrid"/>
    <TextBlock Text="I need shadow" 
                   x:Name="Host"
                   Foreground="Turquoise" 
                   HorizontalAlignment="Center"
                   VerticalAlignment="Center"
                   FontSize="36"/>
</Grid>

這時候就需要用到GetAlphaMask這個函數。

Image、 TextBlock和Shape分別實現一個名為GetAlphaMask的方法, 該方法返回一個CompositionBrush , 該方法表示具有元素形狀的灰度圖像。

官當文檔 中是這樣描述GetAlphaMask函數的,簡單來說就是拿到一個Image、TextBlock或Shape的輪廓,這個輪廓可以作為DropShadow.Mask的值,這樣DropShadow的形狀就可調用GetAlphaMask的元素的形狀一樣了。

具體代碼和結果如下,這才是我想要的效果:

_dropShadow.Mask = Host.GetAlphaMask();

4. 使用DropShadowPanel

如果覺得自己寫代碼太過復雜, 可以使用Toolkit中的DropShadowPanel。

DropShadowPanel繼承自ContentControl,當它的Cotnent為Shape、TextBlock、Image之一(或Toolkit中實現了GetAlphaMask的其它控件)時,它就調用GetAlphaMask獲取陰影的形狀,否則就是簡單的舉行,代碼如下:

CompositionBrush mask = null;

if (Content is Image)
{
    mask = ((Image)Content).GetAlphaMask();
}
else if (Content is Shape)
{
    mask = ((Shape)Content).GetAlphaMask();
}
else if (Content is TextBlock)
{
    mask = ((TextBlock)Content).GetAlphaMask();
}
else if (Content is ImageExBase imageExBase)
{
    imageExBase.ImageExInitialized += ImageExInitialized;

    if (imageExBase.IsInitialized)
    {
        imageExBase.ImageExInitialized -= ImageExInitialized;

        mask = ((ImageExBase)Content).GetAlphaMask();
    }
}

_dropShadow.Mask = mask;

之后它的做法和上面介紹的一樣,把這個陰影設置到一個元素放在ContentPresenter后面,看起來就實現了Content的陰影:

_border = GetTemplateChild(PartShadow) as Border;

if (_border != null)
{
    ElementCompositionPreview.SetElementChildVisual(_border, _shadowVisual);
}
<Grid Background="{TemplateBinding Background}"
      BorderBrush="{TemplateBinding BorderBrush}"
      BorderThickness="{TemplateBinding BorderThickness}"
      HorizontalAlignment="{TemplateBinding HorizontalAlignment}"
      VerticalAlignment="{TemplateBinding VerticalAlignment}">
    <Border x:Name="ShadowElement" 
            HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
            VerticalAlignment="{TemplateBinding VerticalContentAlignment}" />
    <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                      VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
</Grid>
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

张家港市| 桂林市| 斗六市| 枝江市| 惠州市| 濉溪县| 淮南市| 南岸区| 扶沟县| 通渭县| 梅河口市| 鄯善县| 文昌市| 大埔区| 孟津县| 观塘区| 凌源市| 慈利县| 昭觉县| 日喀则市| 海丰县| 望谟县| 裕民县| 新闻| 浦江县| 罗源县| 焦作市| 鄂尔多斯市| 沧源| 隆回县| 绥滨县| 平顺县| 美姑县| 桓台县| 杂多县| 黄石市| 乐亭县| 平果县| 开原市| 德庆县| 星座|