自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Ctrl_S的博客

我就写写看,沒別的意思...

原创 react-native-tab-view

@react-native-diy/tabview一个好用的 TabView 组件,主要基于@react-native-community/viewpager封装,同时配合react-native-web也支持在 Web 上使用此组件主要是由TabBar和MyViewPager两部分组成:TabBar是基于ScrollView封装而成,支持文字随着滚动一直居中,支持指示器(下划线)随着文字长度而自行变化,也支持调整指示器(下划线)的长度比率,同时也支持滚动和固定模式MyViewPager是基于@re

2020-06-13 11:39:34 91 2

原创 Flutter的首次尝试,小独App

PeaceRead仿制小读,使用 Flutter 语言开发知识dart 语法dart 事件循环机制dart 编程规范material、cupertino 控件的使用动画系统的使用自定义控件setState 的理解pubspec.yaml 第三方插件的使用…成果 ...

2020-04-18 23:24:35 56

原创 Android-x86-6.0定制之路 - 以太网静态iP功能

需求确立描述Android-x86-6.0 仅支持以太网动态获取 IP(DHCP),现在客户要求设置静态 IP,即手动填写 ip 地址、网关、子网掩码、dns 服务器等信息。首先还是去 Settings.apk 查看是否支持此功能,很遗憾系统并不支持此功能,没法还是要去修改源码了。确认Settings.apk 添加以太网模块,包括以下功能:启用以太网、禁用以太网显示网络信息,包括 i...

2019-04-13 11:03:51 2241 3

原创 Android-x86-6.0定制之路 - 屏幕旋转功能

需求确立描述Android-x86-6.0 屏幕默认横屏展示,像 kiosk 模式的点餐机通常是立着的,也就是说需要竖屏展示。对于这个问题,以对 Android 的了解就是去设置里查找是否有支持屏幕旋转的功能,很遗憾 Android-x86-6.0 并没有支持,看来又要修改源码了。确认在 Settings.apk 里添加屏幕旋转的功能,实现屏幕方向的调整。功能实现通过查阅资料,发现了实...

2019-04-12 12:11:42 1207 15

原创 Android-x86-6.0定制之路 - 绕过USB权限弹窗实现静默授权

需求确立描述1. 我们的 App 要求接入多个外部设备,像打印机、扫码器、读卡器和 POS 机等,其中打印机和扫码器就是使用 USB 连接的。遇到的问题是,我先接入打印机,再接入扫码器,发现打印机就连接不了,必须重新插拔下才行,但是单独连接打印机或者扫码器都是正常的。后来谷歌找到相关问题:假如有两个 USB 设备 A 和 B,先接入 A,再接入 B,发现在获取设备 A 的 UsbInte...

2019-04-11 21:09:14 703

原创 Android-x86-6.0定制之路 - 动态显示、隐藏状态栏和导航栏(广播方式)

需求确立描述当 App 进入 kiosk 模式,要求隐藏底部虚拟键、禁止下拉出现状态栏,这样保证我们的 App 一直处于系统前台运行。1. 通过getWindow().getDecorView().setSystemUiVisibility(Options)控制 SystemUi 是否可见就行了,但是并没有做到真正的隐藏,当触措屏幕的时候状态栏和导航栏还是显示出来了,显然这种实现方式并不能满...

2019-04-09 20:53:31 985 4

原创 Android-x86-6.0定制之路 - 永不休眠功能

需求确立一般, Kiosk 模式下不管处于什么界面,都要求屏幕保持常亮的。虽然在 App 内可以通过代码实现屏幕常亮,但是现在的需求是在系统设置里增加永不休眠的功能,可勾选的实现动态修改。涉及到系统 Apk 的修改,没办法只能去修改源码了。简单整理下需求:针对 Settings.apk, 设置 -> 显示 -> 睡眠路径下添加永不休眠选项,并且开机默认选中永不休眠。功能实现源...

2019-04-09 14:23:45 1182

原创 Android-x86-6.0定制之路 - 辛酸路开始

什么是 Android-x86对于 Android,相信大家应该是非常熟悉的!对整天使用 Android 的手机我们而言,想不知道 Android 都不可能。但是什么是 Android-x86 呢?可能有少数人听说过,现在就来普及下有关 Android-x86 的相关知识。Android-x86 是运行于 x86 PC 上的 Android 操作系统,目前已经支持大部分安卓程序。Android ...

2019-03-20 14:30:34 1690 3

原创 Android-x86-6.0定制之路 - 如何管理源码

前言终于完成了 android-x86-6.0 源码的编译工作,经过简单的测试,系统正常工作,接下来就是阅读和修改源码了。为了方便修改、提交、测试源码,想着应该将源码上传到 git,但是源码过于庞大,如果将整个源码作为单个项目上传 git 的话,必将造成每次同步都非常慢。想了下,觉得应该跟官方一样采用 repo 管理源码,将源码拆成多个项目去维护。搭建 GitLab 服务想了下,还是先在服务...

2019-03-20 14:29:18 550 3

原创 Android-x86-6.0定制之路 - 如何安装x86-6.0

前言为了更好的演示如何安装 Android-x86-6.0,我选择在 VirtualBox 虚拟机上安装。在 PC 机上安装的话,跟虚拟机的操作是一样的,大家有兴趣可以尝试的。下载安装 VirtualBoxVirtualBox 官网: https://www.virtualbox.org/wiki/Downloads关于如何下载安装 VirtualBox,请参考官网教程准备 Androi...

2019-03-19 18:34:16 2130

原创 Android-x86-6.0定制之路 - 在Ubuntu 16.04.5上编译

前言由于下载的开源系统没有系统签名,所以不可能针对系统去做什么定制。首先,要去下载 Android-x86-6.0 的系统源码,再去尝试编译系统,如果编译成功并且能够正常运行的话,才能研究去定制系统。反正吧,我觉得编译系统是定制系统的第一步。不多说了,先去下载系统源码吧!安装 Git由于 Mac 自带 Git 工具,就不介绍如何安装,可以考虑升级 Git 版本使用 repo 工具下载源码...

2019-03-19 18:32:59 1550 1

原创 Ubuntu服务器的基本操作

前言由于需要定制 Android 系统,专门购买了台服务器用于编译源码,也就这样,开始接触了 Linux 服务器。在每天不断的接触下,学习到了很关于 Linux 服务器的知识,这里记录下来。设置网络查看网卡如图所示,该服务器有两块网卡 eno1 和 eno2。没有配置之前,eno2 没有显示任何网络信息表示没有启动该网卡,eno1 没设置之前也是这样的配置网卡执行以下命令编辑网络配置...

2019-03-14 18:02:32 717

原创 打造ReactNative脚手架工程 - Detox自动化测试

前言在移动设备上进行自动化测试最困难的部分是测试金字塔的顶端——E2E。E2E 测试的核心问题是片状性——测试通常不是确定性的。我们相信,要想迎面解决这个问题,唯一的方法就是从黑盒测试转移到灰盒测试。Detox 是移动应用程序的灰盒端到端测试和自动化框架。当你的手机应用程序在真实设备/模拟器上运行时,使用 Detox 测试它,就像一个真实的用户一样,这大降低了我们对手工 QA 的依赖。D...

2019-03-03 13:46:52 766

原创 打造ReactNative脚手架工程 - Jest单元测试

前言单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证,一般针对的是函数、类或单个组件,不涉及系统和集成。单元测试是软件测试的基础测试,进行充分的单元测试,是提高软件质量,降低开发成本的必由之路。对于程序员来说,如果养成了对自己写的代码进行单元测试的习惯,不但可以写出高质量的代码,而且还能提高编程水平。所以说单元测试是软件开发当中不可缺少的环节。针对 RN 的单元...

2019-02-27 22:32:46 537

原创 打造ReactNative脚手架工程 - 集成Typescript

前言思来想去,还是用Typescript来编写脚手架工程吧。为什么使用Typescript呢?Typescript 是 Javascript 的超集Typescript 让抽象清晰可见Typescript 使代码更容易阅读和理解安装安装分成两种,局部安装与全局安装,强烈建议全局安装局部安装(在项目的工作目录中)npm install typescript --save-d...

2019-02-22 18:28:41 287

原创 打造ReactNative脚手架工程 - 代码规范

前言代码规范,也算是个老生常谈的问题。如何写出优秀漂亮的代码,是每个程序员的必修课。得益于开源伟大思想,许多大厂都制定了一系列的代码规范并发布在市场上。正所谓"前人栽树,后人乘凉",我们就不必去大费周章的去定义代码规范,只要做到遵守就好了。可能我们了解了有哪些代码规范,但是在编码当中我们难以百分百的遵守,所以我们还需要一个东西去约束我们编写优秀漂亮的代码。这里就脚手架工程,从 IDE(编辑器)、...

2019-02-22 00:24:33 280

原创 打造ReactNative脚手架工程 - 目录结构

前言上节我们简单的对工程初始化作了些补充,这节我们来思考下工程文件的划分以及命名。可能我们平常开发中不会太多注重这些,但是对于有代码洁癖的我来说这是不能容忍的,我们现在来简单讨论下。什么是文件夹?文件夹以什么命令合适?文件夹多少层合适?什么是文件夹文件夹,这个问题可能问得有点傻?可能大多数人回答的是,将许多不同的文件放在一起就形成了文件夹。其实这说法是错误的,关键就在于说是不...

2019-02-17 22:43:40 633

原创 打造ReactNative脚手架工程 - 初始化工程

搭建环境 关于 RN 的环境搭建这里就不再赘述了。详情参考官方文档新建工程使用Facebook提供的react-native-cli工具新建工程, 步骤如下:执行react-native init rndiy,生成空的工程node_modules安装成后,提示你运行工程。这里,我们在 Android、IOS 上都演示下新建空的 RN 工程就已经完成了, 是不是很简单。...

2019-02-14 12:09:53 417

原创 打造ReactNative脚手架工程 — 认识RN

关于ReactNativeReact Native(简称RN)是Facebook于2015年4月开源的跨平台移动应用开发框架,是Facebook早先开源的JS框架React在原生移动应用平台的衍生产物,目前支持IOS和Android两大平台。React Native主张"Learn once, write anywhere",

2019-02-14 12:08:55 923

原创 Git常用命令(持续更新...)

克隆项目git clone [url]显示所有本地分支git branch 显示所有远程分支git branch -r显示所有本地分支和远程分支git branch -a新建分支git branch [name]切换分支git checkout [name]合并分支git merge [name]删除分支git branch -d [name]添加目...

2018-09-15 10:21:22 102

原创 Git使用之设置SSH Key

1. 检查是否设置过SSH Keycd ~/.ssh 2. 若没有使用过SSH Keyssh-keygen3. 进入ssh目录下查看公钥cat id_rsa.pub4. 将公钥添加至账号,github或者gitlab 5. 配置用户名和邮箱git config --global user.name "xxx" #commit时显示的用户名 ...

2018-09-13 17:05:42 230 1

原创 ReactNative开发常用命令(持续更新...)

Nodenode -v #显示版本,检查node是否正确安装node src/test.js #执行src目录下test.js文件NPMnpm -v #显示版本,检查npm 是否正确安装npm install #安装package.json下所有的模块npm install react-navigation --save 或 -S #安装react-...

2018-09-12 10:10:07 198

原创 关于ReactNative如何配置ESLint,Prettier,Pre-commit Hook

ESLintESLint 是一个按照规则给出报告的代码检测工具,使用它可以避免低级错误和统一代码风格,这对公司团队开发非常实用。安装1.全局安装如果你想使用ESLint适用于你所有的项目,建议全局安装ESLintnpm i -g eslint初始化配置文件./node_modules/.bin/eslint --init2.局部安装单个项目使用npm i...

2018-09-11 21:42:05 1499 2

原创 C语言学习笔记 - 错误处理、递归、可变参数、内存管理和命令行参数

C语言错误处理C 语言不提供对错误处理的直接支持,但是作为一种系统编程语言,它以返回值的形式允许您访问底层数据。在发生错误时,大多数的 C 或 UNIX 函数调用返回 1 或 NULL,同时会设置一个错误代码 errno,该错误代码是全局变量,表示在函数调用期间发生了错误。您可以在 errno、perror() 和 strerror()C 语言提供了 perror() 和 strerr...

2018-04-19 10:44:59 99

原创 C语言学习笔记 - 头文件

C头文件头文件是扩展名为.h的文件,包含了C函数声明和宏定义,被多个源文件上引用共享。有两种类型的头文件:程序员编写的头文件和编译自带的头文件。引用头文件的语法使用预处理指令#include可以引用用户和系统头文件。#include <file>这种形式用于引用系统头文件。#include "file"这种形式用于引用用户头文件。只引用...

2018-04-18 15:19:46 124

原创 C语言学习笔记 - 预处理器

C预处理器C 预处理器是一个文本替换工具而已,它们会指示编译器在实际编译之前完成所需的预处理。所有的预处理器命令都是以井号(#)开头。 指令 描述 #define 定义宏 #include 包含一个源代码文件 #undef 取消已定义的宏 #ifdef 如果宏已经定义,则返回真 #ifndef 如果宏没有定义,则返回...

2018-04-17 14:11:37 100 2

原创 C语言学习笔记 - 文件读写

C文件读写如何打开、创建、关闭文本文件或二进制文件?打开文件我们通常使用fopen()函数来创建新文件或打开一个已存在的文件,这样调用会初始化类型FILE的一个对象,类型FILE包含了所有用来控制流的必要的信息。FILE *fopen( const char * filename, const char * mode );filename 是字符串,用来命名文件,访问模...

2018-04-16 21:36:55 155

原创 C语言学习笔记 - 输入&输出

C输入&输出C语言提供了一系列内置函数来实现读取用户输入和输出至屏幕的功能。标准文件C 语言把所有的设备都当作文件。所以设备(比如显示器)被处理的方式与文件相同。以下三个文件会在程序执行时自动打开,以便访问键盘和屏幕。 标准文件 文件指针 设备 输入 stdin 键盘 输出 stdout 屏幕 错误 std...

2018-04-13 22:29:55 111

原创 C语言学习笔记 - typedef

Typedef声明与定义C语言提供了typedef关键字,可以使用它为类型取一个新名字。typeof unsigned char byte;byte b1, b2;也可以使用typedef为自定义数据类型取一个新名字。#include <stdio.h>#include <string.h>typedef struct Student...

2018-04-13 22:28:46 68

原创 C语言学习笔记 - 位域

C位域如果程序的结构中包含多个开关量,只有 TRUE/FALSE 变量,如下struct{ unsigned int widthValidated; unsigned int heightValidated;} status;此种结构需要 8 字节的内存空间,但在实际上,在每个变量中,我们只存储 0 或 1。在这种情况下,C 语言提供了一种更好的利用内存空间的方式。...

2018-04-13 22:26:41 89

原创 C语言基础 - 共用体

C共用体共用体是一种特殊的数据类型,允许您在相同的内存位置存储不同的数据类型。定义共用体定义共用体必须使用union关键字,方式与定义结构体类似。rule:union [union tag]{ member definition; member definition; ... member definition;} [one or more u...

2018-04-12 13:03:37 68

原创 C语言基础 - 结构体

C结构体C数组只允许定义相同类型的变量,而结构体可以根据需要储存不同类型的数据项。定义结构体定义结构体,必须使用struct关键字rule:struct [structure tag]{ member definition; member definition; ... member definition;} [one or more stru...

2018-04-10 17:30:29 47

原创 C语言基础 - 字符串

C字符串在C语言中,字符串实际上是使用null字符'\0'终止一堆字符串的。我们声明和创建一个Hello字符串,由于数组末尾多了个空字符串,所以比Hello字符串个数多一个。char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'}根据数组的规则,我们可以简化声明和创建:char greeting[] = "Hello";内...

2018-04-09 17:29:28 80

原创 C语言学习笔记 - 指针

C指针什么是指针?指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。int *ip; /* 一个整型的指针 */double *dp; /* 一个 double 型的指针 */float *fp; /* 一个浮点型的指针 */char *ch; /* 一个字符型的指针 */所有指针的值的实际数据类型,不管是整型、浮点...

2018-04-08 21:36:19 71

原创 C语言学习笔记 - 数组

C数组数组是用来存储一个固定大小的同类型元素的顺序集合。声明数组type arrayName [ arraySize ]int array[5];初始化数组int array[] = {1, 2, 3, 4, 5};int array[5] = {1, 2, 3, 4, 5};访问数组元素#include <stdio.h>...

2018-04-04 16:10:52 75

原创 C语言基础 - 作用域

C作用域规则局部变量在某个函数或块的内部声明的变量称为局部变量。它们只能被该函数或该代码块内部的语句使用#include <stdio.h>int main (){ /* 局部变量声明 */ int a, b; int c; /* 实际初始化 */ a = 10; b = 20; c = a + b; printf ("a ...

2018-04-03 17:02:44 53

原创 C语言学习笔记 - 函数

C函数在C程序中至少有一个函数,即主函数main()。函数声明告诉编译器函数的名称、返回类型和参数。函数定义提供了函数的实际主体。定义函数在C语言中,函数由函数头和函数体组成。主要是返回类型、函数名称、参数、函数主体几部分。template:return_type function_name( parameter list ) { body of the fun...

2018-04-03 16:27:50 121

原创 C语言学习 - 判断与循环

判断判断语句if语句#include <stdio.h>int main () { /* 局部变量定义 */ int a = 10, b = 20; /* 使用 if 语句检查布尔条件 */ if( a < b ) { /* 如果条件为真,则输出下面的语句 */ printf("a 小于 b\n" );...

2018-04-03 16:25:26 163

原创 C语言学习笔记 - 进制转换

C进制转换二进制与十进制十进制转二进制 十进制数除2取余数:即十进制数除2,余数为权位上的数,得到的商值继续除2,依此步骤继续向下运算直到商为0为止。二进制转十进制 把二进制数按权展开、相加即得十进制数。二进制与八进制二进制转八进制 3位二进制数按权展开相加得到1位八进制数。(注意事项,3位二进制转成八进制是从右到左开始转换,不足时补0)...

2018-04-03 16:23:40 127

原创 C语言学习笔记 - 运算符

运算符在C语言中主要提供了算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符和杂项运算符。算术运算符 运算符 描述 实例 + 两个数相加 a + b = 20 - 两个数相减 a - b = 0 * 两个数相乘 a * b = 100 / 两个数相除 a / b = 1 % 取模运算...

2018-04-03 14:25:26 131

提示
确定要删除当前文章?
取消 删除