我有以下代码片段,我想使图像褪色,以免它干扰容器中的其他项目.是否有可以实现此目的的过滤器?
child: new Card(
child: new Container(
decoration: new BoxDecoration(
color: const Color(0xff7c94b6),
image: new DecorationImage(
image: new ExactAssetImage('lib/images/pic1.jpg'),
)
)
)
)
Run Code Online (Sandbox Code Playgroud)
Col*_*son 44
您可以将DecorationImagea设置ColorFilter为使背景图像变为灰色(使用saturation滤色镜)或半透明(使用dstATop滤色镜).
此示例的代码如下.
import 'package:flutter/material.dart';
void main() {
runApp(new MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
home: new HomePage(),
);
}
}
class HomePage extends StatelessWidget {
@override
Widget build(BuildContext context) => new Scaffold(
appBar: new AppBar(
title: new Text('Grey Example'),
),
body: new Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
new Card(
child: new Container(
child: new Text(
'Hello world',
style: Theme.of(context).textTheme.display4
),
decoration: new BoxDecoration(
color: const Color(0xff7c94b6),
image: new DecorationImage(
fit: BoxFit.cover,
colorFilter: new ColorFilter.mode(Colors.black.withOpacity(0.2), BlendMode.dstATop),
image: new NetworkImage(
'http://www.allwhitebackground.com/images/2/2582-190x190.jpg',
),
),
),
),
),
],
),
);
}
Run Code Online (Sandbox Code Playgroud)
该Opacity插件是另一种选择.
您也可以预先将效果应用于资产.
Cop*_*oad 22
你可以简单地使用
ColorFiltered(
colorFilter: ColorFilter.mode(Colors.black.withOpacity(0.2), BlendMode.dstATop),
child: YourWidget(),
)
Run Code Online (Sandbox Code Playgroud)
Ksh*_*ani 16
您可以简单地使用 Stack 小部件并在图像上方使用一个简单的彩色容器,降低不透明度。
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter/rendering.dart';
import './page2.dart';
import './page3.dart';
import './page4.dart';
void main() {
debugPaintSizeEnabled = true ;
return runApp(Start());
}
class Start extends StatelessWidget {
@override
Widget build(BuildContext context) {
// TODO: implement build
return MaterialApp(
title: 'InIt',
home: Builder(builder: (context) {
return GestureDetector(
onTap: () {
return Navigator.push(
context,
MaterialPageRoute(
builder: (BuildContext context) {
return Page2();
},
),
);
},
child: Scaffold(
body: Stack(
children: <Widget>[
Container(
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage('images/page1.jpg'),
fit: BoxFit.fitHeight),
),
),
Container(
color: Color.fromRGBO(255, 255, 255, 0.19),
),
Container(
alignment: Alignment.center,
child: Center(
child: Text(
'LETS BE PRODUCTIVE TODAY',
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 50.0,
fontFamily: 'bold',
fontWeight: FontWeight.bold,
color: Color.fromRGBO(255, 255, 255, 1)),
),
),
),
Container(
margin: EdgeInsets.only(bottom: 10.0),
alignment: Alignment.bottomCenter,
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
RawMaterialButton(
onPressed: () {},
constraints:
BoxConstraints.tightFor(height: 10.0, width: 10.0),
shape: CircleBorder(),
fillColor: Colors.white,
),
Page2call(),
Page3call(),
Page4call(),
],
),
)
],
),
),
);
}),
);
}
}
class Page2call extends StatelessWidget {
@override
Widget build(BuildContext context) {
// TODO: implement build
return RawMaterialButton(
onPressed: () {
return Navigator.push(
context,
MaterialPageRoute(
builder: (BuildContext context) {
return Page2();
},
),
);
},
constraints: BoxConstraints.tightFor(height: 10.0, width: 10.0),
shape: CircleBorder(),
fillColor: Colors.white,
);
}
}
class Page3call extends StatelessWidget {
@override
Widget build(BuildContext context) {
// TODO: implement build
return RawMaterialButton(
onPressed: () {
return Navigator.push(
context,
MaterialPageRoute(
builder: (BuildContext context) {
return Page3();
},
),
);
},
constraints: BoxConstraints.tightFor(height: 10.0, width: 10.0),
shape: CircleBorder(),
fillColor: Colors.white,
);
}
}
class Page4call extends StatelessWidget {
@override
Widget build(BuildContext context) {
// TODO: implement build
return RawMaterialButton(
onPressed: () {
return Navigator.push(
context,
MaterialPageRoute(
builder: (BuildContext context) {
return Page4();
},
),
);
},
constraints: BoxConstraints.tightFor(height: 10.0, width: 10.0),
shape: CircleBorder(),
fillColor: Colors.white,
);
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个完全实际实现的示例。您可以在此处增加不透明度以使背景更加褪色,第四个参数是不透明度:
Container(
color: Color.fromRGBO(255, 255, 255, 0.19),
),
Run Code Online (Sandbox Code Playgroud)
这种方法还使您能够选择淡入淡出过滤器的颜色。
fzy*_*cjy 10
对于那些谁不知道的是否表现正常与否(因为图像和透明度都是非常耗费资源重的东西),这是我挖成文档和源代码和答案。
结论:使用DecorationImage(colorFilter: ...)将与官方文档建议的一样快。(但是Opacity,ColorFilter小部件不是)
首先,我们应不使用Opacity或ColorFilter窗口小部件,因为它可能引发saveLayer和昂贵(由官方文档)。
相反,我们应该
仅在必要时使用不透明度小部件。有关将不透明度直接应用于图像的示例,请参阅 Opacity API 页面中的透明图像部分,这比使用 Opacity 小部件更快。
查看建议的方法,我们看到以下示例:
Image.network(
'https://raw.githubusercontent.com/flutter/assets-for-api-docs/master/packages/diagrams/assets/blend_mode_destination.jpeg',
color: Color.fromRGBO(255, 255, 255, 0.5),
colorBlendMode: BlendMode.modulate
)
Run Code Online (Sandbox Code Playgroud)
现在,问题是,高投票的答案,即以下代码,是否与官方文档提到的Image小部件一样快?
Container(
child: Text('hi'),
decoration: BoxDecoration(
color: const Color(0xff7c94b6),
image: new DecorationImage(
fit: BoxFit.cover,
colorFilter: new ColorFilter.mode(Colors.black.withOpacity(0.2), BlendMode.dstATop),
image: new NetworkImage(
'http://www.allwhitebackground.com/images/2/2582-190x190.jpg',
),
),
),
),
Run Code Online (Sandbox Code Playgroud)
要回答这个问题,让我们看看Image.network的来源。此构造方法将直接填写colorBlendMode的领域Image。
在Image's 中build,它将直接传递到RawImage'scolorBlendMode字段。
然后,RawImage将创建RenderImage(这是一个 RenderObject)并更新RenderImage._colorBlendMode.
接下来,注意 RenderImage 如何处理这个 -
BlendMode? _colorBlendMode;
set colorBlendMode(BlendMode? value) {
if (value == _colorBlendMode)
return;
_colorBlendMode = value;
_updateColorFilter();
markNeedsPaint();
}
...
/// If non-null, this color is blended with each image pixel using [colorBlendMode].
Color? get color => _color;
Color? _color;
set color(Color? value) {
if (value == _color)
return;
_color = value;
_updateColorFilter();
markNeedsPaint();
}
...
ColorFilter? _colorFilter;
void _updateColorFilter() {
if (_color == null)
_colorFilter = null;
else
_colorFilter = ColorFilter.mode(_color!, _colorBlendMode ?? BlendMode.srcIn);
}
Run Code Online (Sandbox Code Playgroud)
深入研究rendering/image.dart将表明,colorBlendMode(并且_colorBlendMode不会在其他地方使用,除非创建这个_colorFilter.
因此,我们知道Image.networkwill的两个参数最终进入RenderImage._colorFilter。
事实上,这_colorFilter将被用来RenderImage.paint作为
@override
void paint(PaintingContext context, Offset offset) {
...
paintImage(
canvas: context.canvas,
rect: offset & size,
image: _image!,
colorFilter: _colorFilter,
...
);
}
Run Code Online (Sandbox Code Playgroud)
所以我们知道!它将用于paintImage与本机方法进行通信。难怪它比Opacity.
没有回到我们的DecorationImage。在里面painting/decoration_image.dart,我们看到DecorationImagePainter:
class DecorationImagePainter {
DecorationImagePainter._(this._details, ...);
final DecorationImage _details;
void paint(Canvas canvas, Rect rect, Path? clipPath, ImageConfiguration configuration) {
...
paintImage(
canvas: canvas,
rect: rect,
image: _image!.image,
colorFilter: _details.colorFilter,
...
);
}
}
Run Code Online (Sandbox Code Playgroud)
嘿嘿,一模一样!
小智 7
使用不透明度类。使其子级部分透明的小部件。
Opacity(
opacity: 0.5,
child: Image.asset('images/lion.png'),
)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
17461 次 |
| 最近记录: |