飞飞的AI实验室

用AI放大灵感,把想法变成作品。

题图:来自网络

哈喽,朋友们,好久不见了,有段时间没推文了。从今天开始,我将计划更新 RxJava2.x 系列的文章,RxJava 是什么东西,我想也不用给大家介绍了吧。

其实,网上关于 RxJava 的相关文章一大堆,我之前也看过不少,对于新手来说,那些文章,要么就是比较长,不容易看下去,要么就是讲的全是理论,晦涩难懂,缺少实践性。

因此,我打算从今天开始,更新一系列的 RxJava2.x 教程,主要从常用的操作符讲起,目的很简单,带大家每天学会一个操作符的使用。

操作符是 RxJava 的重要组成部分,因此学习操作符也是非常重要的,RxJava 的操作符虽然说比较多,但是我们可以将其进行分类,然后逐一进行理解学习,其实也是比较容易和轻松的,RxJava 的操作符大致可以分为以下几类:

今天,我们先来学习两个简单的创建操作符 create & just。

在学习之前,我们先来回顾下观察者模式,大多数同学应该都不陌生吧,例如 Android 的EventBus 等框架都使用了观察者模式,简单说这就是一种发布、订阅的模式,你可以简单理解为订阅报纸。

这与 RxJava 又有什么关系呢?我们先来看下 Rx 的概念:Rx 是一个使用可观察数据流进行异步编程的编程接口,也就是说 RxJava 中使用了观察者模式的这种编程思想,另外还结合了迭代器模式和函数式编程,并把它运用发挥到了极致。

阅读全文 »

作为一名Android 开发者,我们都有发布 APP 内测版本的经历,有的公司是发布到自己的服务器上,生成一个连接或者二维码扫描就可以下载,有的公司使用一些内测平台如蒲公英、fir.im 等,有这么好的内测平台为什么不用呢?一方面这些平台的基本都是免费提供服务的,另外一方面也提供了许多丰富的 api,方便开发者使用,提升效率!

1.

前段时间研究 Android 端的自动打包,采用的是 Jenkins + Git 的方式,这样,当你 push 完代码之后,Jenkins 会自动拉取你的代码,然后再用 Gradle 工具进行自动化打包,Jenkins 可以配置许多插件,当打包完之后可以自动上传到蒲公英和 fir.im 等平台,特别方便,基本就是这么个流程,我们之前公司是运维帮我们在服务器端搭建的自动打包程序,这样的好处是当你需要打几十个包时,特别快,因为服务器的配置一般比电脑都高,并且不用占用自己电脑的资源。我自己前段时间也在自己的电脑上装了一个 Jenkins,然后一些配置,也可以进行自动化打包,但是我觉得没必要,因为你把代码 push 上去,然后再拉下来,然后再打包,用的还是你本地电脑的资源,还不如直接用 AS 打包来的快,我看了下 Jenkins 上传到公测平台的实现,其实就是用了一个 curl 命令来实现的,我就想着能不能在 Gradle 中配置上传的脚本?答案当然是可以的!

2.

首先,我们了解下什么是 curl?

下面的概念来自某度的解释:

1
curl 命令是一个利用 URL 规则在命令行下工作的文件传输工具。它支持文件的上传和下载,所以是综合传输工具,但按传统,习惯称 curl 为下载工具。作为一款强力工具,curl 支持包括 HTTP、HTTPS、ftp 等众多协议,还支持 POST、cookies、认证、从指定偏移处下载部分文件、用户代理字符串、限速、文件大小、进度条等特征。

简单说他就是一个命令,Linux 和 Mac 系统自带,Windows 需要安装 curl 才能使用,在哪里下载 curl?为了方便大家我已经帮大家下载好了,复制下面的字符发送到后台即可:

**curl**

里面包含 32 位 & 64 位的安装程序,还有安装教程的链接供大家参考,安装完成后需要配置环境变量,然后在 cmd 中输入

阅读全文 »

我们知道,只要是个 APP 就都有更新的功能,可以说这个功能是比较重要的功能,我们在上架之前都会发布测试的版本,测试一般都是发布到蒲公英、Fir.im 等平台,可以说这个需求也算是比较普遍的一个功能了,之前我们的 APP 用的是蒲公英公测,然后现在又有一个新的 APP 需要,这就需要把之前的更新功能重写一遍,其实这是比较麻烦的,也没有必要,我想着能不能把这个功能抽取出来,于是就有了今天这个库。

1.实现思路

其实,要实现这个功能也比较简单,第一步,我先是判断是否有读写外部存储的权限,因为下载 apk 一般来说是要下载到手机的 SD 卡上;如果有权限,那就调用蒲公英的更新检测接口,这个接口至少需要两个参数,apiKey 和 appKey,这两个值我们在蒲公英的 APP 信息中可以查到,我的想法是在清单文件中,让用户去设置这两个值,然后我动态取出来,这样就解决了这两个参数值传递的问题;接口请求成功后,会返回 buildVersionNo这个字段,然后通过这个返回字段与本地的 versionCode 去比对,如果比本地的大,说明就有新版本,然后弹出对话框,提示用户更新,当用户点击“更新”时,就去下载对应的版本即可,下载完成后调用安装程序,这样基本的更新思路就出来了。

2.使用方式

使用方式也比较简单,我已经将库发布到 jCenter 上了,大家查看项目的主页即可:

https://github.com/xinpengfei520/pgyer-android-app-update

如果你觉得有帮助的话,请帮我点个 star,谢谢!另外,欢迎大家 fork 和 PR。

温馨提示:
点击查看原文可以看到项目的主页。

阅读全文 »

BaseRecyclerViewAdapterHelper 是 GitHub 上的一个开源库,它可以让 RecyclerView 的使用更简单,方便和清晰,和原始的 adapter 相比,减少 70% 的代码量。确实,我最近的项目中也集成了这个库,并把之前的所有的 Adapter 都替换了为了库中的实现方式,代码量减少了,逻辑也更加清晰了,减少了一些无用功,提高了开发效率!强烈推荐大家使用。

这个库也算封装的很好了,正常情况下,可以满足大部分的开发需求,其主要有一下几大优点:

  1. 支持设置各种加载动画;
  2. 支持添加多个头和多个尾布局;
  3. 支持自动加载和预加载;
  4. 支持分组布局;
  5. 支持树形结构,也就是我们常说的折叠分组效果;
  6. 支持多种数据类型及多种布局的实现效果;
  7. 支持设置数据为空时的布局;
  8. 支持侧滑刷新和拖拽动作;
  9. 支持下拉刷新和加载更多;
  10. 支持自定义 ViewHolder;
  11. 更多请自行去发现…

开源库地址:https://github.com/CymChad/BaseRecyclerViewAdapterHelper

开源库中文文档:https://www.jianshu.com/p/b343fcff51b0

官方网站:http://www.recyclerview.org/

阅读全文 »

来,先看下效果图:

怎么样?漂亮吧,上面是一个标题栏,下面是一个弧形的 View,标题栏和弧形 View 从左到右都有一个线性的渐变色,类似于手机 QQ 顶部的渐变效果,关于弧形的这种效果,使用的场景还是比较普遍的,小面我们就一起来看看如何绘制吧。

1.先自定义一个 ArcView

创建一个类 ArcView 继承于 View,然后我们重写其三个构造方法,还有 onMeasure() 和 onDraw() 方法,这都是自定义 View 最基本的写法,比较简单这里就不详细说了, onMeasure() 用于测量 View 的宽高尺寸,onDraw() 就是具体的绘制过程了,具体的绘制思路是:我们在 onMeasure()方法中拿到测量出来的宽和高,然后再 onDraw() 中初始化一个画笔,我们可以创建一个 LinearGradient 对象,然后调用设置画笔的 setShader() 方法就可以达到画笔渐变色的效果,然后再创建一个 Rect 对象,这里只是创建了一个矩形对象,要想绘制弧形,我们还需要设置绘制的路径,创建一个 Path 对象,分别调用 moveTo() 方法,和 quadTo() 方法,moveTo ()不会进行绘制,只用于移动移动画笔,一般和其他方法配合使用,这里和 quadTo() 方法配合使用,而 quadTo() 用于绘制圆滑的曲线,即贝塞尔曲线。mPath.quadTo(x1, y1, x2, y2) 其中x1、y1 为控制点,x2、y2 为结束点。有了路径之后我们就可以轻而易举地绘制出一个弧形了,完整的代码请看下面:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
/**
* Created by x-sir on 2018/8/10 :)
* Function:自定义弧形 View
*/
public class ArcView extends View {

private int mWidth;
private int mHeight;
private int mArcHeight; // 弧形高度
private int mBgColor; // 背景颜色
private Paint mPaint;

public ArcView(Context context) {
this(context, null);
}

public ArcView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}

public ArcView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.ArcView);
mArcHeight = typedArray.getDimensionPixelSize(R.styleable.ArcView_arcHeight, 0);
mBgColor = typedArray.getColor(R.styleable.ArcView_bgColor, Color.parseColor("#1E90FF"));
typedArray.recycle();
mPaint = new Paint();
}

@SuppressLint("DrawAllocation")
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 参数一为渐变起初点坐标 x 位置,参数二为 y 轴位置,参数三和四分辨对应渐变终点,最后参数为平铺方式,这里设置为镜像
LinearGradient lg = new LinearGradient(0, 0, mWidth, 0,
Color.parseColor("#4796FB"), Color.parseColor("#5AB4F9"),
Shader.TileMode.CLAMP);
// 刚才已经讲到 Gradient 是基于 Shader 类,所以我们通过 Paint 的 setShader 方法来设置这个渐变
mPaint.setShader(lg);
mPaint.setStyle(Paint.Style.FILL);
//mPaint.setColor(mBgColor);
mPaint.setAntiAlias(true);
Rect rect = new Rect(0, 0, mWidth, mHeight - mArcHeight);
canvas.drawRect(rect, mPaint);
Path path = new Path();
path.moveTo(0, mHeight - mArcHeight);
path.quadTo(mWidth / 2, mHeight, mWidth, mHeight - mArcHeight);
canvas.drawPath(path, mPaint);
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);

if (widthMode == MeasureSpec.EXACTLY) {
mWidth = widthSize;
}
if (heightMode == MeasureSpec.EXACTLY) {
mHeight = heightSize;
}
setMeasuredDimension(mWidth, mHeight);
}
}

我这里只定义了弧形的高度和背景颜色这两个自定义属性,其中还有渐变颜色的开始色值和结束色值,还有是否需要渐变等属性,都可以定义为自定义的属性,方便直接在布局文件中灵活进行配置,以适应不同的需求,也比较简单,我这里为了就不实现了。

2.自定义一个通用的 titlebar

这样做我们可以提高代码的复用性,可以将一些功能封装进去,也更好地体现了封装的思想,实现也比较简单,使用 LayoutInflater 加载了一个布局文件,然后将 文字,字体大小,字体颜色和 title 背景色等定义成了自定义的属性,方便在布局文件中进行设置,另外我们内部默认处理了点击返回按钮的事件,对于需要其他特殊情况下返回按钮的处理,我们也定义了一个接口,方便外部使用接口来自行进行处理,代码也非常简单,看下面:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
/**
* Created by x-sir on 2018/9/2 :)
* Function:自定义通用 TitleBar
*/
public class TitleBarLayout extends LinearLayout {

private ImageView ivBack;
private ImageView ivMenu;
private TextView tvTitleName;
private LinearLayout llTitleBg;
private CharSequence mText;
private int mTitleBgColor;
private boolean mMenuVisible;
private int mTextSize;
private int mTextColor;
private OnMenuClickListener mListener;
private OnBackClickListener mOnBackListener;
private static final String DEFAULT_TEXT = "Title"; // default text.
private static final int DEFAULT_TEXT_SIZE = 16; // default text size.
private static final String TAG = "TitleBarLayout";

public TitleBarLayout(Context context) {
this(context, null);
}

public TitleBarLayout(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}

public TitleBarLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);

TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.TitleBarLayout);
mText = typedArray.getText(R.styleable.TitleBarLayout_text);
mTextSize = typedArray.getDimensionPixelSize(R.styleable.TitleBarLayout_textSize, DEFAULT_TEXT_SIZE);
mTextColor = typedArray.getColor(R.styleable.TitleBarLayout_textColor, Color.parseColor("#FFFFFF"));
mTitleBgColor = typedArray.getColor(R.styleable.TitleBarLayout_titleBgColor, Color.parseColor("#1E90FF"));
mMenuVisible = typedArray.getBoolean(R.styleable.TitleBarLayout_menuVisible, false);
typedArray.recycle();

initView(context);
initData();
initListener();
}

private void initView(Context context) {
LayoutInflater.from(context).inflate(R.layout.common_titlebar, this);
ivBack = findViewById(R.id.ivBack);
ivMenu = findViewById(R.id.ivMenu);
tvTitleName = findViewById(R.id.tvTitleName);
llTitleBg = findViewById(R.id.llTitleBg);
}

private void initData() {
String text = (mText != null) ? mText.toString() : DEFAULT_TEXT;
tvTitleName.setText(text);
tvTitleName.setTextSize(TypedValue.COMPLEX_UNIT_PX, mTextSize);
tvTitleName.setTextColor(mTextColor);
//llTitleBg.setBackgroundColor(mTitleBgColor);
ivMenu.setVisibility(mMenuVisible ? VISIBLE : INVISIBLE);
}

private void initListener() {
ivBack.setOnClickListener(v -> {
// 如果监听器不为空就让其自己处理,为空就默认处理(销毁页面)
if (mOnBackListener != null) {
mOnBackListener.onClick();
} else {
((Activity) getContext()).finish();
}
});
ivMenu.setOnClickListener(v -> {
if (mListener != null) {
mListener.onClick();
}
});
}

public void setTitleName(String title) {
if (!TextUtils.isEmpty(title)) {
tvTitleName.setText(title);
} else {
Log.e(TAG, "set title name failed, because title is null!");
}
}

public void setOnMenuListener(OnMenuClickListener mListener) {
this.mListener = mListener;
}

public void setOnBackListener(OnBackClickListener mOnBackListener) {
this.mOnBackListener = mOnBackListener;
}

public interface OnMenuClickListener {
void onClick();
}

public interface OnBackClickListener {
void onClick();
}
}
阅读全文 »

你租的房子遇 “坑” 了么?

前段时间真的是太忙了,出差了一周,另外还有自己的一堆事儿,忙成狗,几乎每天也就睡 5、6 个小时,现在终于不忙了,然后就可以安安静静地写文章了,好久没更了,让大家久等了。最近这段时间我身边发生了好多事情,有欠钱不还的,有租房被中介坑的,有公司裁员的… 真的是发生在谁身上谁倒霉,有些事情我们也无法避免,我们要做的就是不断吸取教训,长点心眼,提高自己判断力,来保护自己的利益不受侵害。

自从前一段时间爆出来自如甲醛房子的问题,后来又有自媒体爆料,一阿里 P7 员工在租住了杭州自如房 6 个月后,被查出患白血病,不久之后病情恶化,去世,一度引发舆论的关注!最近,又有媒体陆续曝出租客在自如出租房内的插座里发现针孔摄像头,租住数月后才发现。最近我身边几个认识的同学、同事租房也被中介坑,好像最近一段时间骗子又猖狂起来了?

1.“寓见”你真是倒了八辈子的霉了

【上海寓见公寓“爆仓”“租金贷”风险恐密集爆发】曾被雷军看好的长租公寓“爆仓”了。如今寓见公寓资金链断裂,一些房东在未收到租金的情况下,要求房客搬出。部分租客已聚集在寓见公寓总部所在地的上海市徐汇经侦支队报案,并试图“围堵”寓见公寓CEO 兼创始人林小森。在寓见公寓此次“爆仓”前,已经有多家长租公寓品牌出现问题。

这件事情真真切切的就发生在我同学的身上,他们从“寓见公寓”那里租的房子,“寓见公寓”从房东那里租的房子,她们每个月按时把租金交给“寓见公寓”,而“寓见公寓”没有把钱给房东,现在房东没有收到钱,房东现在找租客的事,另外,“寓见公寓”给租客们签的合同都是通过贷款平台贷的款,相当于是每个月的房租是分期付款,假设你签了 1 年的合同,那也就是说,“寓见公寓” 一次性就拿到了 1 年的租金(有钱了就可以去用钱去赚更多的钱了),然后,租客就每个月向贷款机构去还钱,这里说明一下,租客其实是不知道他们向贷款机构借钱了,签合同的时候,寓见的人只是说,这这个平台只是交租金,并没有向租客明确说明贷款这件事,我认为“寓见”隐瞒了事实,侵犯了租客的知情权,存在欺诈行为,当出现了事情之后,租客们才知道是“被”贷款了,如果没出现这事,租客可能一直都不知道“被”贷款了,现在的各种贷款都和你的征信挂钩,如果你没有按时交的话,有可能已经影响到你的征信了,可能影响到你买房买车等,但是你却全然不知,真的是太坑了,稍微一不注意就掉坑里了。现在“寓见”跑路,房东不让租客住房子,为了不影响征信,租客还要还贷款,你说这不是两头受气吃亏么?都是打工的,辛辛苦苦工作一个月,把工资的一大部分都交房租了,还遇到这样的事情,你说糟心不糟心?这种事情报案的话,处理起来也比较麻烦,能起到的作用也比较有限,所以,我们要擦亮自己的眼睛才是最主要的!

在这里提醒大家一下:如果租房的时候让你绑定个人银行卡并且还要让你通过某个你没听过的平台交房租时,你可得警惕注意了,稍不注意你就“被”贷款了!

2.黑中介“昊园恒业”是真的黑

这件事也是发生在我之前同事的身上,她之前是通过“昊园恒业”租的房子,然后在不知情的情况下,也被贷款了,是通过一个叫“元宝e家”的分期付款平台,元宝一次性把钱转给中介,现在中介违约了,中途让租客搬家,现在中介需要把钱返给元宝或者是将剩余的部分返给租客,但是中介一直拖着迟迟不给,现在租客和元宝之间的贷款还是有效的,也就说租客还要给元宝还贷款(影响征信),为什么中介迟迟拿不出钱?想都不用想,中介肯定把钱挪作他用了,一次性收一年的房租,中介才不会傻傻把钱拿手里或者存银行,他肯定是用这笔收过来的租金再搞其他投资,然后赚更多的钱,说白了就是以租房为幌子,玩的是资金流的把戏,美其名曰:“帮租客们减轻租房的压力,分期付款,享受高品质的生活”,嗯,没毛病,这样租户付款压力减轻了,还不用支付额外的利息,于是很多租户就接受了这种付款方式,这样租客们就轻轻松松的掉坑里了!

阅读全文 »

1.环境安装

1.1 Git

Windows:
https://gitforwindows.org/

如果是 Mac 电脑的话,请先安装 Xcode,因为 Xcode 自带 Git.

1.2 Node.js

下载对应系统的 node 安装包,一路 next 无脑安装即可;

https://nodejs.org/en/

1.3 hexo

因为 npm 命令是 node 中的,所有需要先安装node 然后再安装 hexo,然后利用 npm 命令即可安装 hexo(Windows 在任意位置点击鼠标右键,选择 Git bash,Mac 直接在终端中如下执行命令即可)

1
npm install -g hexo
阅读全文 »

作为一个技术人,我们不仅要不断地学习来提升自己不被淘汰,另外也要不断总结自己的经验和教训,踩过的坑、走过的弯路要善于去思考如何避免下次再踩坑?

我们也不要一直局限于自己的技术世界一心只敲代码,两耳不闻窗外事,这样未免就有点太局限了,也不利于自己的发展。

我们经历着互联网飞速发展的时代,从最初的 PC 时代,到移动互联网,然后到近几年的大数据、人工智能、区块链等技术,技术迭代的速度比以前更加快速了,这也意味着新的技术也会慢慢的代替掉一些旧的技术。

因此你也要跟随着时代的变化,不断更新自己的技术栈,去适应新的技术环境,提升自己的核心竞争力!

一些新兴技术行业的兴盛必然会导致另一些技术的衰落,衰落这个词用的不是太恰当,举个例子,例如 12、13 年很火的移动开发到这几年逐渐的也没那么火了,其实经过这几年的发展,开发的门槛越来越低,对技术人才的需求也日渐趋于饱和了。

但是初级工程师还是占很大一部分,高级工程师还是比较少,所以中间出现了断层的现象,如果你是初级者,怎样更快速地去提升自己,实现向高级的跨越?这应该是你需要思考的问题。

如果是中高级开发者,也应该有一些危机感,这样才能时刻提醒自己去不断的学习,不断地去改变和适应技术的发展,跟随技术的潮流不断前进,以至于才不会被淘汰!

另外,也不要一直守着自己的一亩三分地,要适当的多学习一些其他方面的技术,培养自己的第二技术能力,前提是首先得干好自己的本职工作,利用闲余时间去学习一些其他技术,技术之间也是相通的,如果你对某一个方面研究比较透彻的话,学习其他方面的技术也是很容易能够上手的。

之前看过美国那些 FLAG 公司,他们一般招聘都不会去明确的注明招聘的岗位,一般面试主要都是让你做算法题,他们认为你把算法这么难的东西都搞会了,不管干其他什么岗位工作都是没有问题的。

另外在工作的同时也要注重提升自己的技术影响力,我觉得这个也是比较重要的一方面,好处是不仅可以帮你之后找工作、升职、加薪和赚钱都是有帮助的,那么该如何提升自己呢?

阅读全文 »

今天不扯淡,给你们来点干的,推荐给你们一个神器…
这个神器是什么呢?

现如今,对于广大 IT 从业人员来说,很重要的三项技能是编程、英语和写作,编程不用说了,我们就靠这个吃饭的;英语对大多数的人来说,可能比较差,也算是比较头疼的,对于编程人员来说,对英语门槛的要求还算比较低的,因为写代码基本都是一些常用的编程语法词汇,另外对于英文的技术文档的阅读也还好,其实也就那么多的词汇,基本都是一些专业词汇,英文技术文档看多了,基本也没太多的生词,偶尔遇到不会的生词,用翻译软件查一下也特别的方便,但是我认为这只达到了编程所具备的基本英语水平,不算是真正的会英语,语言就是用来交流的,如果你能流畅的用英语交流才算是自己的一项技能,真正的会英语。对于大多数中国人来说,从小学到现在,学了差不多十几年,但是学的都是哑巴英语,老师大多发音也不标准,然后为了考试学习一堆的语法知识,全都是为了考试,根本没法用来交流,所以你英语没学好也不全是自己的原因。我自认为我自己的英语水平还可以,不算很厉害,但是在同龄人中应该算是比较偏上吧,一方面是有兴趣、喜欢学,另一方面自己也总结了一些学习英语方面的方法和技巧,回头有时间给大家整理一篇关于英语学习方面的文章,今天这里就不展开赘述了;另外一个技能就是写作了,对于大多数程序员来说,写作也算是比较困难的,尤其是刚开始写作,想半天写不出来一句话,说实话我自己也是,万事开头难,但是我相信只要坚持写作,坚持阅读,慢慢地一点一点,然后再写作过程中不断的总结,相信写多了你的写作水平会提高的,进步总有一个过程,写作这个技能还是要慢慢要磨出来的,不要寻求什么捷径,一夜变成大文豪,那是不可能的!回头有时间给大家整理一篇关于如何写作方面的文章。

如果说一篇文章内容很好,但是排版很差你会看吗?我想我是没有看下去的欲望,先抛开内容不说,排版可以说是一篇文章的脸面,第一印象不好,读者也就没有看下去的欲望了,所以一篇文章的第一印象是非常重要的。一篇好的文章排版肯定是经过精心设计的,包括文字的字体大小、颜色,字间距、行间距等等,另外还有文章的配图,颜色的搭配,文章段落的划分,文章的两端缩进等,总之一句话,好的排版会让你感觉看着很舒服,阅读起来也不会累。我刚开始写作的时候也遇到了排版的问题,不管怎么排,还是感觉怪怪的,没有达到自己想要的那种效果,我平时也比较喜欢写博客,现在好多博客平台大都支持 MarkDown 语法,你用 MarkDown 写完之后直接导入就行了,也不用过多的修改效果也很好,简单、清晰!但是还有一些平台是不支持 MarkDown 的,所以排版就是一个问题了,后来发现微信公众号有一个第三方的插件叫壹伴助手,试用过一段时间,不过他是收费的,后来我又发现了一个免费排版神器,也就是我现在一直用的,用了这么长时间感觉用的很爽,也很方便,所以我就推荐给大家,它叫 「Md2All」,是一个在线 MarkDown 排版神器,浏览器访问地址为:http://md.aclickall.com 可能一些读者已经用过了,用过的就不用往下看了,下面我就做一个简单的介绍和使用。

说一下我觉得比较好的地方:

  • 支持一键排版;
  • 支持几十种代码主题;
  • 支持代码显示行数及代码紧凑;
  • 支持导出带样式的 html;
  • 支持上传到七牛云图床;

更多功能介绍及使用,请访问:http://md.aclickall.com 查看,或者关注作者的微信公众号:颜家大少。

编辑面截图如下:

image

左边是 MarkDown 编辑区,右边是预览,界面很清晰、简洁!基本上,我每次排版的步骤是:

  1. 先用本地的 Markdown 编辑器写文章;
  2. 然后复制到 Md2All 的 MarkDown 编辑区;
  3. 设置文章的主题及边距、字体颜色大小等参数;
  4. 点击一键排版(自动会给你排好版);
  5. 点击复制,然后粘贴到微信公众号或者 CSDN、cnblog 的 html 编辑器中就可以发布文章了;
阅读全文 »

一年一度的安卓巴士开发者大会在上海隆重举行,有幸亲临参加了本次大会,本篇文章仅对本次大会的个人感受和各位技术大佬的分享以及未来的技术趋势与大家分享。

本次大会的主要内容有:技术大咖的个人主题分享,互动抽奖环节,圆桌会议,下午茶休息(提供各种水果和小吃甜点等),抽奖的奖品也比较丰厚,有技术图书,贴纸,抱枕,T恤,GDD 大会门票,各种小玩具等,奖品也比较丰厚。

上午场

上午第一位分享的嘉宾是 openinstall 的联合创始人徐兴,分享的是 openinstall 的 App 免邀请码安装及 App 安装来源的数据统计等技术功能,对于App的推广和数据统计来说是一把利器,相比传统的邀请码安装方式更简单、更容易,想了解更多请到官网进行详细了解,这里就不赘述了。

上午第二位分享的嘉宾是饿了么大佬王雨威(江湖人称:巴掌),主要分享了一个饿了么的来源库:UETool ,简单说,它是一个让程序员,设计师,测试可以动态调试 View 各种属性的工具,功能很强大,大大提高了开发的效率,更多介绍请戳 GitHub:

https://github.com/eleme/UETool

上午第三位分享的嘉宾是手机淘宝无线技术专家费义云,主要是先从计算机图形学引申到手机上的图形开发处理技术,从 GPU 底层的到上层应用进行详细的讲解,理论性和专业性都比较强,另外还有3D、AR、VR、OpenGL ES 等方面都做了细致的介绍,最后他还提出技术人提升的三层模型的观点,为技术人指明了方向,值得技术人思考。

下午场

下午第一位分享的嘉宾是张涛,大家可能都知道他的张涛实验室,分享的主题是《Android 十年,还有哪些可以做的》,主要从 Android 的过去到现在的发展,以及Android 技术演变的历程为主线,以几个大厂商 App 为例,回顾了 Android 的技术演变和 App 架构演变历程,中间贯穿了各种技术知识,分享很棒,回顾过去,展望未来,对于 Android 未来技术的发展趋势也指明了方向。

下午第二位分享的嘉宾是美图高级安卓开发工程师邱炬,分享的主题是《全面解析Android 线程》,由浅入深,从上层到底层的线程创建,让我们更清楚的了解了线程的本质,还对线程的优先级进行详细的介绍,另外还对线程池及多线程开发的注意事项进行详细的讲解,还对线程的性能及安全性问题做了很细致的分享,这些问题都是实际开发中经常遇到的问题,真的是收益匪浅!

阅读全文 »
0%