需求
今天有人问了我一个很有意思的问题:如何实现文字竖直排列,就像古诗词一样。
思路
我首先想到的是使用 Container 组件嵌套 Text 组件,固定它的宽度,这样来实现一行一个文字。看起来就像竖直排列一样。但是它的文字垂直间距很显然不方便控制。
我便去 StackOverflow 上搜索了一番 vertical text。果然有所收获。有人提出,使用 Wrap 组件去实现这个功能。分割需要竖直排列的字符串为单个字,用 Text 组件包裹每个字,然后利用 Wrap 组件的 direction 使得这些 Text 列表垂直排列,排不下则往右边另起一列。
我自然是希望古诗一列一句的。所以就不用考虑超出换列,手动分割当然最好。既然使用不到 Wrap ,用各种 ListView 来展示上面的 Text 们也是可以的。
当然了,如果是显示的宋词,那一句太长也是有可能的,为了保险起见,我还是使用了Wrap做了超出处理。
如此一来,就可以着手实现了。封装一个用 Wrap 为核心的自定义组件,主要用于展示古诗的一句。我们拿到一个古诗后,可以将古诗按标点符号分割,分割后的句子用自定义的 Ver ...
练习0
练习0:填写已有实验
本实验依赖实验1。请把你做的实验1的代码填入本实验中代码中有“LAB1”的注释相应部分。
使用 Meld Diff Viewer 将 lab1 的代码填入了 lab2 的相应位置。
练习1
练习1:实现 first-fit 连续物理内存分配算法(需要编程)
在实现first fit 内存分配算法的回收函数时,要考虑地址连续的空闲块之间的合并操作。提示:在建立空闲页块链表时,需要按照空闲页块起始地址来排序,形成一个有序的链表。可能会修改default_pmm.c中的default_init,default_init_memmap,default_alloc_pages,default_free_pages等相关函数。请仔细查看和理解default_pmm.c中的注释。
请在实验报告中简要说明你的设计实现过程。请回答如下问题:
你的first fit算法是否有进一步的改进空间
进入ucore操作系统之后,第一个执行的函数是 default_init_memmap,对内核进行初始化。在其中,调用了初始化物理内存的函数 pmm_init 。
这个函数 ...
练习1
练习1:理解通过make生成执行文件的过程。(要求在报告中写出对下述问题的回答)
列出本实验各练习中对应的OS原理的知识点,并说明本实验中的实现部分如何对应和体现了原理中的基本概念和关键知识点。
在此练习中,大家需要通过静态分析代码来了解:
1.操作系统镜像文件ucore.img是如何一步一步生成的?(需要比较详细地解释Makefile中每一条相关命令和命令参数的含义,以及说明命令导致的结果)
2.一个被系统认为是符合规范的硬盘主引导扇区的特征是什么?
1
过程
输入make “V=” 得到详细的make过程如下。
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374[~/moocos/ucore_lab/labcodes/lab1]moocos-> make "V="+ cc kern/init/init.cgcc - ...
POST
据度娘解释,以前的安卓应用发出 http 请求后,如果请求时间过长,就会产生应用无响应的状态。所以改成了现在这种,直接发出 http 请求就会抛出错误。想要正确地发出http请求,就需要开一个子线程来进行这些操作。
下方的代码采用的是,直接通过 Thread 类创建子线程,需要传递的参数是一个实现了 Runnable 接口的类的实例对象。这里的对象通过匿名类生成。线程和匿名类的知识,可以在《Java2 实用教程》(俗称 课本)中找到。
线程的启动使用 start()方法。启动后,就进入等待cpu使用权的队列。得到使用权就开始运行。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657public class HttpUtil { public static String requestPost() throws IOException, JSONException { new T ...
ListWheelScrollView
和 ListView 类似,但是正如它的名字,它像个轮子,显示的时候有弧度。
这是官方的组件,并不需要引入第三方依赖包。
使用
它就像一个横放的圆柱,你只能看到前面这个面。能看到多少东西,取决于它的大小和你离它的位置。
可以使用 diameterRatio 改变它的圆面直径。你站在一个地方看圆柱,圆柱越大,你看那个面越不像弧面,能看到的东西就越多。就好像本来弯曲的书本,你让它不那么弯曲后,看到的就更多了吧。
可以使用 perspective 来决定你的透视位置。你离它越远,看到的东西越多。就像一张弯曲的纸上写着很多字,你贴近了看,只能看到几个字,拿远了看,就看得见一些弯曲后的字,总体上来说能看清的字变多了。
前者是在视野不变的情况下,让圆柱可视面能显示更多的东西。后者是让圆柱面显示的东西不变的情况下,自己去获得更大的视野,企图去看到更多东西。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 ...
SmoothPageIndicator
平滑的页面指示器。我称它为点集。效果与 dots indicator 类似,但样式更多样。
依赖引入
1smooth_page_indicator: ^1.0.0+2
使用
1234567891011121314SmoothPageIndicator( //this controller is PageController,which is usually used in PageView to controlle the page changing controller: _controller, count: 3, onDotClicked: (index){ _controller.jumpToPage(index); }, //是特效!我加了特效! //ExpandingDotsEffect,ColorTransitionEffect,JumpingDotEffect... effect: SwapEffect( activeDotColor: Colors.deepPurple, ...
PercentIndicator
这是一个百分比指示器的组件,俗称进度条。是第三方组件,用以弥补官方的 CircularProgressIndicator 的不足。我曾想用官方的进度条组件包裹一个圆框,用以展示头像上传进度,然而官方的组件并不支持在圆环中间插入子组件,所以自己做的话,或许要用层叠布局,颇感麻烦。
但是今天偶然遇见这个第三方组件就解决了这个问题。
依赖引入
1percent_indicator: ^4.0.1
使用
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556class ProgressBarPageContent extends StatefulWidget { const ProgressBarPageContent({Key? key}) : super(key: key); @override State<ProgressBarPageContent> ...
Slidable
滑动选项卡组件。
依赖引入
1flutter_slidable: ^2.0.0
使用
12345678910111213141516171819202122232425262728293031323334353637Slidable(//可滑动的组件 //end代表从右边往左边滑动 endActionPane: ActionPane(//滑动选项面板 motion: const StretchMotion(),//滑动动画 children: [ //SlidableAction是单个滑动选项 SlidableAction( onPressed: onDelete,//触发删除的函数 icon: Icons.delete,//图标 backgroundColor: Colors.redAccent,//背景色 borderRadius: BorderRadius.circular(12),//圆角 ) ], ), child: Container( ...
CircularProgressIndicator
圆形的进度指示。可以用于等待加载的时候。
使用
常配合 showDialog( ) 使用。
12345678showDialog( context: context, builder: (context){ return Center( child: CircularProgressIndicator(color: MyColors.rgbRed,), ); });
用完以后用 Navigator 回退页面就行了。
12Navigator.of(context).pop();//这样Navigator.pop(context);//或这样
ImagePicker
Flutter用于选择图片的工具包。
依赖引入
1image_picker: ^0.8.6
使用
12345final ImagePicker _picker=ImagePicker();//创建选择器实例onPressed: ()async{ //从相册选择图片 final image=await _picker.pickImage(source: ImageSource.gallery); }
ImageCropper
用于图片裁剪的工具包
依赖引入
1image_cropper: ^3.0.0
相关配置(安卓需要配置,ios不需要)
在AndroidManifest.xml加入以下信息。
1234<activity android:name="com.yalantis.ucrop.UCropActivity" android:screenOrientation="portrait" android:theme="@ ...