}) : assert(scale != null),
assert(alignment != null),
assert(repeat != null),
assert(matchTextDirection != null),
super(key: key);
其中image类型就是上边提到的ui.Image
,这个数据的获取官方推荐通过ImageStream
添加listener来获取。
这两个属性可以做出许多的效果。
看一段简单的代码
class _MyHomePageState extends State {
ImageInfo info;//图片信息
List blendModes = BlendMode.values;//所有的混合模式转换为list
@override
void didChangeDependencies() {
super.didChangeDependencies();
Image.asset(“images/yuan.png”)
.image
.resolve(createLocalImageConfiguration(context))
.addListener((ImageInfo image, bool synchronousCall) {
setState(() {
info = image; //刷新状态
});
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: GridView.builder(
itemCount: blendModes.length - 1,
padding: EdgeInsets.only(top: 10.0),
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 4,
),
itemBuilder: getItemBuilder,
),
);
}
Widget getItemBuilder(BuildContext context, int index) {
return Column(
children: [
RawImage(
image: info?.image,
color: Colors.red,
width: 40,
height: 40,
colorBlendMode: blendModes[index + 1],
fit: BoxFit.cover,
),
Container(
padding: EdgeInsets.only(top: 10.0),
child: Text(
blendModes[index + 1].toString().split(“.”)[1],
style: TextStyle(
color: Colors.black,
fontSize: 15.0,
),
),
),
],
);
}
}
flutter中的混合模式是枚举类型,和Android中的图片混合模式画笔混合模式基本保持一致。上面的代码描述了所有的混合模式并配有图,除了clear没有在里边(clear模式会清除所有内容)。image是一个简单的图片,带透明通道的绿色的圆,在图中就是dst模式下的样子,背景是一个纯红色,在图中就是src模式下的样子。
填充,忽略原有的宽高比,填满为止
包含,不改变原有比例让容器包含整个图片,容器多余部分填充背景
覆盖,不改变原有比例,让图片充满整个容器,图片多余部分裁剪 ///
横向图片填充
纵向图片填充
原始大小居中
图片大小小于容器事相当于none,图片大小大于容器时缩小图片大小实现contain
centerSlice属性专门用于nine-patch文件。
其他属性暂时不讲。
一般情况下这个控件很少使用,但是他是其他Image控件的实现基础,所以必须要拎出来讲一下。
Image
这是一个通用包装类,它包装了RawImage,同时提供了一些简便的Named constructors
来使用AssetsImage,ExactAssetImage等ImageProvider的子类。
- Image, 从ImageProvider来获取图片显示
这个类的使用基本和RawImage一致,在使用的时候只是将参数ui.Image
包装为了ImageProvider
,不用再自己监听ImageStream。典型简单用法:
Widget image = Image(AssetImage(“images/yuan.png”))
- Image.asset, 从Asset资源中获取图片显示
这个方法是ImageProvider
为AssetImage
的简单用法:
Widget image = Image.asset(“images/yuan.png”)
- Image.network, 从URL获取网络图片显示
这个方法是ImageProvider
为NetworkImage
的简单用法:
Widget image = Image.network(“http://img.rangaofei.cn/01b18.jpg”)
- Image.file, 从文件中获取图片显示
这个方法是ImageProvider
为FileImage
的简单用法:
Widget image = Image.file(file)
- Image.memory 从内存中获取图片显示.
这个方法是ImageProvider
为MemoryImage
的简单用法:
Widget image = Image.memory(byteList)
CircleAvatar
主要用来显示用户的头像,任何图片都会被剪切为圆形。
一个简单用法:
CircleAvatar(
child: Text(“头像”),
backgroundImage: AssetImage(“images/yuan.png”),
backgroundColor: Colors.red,
radius: 50.0,
),
生成的图像如下:
CircleAvatar
内置了许多的功能。radius用来控制图片的大小,同时它可以自动感知当前theme是白天模式还是夜间模式来切换图片颜色,另外它实际是包装了AnimatedContainer
,设置的动画时间是200ms。在改变它的一些相关属性时会自动使用动画来执行。看一个简单的动图:
代码如下:
class _MyHomePageState extends State {
double radius = 10.0;
@override
void initState() {
super.initState();
Future.delayed(Duration(milliseconds: 2 * 1000), () {
setState(() {
radius = 20.0;
});
return Duration(milliseconds: 210);
}).then((Duration d) {
Future.delayed(d, () {
setState(() {
radius = 40.0;
});
return Duration(milliseconds: 210);
}).then((Duration d) {
Future.delayed(d, () {
setState(() {
radius = 30.0;
});
});
});
;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: CircleAvatar(
child: Text(“头像”),
backgroundImage: AssetImage(“images/yuan.png”),
radius: radius,
),
),
);
}
}
这里我并没有使用AnimationController来控制radius值的变化,而是通过一个Future延时来控制。初始化的时候radius是10.0,延迟两秒后变为20.0,因为CircleAvatar默认的过度时间是200ms,为了有一个平滑的过渡效果,我把下一次改变时间设置为了210ms,这时半径是40.0,最后经过210ms后半径设置为30.0,整个变化过程为:
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
![](https://img-blog.csdnimg.cn/img_convert/6d156eeb29fba44b2335b1fae6e68a7b.jpeg)
新的开始
改变人生,没有什么捷径可言,这条路需要自己亲自去走一走,只有深入思考,不断反思总结,保持学习的热情,一步一步构建自己完整的知识体系,才是最终的制胜之道,也是程序员应该承担的使命。
《系列学习视频》
《系列学习文档》
《我的大厂面试之旅》
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
《系列学习视频》*
[外链图片转存中…(img-sUODb3Bz-1712756948196)]
《系列学习文档》
[外链图片转存中…(img-G6hK9GAx-1712756948196)]
《我的大厂面试之旅》
[外链图片转存中…(img-pPo8H9UU-1712756948196)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!