Flutter 中的无边框选择高亮效果

Posted

技术标签:

【中文标题】Flutter 中的无边框选择高亮效果【英文标题】:Borderless selection highlight effect in Flutter 【发布时间】:2019-11-13 03:52:26 【问题描述】:

上下文:我正在用 Flutter 重写我的 android 应用程序。在 Android 上,将可点击的Viewbackground 属性设置为?android:selectableItemBackgroundBorderless 时,出现了这种有趣的触摸反馈效果:

请注意,红色边框不在真实 UI 中,它只是为了显示 View 的边框。如您所见,墨迹在矩形视图周围形成了一个圆圈,即circumscribed。

我希望我的 Flutter 应用程序中的墨迹也被限制在视图周围,即 选择区域需要是圆形并包含视图。我试图通过使用来实现这一点InkResponse 组件,但结果看起来很惨:

示例中使用的Scaffold 的正文:

body: Center(
  // Center is a layout widget. It takes a single child and positions it
  // in the middle of the parent.
  child: Material(
    color: Color(0xff008080),
    child: Center(
      child: InkResponse(
        onTap: () 
          /* ... */
        ,
        child: Container(
          child: Center(
            child: Text('BUTTON'),
          ),
          decoration: BoxDecoration(
            border: Border.all(color: Colors.red),
          ),
          width: 200.0,
          height: 200.0,
        ),
        highlightColor: Colors.transparent,
      ),
    ),
  ),
),

如果我使InkResponseradius 属性足够大,它可以超出视图的范围,如果我的视图具有静态大小,我可以调整属性以达到预期的效果,但在我的真实应用它是动态的。

是否可以在不制作自定义组件的情况下做到这一点?

【问题讨论】:

您找到解决方案了吗?有什么方法可以让涟漪效果超出小部件渲染框? 【参考方案1】:

你试过了吗,它的点击是绑定到红色区域的。

Center(
          // Center is a layout widget. It takes a single child and positions it
          // in the middle of the parent.
          child: Material(
            color: Color(0xff008080),
            child: Center(
              child: InkWell(
                onTap: () 
                  /* ... */
                ,
                child: Container(
                  child: Center(
                    child: Text('BUTTON'),
                  ),
                  decoration: BoxDecoration(
                    border: Border.all(color: Colors.red),
                  ),
                ),
                highlightColor: Colors.transparent,
              ),
            ),
          ),
        ),

【讨论】:

感谢您的回答,但我特别感兴趣的是有一个圆形突出显示区域完全包含视图。对不起,如果我没有在我的问题中说清楚。【参考方案2】:

出于这些目的,我认为应该使用InkResponse:

Container(
  width: 80,
  height: 80,
  child: InkResponse(radius: 110, onTap: () , child: Text("text")));

Working Example

【讨论】:

以上是关于Flutter 中的无边框选择高亮效果的主要内容,如果未能解决你的问题,请参考以下文章

在 Qt 上制作一个没有控制框的无边框应用程序

android黑色边框如何去掉

带投影的无边框 TForm

Qt商业级无边框窗口实现源码(windowsmsvc)

创建一个可以在Word中粘贴的无边框表

无边框形式的 Windows 7 样式 Dropshadow