You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin Forms中使用SkiaSharp在图片上方高亮指定区域的技术问题咨询

如何在图片上方用SkiaSharp绘制高亮区域

根据你提供的代码,目前SKCanvasView在Grid的下方区域,没法覆盖到图片上层,我给你两个简单可行的方案,完美适配你当前的ContentPage结构:

方案一:利用Grid的渲染顺序实现覆盖

Grid里元素的显示层级是按代码书写顺序来的——后面写的元素会自动覆盖在前面的元素之上。你只需要调整SKCanvasView的位置,让它和Image共享同一行,并放在Image代码的后面:

<ContentPage>
  <ContentPage.Content>
    <Grid>
      <!-- 保留你原有的行、列定义 -->
      <Grid.RowDefinitions>
          <RowDefinition Height="Auto"/>
          <!-- 其他行配置... -->
      </Grid.RowDefinitions>
      <Grid.ColumnDefinitions>
          <ColumnDefinition Width="*"/>
          <ColumnDefinition Width="*"/>
          <ColumnDefinition Width="*"/>
      </Grid.ColumnDefinitions>

      <!-- 图片放在前面 -->
      <Image Grid.Column="0" Grid.Row="0" x:Name="myStoryPage" Grid.ColumnSpan="3" Source="你的图片路径"/>
      
      <!-- 上一页、下一页按钮(如果需要让按钮在绘制层上方,就放在SKCanvasView后面) -->
      <Button Grid.Row="1" Grid.Column="0" Text="上一页"/>
      <Button Grid.Row="1" Grid.Column="2" Text="下一页"/>

      <!-- SKCanvasView放在图片后面,共享同一行,直接覆盖在图片上方 -->
      <skiaforms:SKCanvasView x:Name="canvasView" PaintSurface="canvasView_PaintSurface" 
                              Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="3"/>
    </Grid>
  </ContentPage.Content>
</ContentPage>

这个方案最简单,不需要额外容器,完全利用Grid的特性实现层级覆盖,你依然可以通过C#代码动态控制SKCanvasView的大小和绘制内容。

方案二:在Grid行内嵌套AbsoluteLayout实现精准定位

如果需要更灵活的动态位置控制(比如只让绘制层覆盖图片的某一块区域),可以把Image和SKCanvasView放到同一个Grid行的AbsoluteLayout里:

<ContentPage>
  <ContentPage.Content>
    <Grid>
      <!-- 保留你原有的行、列定义 -->
      <Grid.RowDefinitions>
          <RowDefinition Height="Auto"/>
          <RowDefinition Height="Auto"/>
          <!-- 其他行配置... -->
      </Grid.RowDefinitions>
      <Grid.ColumnDefinitions>
          <ColumnDefinition Width="*"/>
          <ColumnDefinition Width="*"/>
          <ColumnDefinition Width="*"/>
      </Grid.ColumnDefinitions>

      <!-- 用AbsoluteLayout包裹图片和绘制层,实现重叠布局 -->
      <AbsoluteLayout Grid.Column="0" Grid.Row="0" Grid.ColumnSpan="3">
          <Image x:Name="myStoryPage" 
                 AbsoluteLayout.LayoutBounds="0,0,1,1" 
                 AbsoluteLayout.LayoutFlags="All" 
                 Source="你的图片路径"/>
          <!-- 这里可以通过LayoutBounds自由控制绘制层的位置、宽高 -->
          <skiaforms:SKCanvasView x:Name="canvasView" 
                                  PaintSurface="canvasView_PaintSurface" 
                                  AbsoluteLayout.LayoutBounds="10,0,5,65" 
                                  AbsoluteLayout.LayoutFlags="None"/>
      </AbsoluteLayout>

      <!-- 上一页、下一页按钮 -->
      <Button Grid.Row="1" Grid.Column="0" Text="上一页"/>
      <Button Grid.Row="1" Grid.Column="2" Text="下一页"/>
    </Grid>
  </ContentPage.Content>
</ContentPage>

在C#代码里,你还能随时动态修改绘制层的位置:

// 示例:把绘制层移到(50,50)位置,宽200高150
AbsoluteLayout.SetLayoutBounds(canvasView, new Rect(50, 50, 200, 150));

这两个方案都不需要改动你当前的ContentPage根布局,直接就能实现图片上方的高亮绘制需求。

内容的提问来源于stack exchange,提问作者Rauf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 08:28:12