皮皮网
皮皮网

【溯源码推行】【东源码头小虾】【cad源码使用教程】简洁源码_简单的源码

时间:2024-12-28 17:13:49 来源:forcast源码

1.python简单代码helloworld(python简单代码helloworld)
2.Redux(4.0.4)源码解析
3.简单好玩的编程代码?
4.随便给我一个编程代码带意思谢谢
5.Navigation源码解析及自定义FragmentNavigator详解

简洁源码_简单的简洁简单源码

python简单代码helloworld(python简单代码helloworld)

       ä¸ºä»€ä¹ˆjava的helloworld代码复杂而python的helloworld代码简洁到仅一行?

       ä¸€è¡Œä»£ç å†™å‡ºè¿™ä¸ªä¹Ÿæ²¡æœ‰ä»€ä¹ˆç‰¹åˆ«çš„啊。至少比较两门语言不能这么比。如果你真要问为什么,那就是因为Python是一门解释性语言,当然是让人写少一点就能干多点事了。

       python基础都有哪些内容呢

       1.HelloWorld

       å®žä¾‹HelloWorld.py

       #!/usr/bin/python3?

       print(“Hello,World!”);

       è¿è¡Œè„šæœ¬

       $pythonHelloWorld.py

       æ³¨è§£ï¼šä»¥å¦‚上方式运行,第一行无意义;但以./HelloWorld.py的方式运行,第一行则指定python解释器的位置

       2.标识符

       å¿…须字母或下划线开头

       æ ‡è¯†ç¬¦å…¶ä»–部分是字母、下划线和数字

       å¤§å°å†™æ•æ„Ÿ

       3.设置编码

       é»˜è®¤æƒ…况下,Python3源码文件以UTF-8编码,所有字符串都是unicode字符串。当然你也可以为源码文件指定不同的编码:

       #--coding:cp---

       4.注释

       python单行注释以?#?开始,多行注释可以用多个?#?或?'''?和?"""?

       ä¾‹å­

       #!/usr/bin/python3?

       #注释?

       #注释

       '''?

       æ³¨é‡Š?

       æ³¨é‡Š?

       '''

       """?

       æ³¨é‡Š?

       æ³¨é‡Š?

       """?

       print(“Hello,World!”)

       4.行和缩进

       python使用行缩进代表代码块而不需要({ }),同一个代码块的行缩进必须一致,否则报错。

       5.多行语句

       python如果一个语句过长可以用\实现多行语句。

       sum=one+\?

       two+\?

       three

       6.等待用户输入

       æ‰§è¡Œä¸‹é¢çš„程序在按回车键后就会等待用户输入:

       #!/usr/bin/python3?

       input(“按下enter键退出。”)

       ç”¨æˆ·æŒ‰ä¸‹é”®æ—¶ï¼Œç¨‹åºå°†é€€å‡ºã€‚

       7.import与from…import

       åœ¨python用import或者?from…import?来导入相应的模块。?

       å°†æ•´ä¸ªæ¨¡å—(somemodule)导入,格式为:*importsomemodule*?

       ä»ŽæŸä¸ªæ¨¡å—中导入某个函数,格式为:?fromsomemoduleimportsomefunction?

       ä»ŽæŸä¸ªæ¨¡å—中导入多个函数,格式为:?fromsomemoduleimportfirstfunc,secondfunc,thirdfunc?

       å°†æŸä¸ªæ¨¡å—中的全部函数导入,格式为:?fromsomemoduleimport

*python怎么

       python有两种运行方式:交互式和脚本式。交互式可以通过cmd命令行窗口或者IDEL实现,而脚本式通过写一个脚本(.py结尾的文档)实现。其中交互式主要用于简单的python运行或者测试调试python时用到,而脚本式是运行python程序的主要方法。

       ç¬¬ä¸€ï¼Œäº¤äº’式,通过Windows命令行工具进行交互式运行python。同时按下Windows键和R键,启动“运行”,在“运行”中输入cmd然后回车,即弹出命令行工具,然后输入python回车,即出现如下界面。

       ç¬¬äºŒï¼Œç„¶åŽè¾“å…¥print('Helloworld!'),既可以敲一行代码,与python交互一次,python执行一次。

       ç¬¬ä¸‰ï¼Œé€šè¿‡IDEL交互式运行python。从“开始”中找到Python-IDEL,如下图。

       ç¬¬å››ï¼Œå¯åŠ¨IDEL后,同样输入print('Helloworld!'),既可以敲一行代码,与python交互一次,python执行一次。只不过IEDL中python代码可以高亮显示。

       ç¬¬äº”,脚本式运行python,在IDEL中点击file-newfile,就会弹出一个未命名(Untitled)的脚本窗口,然后输入如下代码,并按Ctrl+S保存。

有python代码怎么编成可执行的exe程序?

       py2exe啊,一点也不老,稳定而且好用。

       æ“ä½œæ­¥éª¤å¦‚下:

       å¦‚果你有一个名为helloworld.py的python脚本,你想把它转换为运行在windows上的可执行程序,并运行在没有安装python的windows系统上,那么首先你应写一个用于发布程序的设置脚本例如mysetup.py,在其中的setup函数前插入语句importpy2exe。

       mysetup.py示例如下:

       #mysetup.py

       fromdistutils.coreimportsetup

       importpy2exe

       setup(console=["helloworld.py"])

       ç„¶åŽæŒ‰ä¸‹é¢çš„方法运行mysetup.py:

       pythonmysetup.pypy2exe

       ä¸Šé¢çš„命令执行后将产生一个名为dist的子目录,其中包含了helloworld.exe,python.dll,library.zip这些文件。

       å¦‚果你的helloworld.py脚本中用了已编译的C扩展模块,那么这些模块也会被拷贝在个子目录中,同样,所有的dll文件在运行时都是需要的,除了系统的dll文件。

       dist子目录中的文件包含了你的程序所必须的东西,你应将这个子目录中的所有内容一起发布。

       é»˜è®¤æƒ…况下,py2exe在目录dist下创建以下这些必须的文件:

       1、一个或多个exe文件。

       2、python##.dll。

       3、几个.pyd文件,它们是已编译的扩展名,它们是exe文件所需要的;加上其它的.dll文件,这些.dll是.pyd所需要的。

       4、一个library.zip文件,它包含了已编译的纯的python模块如.pyc或.pyo

       ä¸Šé¢çš„mysetup.py创建了一个控制台的helloword.exe程序,如果你要创建一个图形用户界的程序,那么你只需要将mysetup.py中的console=["helloworld.py"]替换为windows=["myscript.py"]既可。

       py2exe一次能够创建多个exe文件,你需要将这些脚本文件的列表传递给console或windows的关键字参数。如果你有几个相关联的脚本,那么这是很有用的。

       è¿è¡Œä¸‹é¢ä¸ªå‘½ä»¤ï¼Œå°†æ˜¾ç¤ºpy2exe命令的所有命令行标记。

       pythonmysetup.pypy2exe--help

python输出helloworld的代码是多少?

       æ˜¯a[0]+'\n'。

       Python的创始人为荷兰人吉多·范罗苏姆(GuidovanRossum)。年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本解释程序。

       ä½œä¸ºABC语言的一种继承。之所以选中Python(大蟒蛇的意思)作为该编程语言的名字,是取自英国世纪年代首播的电视喜剧《蒙提·派森的飞行马戏团》(MontyPython'sFlyingCircus)。

       å‘展历程:

       è‡ªä»Žä¸–纪年代初Python语言诞生至今,它已被逐渐广泛应用于系统管理任务的处理和Web编程。

       å¹´ï¼ŒGuidovanRossum在弗吉尼亚州的国家创新研究公司(CNRI)继续他在Python上的工作,并在那里发布了该软件的多个版本。

       å¹´äº”月,GuidovanRossum和Python核心开发团队转到BeOpen.com并组建了BeOpenPythonLabs团队。同年十月,BeOpenPythonLabs团队转到DigitalCreations(现为ZopeCorporation)。

       å¹´ï¼ŒPython软件基金会(PSF)成立,这是一个专为拥有Python相关知识产权而创建的非营利组织。ZopeCorporation现在是PSF的赞助成员。

Redux(4.0.4)源码解析

       Redux源码解析

       Redux源代码解析旨在清晰展示其核心组件及工作流程,力求用最简洁的源码语言阐述每个关键部分的功能。Redux提供了一个状态管理库,简洁简单以管理应用的源码全局状态。以下是简洁简单Redux核心组件的主要解析:

       createStore.js

       export default function createStore(reducer, preloadedState, enhancer)

       createStore函数是Redux的核心,负责创建一个状态存储对象。源码溯源码推行它可以接受三个参数:reducer(减少操作函数)、简洁简单预加载状态(初始状态)和增强器(可选参数,源码用于添加额外功能)。简洁简单

       getState

       获取当前状态,源码操作简单直接。简洁简单

       subscribe

       向监听列表中添加监听函数,源码返回取消监听函数。简洁简单在调用dispatch时订阅或取消订阅,源码不会影响正在进行的简洁简单dispatch。下一次dispatch时,将使用订阅列表的东源码头小虾最新快照。

       dispatch

       执行reducer获取最新状态,并依次执行监听队列中的函数。

       replaceReducer

       替换当前的reducer。执行后,dispatch一次更新状态。一般不常用。

       observable

       未见实际应用,可能用于特定场景。使用了symbol-observable包,对于熟悉该包的开发者来说,此部分可能有更多探索空间。

       utils

       包括actionTypes.js、isPlainObject.js、warning.js等辅助函数。actionTypes.js定义了Redux保留的私有操作类型,用于确保操作的cad源码使用教程正确处理。isPlainObject.js用于判断action对象是否为原生对象。warning.js用于抛出错误,保持代码质量。

       applyMiddleware.js

       通过createStore(reducer,applyMiddleware(...middleware))执行,返回带有中间件增强的dispatch。精简后,代码更加清晰。

       compose.js

       实现中间件的串联,依次增强dispatch流程。使用函数式编程技巧,代码简洁高效。

       bindActionCreators.js

       将单个或多个ActionCreator转化为dispatch(action)的函数集合,简化Action的使用方式。

       combineReducers.js

       将多个reducer整合为一个,调整state结构,便于管理和操作。图片小说源码下载

       整体而言,Redux的源码解析展示了其如何通过一系列核心组件实现状态管理的流程,从创建store到管理state、执行reducer、中间件串联,直至整合多个reducer,提供了一套高效、模块化的状态管理方案。理解这些组件及其功能是掌握Redux并能灵活应用的关键。

简单好玩的编程代码?

       ç‚«é…·çš„编程代码

       ç‚«é…·çš„编程代码是@echooffmodeconcols=lines=colorsetlocalenabledelayedexpansionsetcode=abcdefsetm=1setv=1。

       ç¼–定程序,简称编程,是指让计算机代为解决某个问题。对某个计算体系规定一定的运算方式,使计算体系按照该计算方式运行,并最终得到相应结果的过程。

       ç¼–程就是为了借助于计算机来达到某一目的或解决某个问题,而使用某种程序设计语言编写程序代码,并最终得到结果的过程。计算机虽然功能十分强大,可以上网、玩游戏、管理公司人事关系等等。但是没有程序,它就等于是一堆废铁,不会理会我们对它下达的“命令”。

       ç¼–程语言介绍

       ä½¿ç”¨æ±‡ç¼–语言编写计算机程序,程序员仍然需要十分熟悉计算机系统的硬件结构,所以从程序设计本身上来看仍然是低效率的、烦琐的。但正是由于汇编语言与计算机硬件系统关系密切,在某些特定的场合,如对时空效率要求很高的系统核心程序以及实时控制程序等,迄今为止汇编语言仍然是十分有效的程序设计工具。

       ä½¿ç”¨é«˜çº§è¯­è¨€ç¼–写程序的优点是,编程相对简单、直观、易理解、不容易出错。高级语言是独立于计算机的,因而用高级语言编写的计算机程序通用性好,具有较好的移植性。

       åœ¨è®¡ç®—机应用的初期,程序员使用机器的指令系统来编写计算机应用程序,这种程序称为机器语言程序。

       æ±‚行简单C语言程序代码,基础的就好

       #includestdio.h

       #includestdlib.h

       #defineNUM

       /*runthisprogramusingtheconsolepauseroraddyourowngetch,system("pause")orinputloop*/

       //冒泡排序算法

       //基本思想:比较相邻的两个数,如果前者比后者大,则进行交换。每一轮排序结束,选出一个未排序中最大的数放到数组后面。

       voidbubbleSort(int*arr,intn){

       inti,j;

       for(i=0;in-1;i++)

       for(j=0;jn-i-1;j++){

       //如果前面的数比后面大,进行交换

       if(arr[j]arr[j+1]){

       inttemp=arr[j];

       arr[j]=arr[j+1];

       arr[j+1]=temp;

       }

       }

       }

       //最差时间复杂度为O(n^2),平均时间复杂度为O(n^2)。稳定性:稳定。辅助空间O(1)。

       //升级版冒泡排序法:通过从低到高选出最大的数放到后面,再从高到低选出最小的数放到前面,

       //如此反复,直到左边界和右边界重合。当数组中有已排序好的数时,这种排序比传统冒泡排序性能稍好。

       //升级版冒泡排序算法

       voidbubbleSort_1(int*arr,intn){

       //设置数组左右边界

       intleft=0,right=n-1;

       //当左右边界未重合时,进行排序

       while(left=right){

       inti,j;

       //从左到右遍历选出最大的数放到数组右边

       for(i=left;iright;i++){

       if(arr[i]arr[i+1]){

       inttemp=arr[i];

       arr[i]=arr[i+1];

       arr[i+1]=temp;

       }

       }

       right--;

       //从右到左遍历选出最小的数放到数组左边

       for(j=right;jleft;j--){

       if(arr[j+1]arr[j]){

       inttemp=arr[j];

       arr[j]=arr[j+1];

       arr[j+1]=temp;

       }

       }

       left++;

       }

       }

       intmain(intargc,char*argv[]){

       intarr[NUM],i,j,temp;

       printf("请输入个数:\n");

       for(i=0;iNUM;i++){

       printf("请输入第(%d)个数:",i+1);

       scanf("%d",arr[i]);

       }

       printf("\n输入如下排列:\n");

       for(i=0;iNUM;i++){

       printf("%4d",arr[i]);

       }/

*

       for(i=0;iNUM;i++){

       for(j=i+1;jNUM;j++){

       if(arr[i]arr[j]){

       temp=arr[i];

       arr[i]=arr[j];

       arr[j]=temp;

       }

       }

       }*/

       bubbleSort_1(arr,NUM);

       /*printf("\n从小到大如下排列:\n");

       for(i=0;iNUM;i++){

       printf("%4d",arr[i]);

       }*/

       printf("\n从大到小如下排列:\n");

       for(i=NUM-1;i=0;i--){

       printf("%4d",arr[i]);

       }

       return0;

       }

随便给我一个编程代码带意思谢谢

       main()?

       { ?

       inti,j,k;?

       printf("\n");?

       for(i=1;i5;i++)/*以下为三重循环*/

       for(j=1;j5;j++)

       for(k=1;k5;k++)

       {

       if(i!=ki!=jj!=k)/*确保i、j、k三位互不相同*/

       printf("%d,%d,%d\n",i,j,k);

       }?

       }

       1、代码解释:以上这段代码是用C语言写出来的代码,他所解决的问题是:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少??可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去?掉不满足条件的排列。

       2、C语言介绍:C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

       3、C语言的优点:简洁紧凑、灵活方便。运算符丰富。数据结构丰富。C是结构式语言。C语法限制不太严格、程序设计自由度大,一般的高级语言语法检查比较严,能够检查出几乎所有的语法错误。而C语言允许程序编写者有较大的自由度。C语言程序生成代码质量高,程序执行效率高,一般只比汇编程序生成的目标代码效率低へ%。

       4、其他编程语言介绍:Python(英国发音:/?pa?θ?n/美国发音:/?pa?θɑ?n/),是一种面向对象的解释型计算机程序设计语言,由荷兰人GuidovanRossum于年发明,第一个公开发行版发行于年。Python是纯粹的自由软件,?源代码和解释器CPython遵循GPL(GNU?GeneralPublicLicense)协议。Python语法简洁清晰,特色之一是强制用空白符(whitespace)作为语句缩进。

python有趣的编程代码

       class?Point:

row=0

col=0

def?__init__(self,?row,?col):

       self.row=row

       self.col=col

def?copy(self):

       return?Point(row=self.row,?col=self.col)

       #初始框架

       import?pygame

       import?random

       #初始化

       pygame.init()

       W=

       H=

       ROW=

       COL=

       size=(W,H)

       window=pygame.display.set_mode(size)

       pygame.display.set_caption('贪吃蛇')

       bg_color=(,,)

       snake_color=(,,)

       head=Point(row=int(ROW/2),?col=int(COL/2))

       head_color=(0,,)

       snakes=[

Point(row=head.row,?col=head.col+1),

Point(row=head.row,?col=head.col+2),

Point(row=head.row,?col=head.col+3)

       ]

       #生成食物

       def?gen_food():

while?1:

       pos=Point(row=random.randint(0,ROW-1),?col=random.randint(0,COL-1))

       #

       is_coll=False

       #是否跟蛇碰上了

       if?head.row==pos.row?and?head.col==pos.col:

is_coll=True

       #蛇身子

       for?snake?in?snakes:

if?snake.row==pos.row?and?snake.col==pos.col:

       is_coll=True

       break

       if?not?is_coll:

break

return?pos

       #定义坐标

       food=gen_food()

       food_color=(,,0)

       direct='left'#left,right,up,down

       #

       def?rect(point,?color):

cell_width=W/COL

cell_height=H/ROW

left=point.col*cell_width

top=point.row*cell_height

pygame.draw.rect(

       window,?color,

       (left,?top,?cell_width,?cell_height)

)

pass

       #游戏循环

       quit=True

       clock=pygame.time.Clock()

       while?quit:

#处理事件

for?event?in?pygame.event.get():

       if?event.type==pygame.QUIT:

quit=False

       elif?event.type==pygame.KEYDOWN:

if?event.key==?or?event.key==:

       if?direct=='left'?or?direct=='right':

direct='up'

elif?event.key==?or?event.key==:

       if?direct?==?'left'?or?direct?==?'right':

direct='down'

elif?event.key==?or?event.key==:

       if?direct?==?'up'?or?direct?==?'down':

direct='left'

elif?event.key==?or?event.key==:

       if?direct?==?'up'?or?direct?==?'down':

direct='right'

#吃东西

eat=(head.row==food.row?and?head.col==food.col)

#重新产生食物

if?eat:

       food?=?gen_food()

#处理身子

#1.把原来的头,插入到snakes的头上

snakes.insert(0,?head.copy())

#2.把snakes的最后一个删掉

if?not?eat:

       snakes.pop()

#移动

if?direct=='left':

       head.col-=1

elif?direct=='right':

       head.col+=1

elif?direct=='up':

       head.row-=1

elif?direct=='down':

       head.row+=1

#检测

dead=False

#1.撞墙

if?head.col0?or?head.row0?or?head.col=COL?or?head.row=ROW:

       dead=True

#2.撞自己

for?snake?in?snakes:

       if?head.col==snake.col?and?head.row==snake.row:

dead=True

break

if?dead:

       print('死了')

       quit=False

#渲染——画出来

#背景

pygame.draw.rect(window,?bg_color,?(0,0,W,H))

#蛇头

for?snake?in?snakes:

       rect(snake,?snake_color)

rect(head,?head_color)

rect(food,?food_color)

#

pygame.display.flip()

#设置帧频(速度)

clock.tick(8)

       #收尾工作

       è¿™æ˜¯ä¸€ä¸ªç®€æ˜“版贪吃蛇的代码,虽然结构简单,但是该有的功能都是完整的,可玩性也不错

c语言编程烟花代码简单

       c语言编程烟花代码简单如下:

       #include"stdlib.h"

       #include"graphics.h"

       #include"stdio.h"

       #include"math.h"

       #include"conio.h"

       #definePI?3.

       main()

       {

       intgdriver=DETECT,gmode,errorcode;

       inta[],b[],x,y,c,r,i,j,t;

       doublerad=0.0;

       /*initializegraphicsandlocalvariables*/

       initgraph(gdriver,gmode,"");

       /*readresultofinitialization*/

       errorcode=graphresult();

       if(errorcode!=grOk)?/*anerroroccurred*/

       {

       printf("Graphicserror:%s/n",grapherrormsg(errorcode));

       printf("Pleaseanykeytohalt:");

       getch();

       exit(1);?/*terminatewithanerrorcode*/

       }

       randomize();

       for(;!kbhit();)

       {

       x=rand()%+;/*随机中心坐标*/

       y=rand()%+;

       for(r=0;r=8;r++?)?/*烟花的大小设定*/

       {

       for(i=0,rad=0.0;rad2*PI;rad+=0.)?/*设定坐标*/

       {

       a[i++]=x+(int)r**cos(rad);

       b[i]=y+(int)r**sin(rad);

       }

       t=i;

       for(i=1;it;i++)

       {

       c=rand()%+1;/*各点的颜色随机*/

       setcolor(c);/*功能:将当前图形屏幕的当前笔画颜色置为color.*/

       circle(a[i],b[i],1);/*a[i],b[i]为圆心1为半径画圆*/

       }

       delay();

       delay();

       cleardevice();

       å‡½æ•°å:cleardevice?

       åŠŸ?能:清除图形屏幕?

       ç”¨?法:voidfarcleardevice(void);

       }

       }

       getch();

       closegraph();

       å‡½æ•°å:closegraph

       åŠŸ?能:关闭图形系统

       ç”¨?法:voidfarclosegraph(void);

       }

       åˆå§‹åŒ–烟花参数

       voidInit(inti)

       {

       //分别为:烟花中心到图片边缘的最远距离、烟花中心到图片左上角的距离(x、y)两个分量

       intr[]={ ,,,,,,,,,,,,};

       intx[]={ ,,,,,,,,,,,,};

       inty[]={ ,,,,,,,,,,,,};

       /****初始化烟花*****/

       Fire[i].x=0;//烟花中心坐标

       Fire[i].y=0;

       Fire[i].width=;//图片宽

       Fire[i].height=;//图片高

       Fire[i].max_r=r[i];//最大半径

       Fire[i].cen_x=x[i];//中心距左上角距离

       Fire[i].cen_y=y[i];

       Fire[i].show=false;//是否绽放

       Fire[i].dt=5;//绽放时间间隔

       Fire[i].t1=timeGetTime();

       Fire[i].r=0;//从0开始绽放

       /****初始化烟花弹*****/

       Jet[i].x=-;//烟花弹左上角坐标

       Jet[i].y=-;

       Jet[i].hx=-;//烟花弹发射最高点坐标

       Jet[i].hy=-;

       Jet[i].height=0;//发射高度

       Jet[i].t1=timeGetTime();

       Jet[i].dt=rand()%;//发射速度时间间隔

       Jet[i].n=0;//烟花弹闪烁图片下标

       Jet[i].shoot=false;//是否发射

       }

随便给我一个编程代码带意思谢谢

       main() 

       {  

       int i,j,k; 

       printf("\n"); 

       for(i=1;i<5;i++)    /*以下为三重循环*/

       for(j=1;j<5;j++)

       for (k=1;k<5;k++)

       {

       if (i!=k&&i!=j&&j!=k)  /*确保i、j、k三位互不相同*/

       printf("%d,%d,%d\n",i,j,k);

       } 

       }

       1、代码解释:以上这段代码是用C语言写出来的代码,他所解决的问题是:有1、2、3、电子画册源码系统4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去 掉不满足条件的排列。 

       2、C语言介绍:C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

       3、C语言的优点:简洁紧凑、灵活方便。运算符丰富。数据结构丰富。C是结构式语言。C语法限制不太严格、程序设计自由度大,一般的高级语言语法检查比较严,能够检查出几乎所有的语法错误。而C语言允许程序编写者有较大的自由度。C语言程序生成代码质量高,程序执行效率高 ,一般只比汇编程序生成的目标代码效率低へ%。

       4、其他编程语言介绍:Python (英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido van Rossum于年发明,第一个公开发行版发行于年。Python是纯粹的自由软件, 源代码和解释器CPython遵循 GPL(GNU General Public License)协议 。Python语法简洁清晰,特色之一是强制用空白符(white space)作为语句缩进。

Navigation源码解析及自定义FragmentNavigator详解

       谷歌推出的Navigation主要目标是统一应用内页面跳转行为。使用方法简单,新项目选择Bottom Navigation Activity,系统自动生成页面逻辑。

       Navigation源码设计简洁,包含多个关键类。其中,NavHostFragment是直接在XML文件中定义的,其生命周期方法onCreate中直接创建了NavHostController,并通过findNavController暴露给外部调用者。NavHostController继承自NavController。在此过程中,通过navController获取NavigatorProvider并添加了两个Navigator:DialogFragmentNavigator和FragmentNavigator。NavController构造方法中还额外添加了两个Navigator,分别对应DialogFragment、Fragment和Activity的页面跳转。NavGraphNavigator用于在XML配置的navGraph与根节点文件中的startDestination之间实现跳转,功能单一。

       各个Navigator通过重写navigate方法实现各自的跳转逻辑。FragmentNavigator的关键实现在于注释1处,使用replace加载Fragment,这不符合实际开发需求。文章后续将解释如何自定义FragmentNavigator以避免Fragment在切换时执行生命周期。

       NavigatorProvider内部维护了一个HashMap存储相关Navigator信息,通过获取Navigator的注解Name作为键和getClass作为值进行存储。在onCreate方法中,mNavController调用了setGraph,解析XML配置的mobile_navigation节点信息文件,根据不同的节点各自解析。通过获取NavInflater进行解析,返回NavGraph,NavGraph继承自NavDestination,保存了所有解析出的节点信息。

       总结,通过NavHostFragment获取到NavContorl并存储了相关Navigator信息。通过各自navigate方法进行页面跳转,通过setGraph解析配置的页面节点信息并封装为NavGraph对象。其中,通过SparseArray存储Destination信息。

       自定义Navigator实现思路主要在于继承现有FragmentNavigator并重写其navigate方法,将replace方法替换为show和hide方法,完成Fragment切换。通过@Navigator.Name(value)注解标记自定义类为Navigator,加入NavigatorProvider中即可识别。自定义Navigator核心代码实现后,需调整mobile_navigation节点中的fragment为fixFragment,并删除布局文件中NavHostFragment节点信息,手动关联FixFragmentNavigator与NavControl,完成Fragment切换时生命周期不会重新执行。

更多内容请点击【焦点】专栏