工作日志(2017-10)

     十月. 因为假期而砍半的一个月.

Tuesday 10th

     1. 我去, 还有不知道位运算的优先级要比加减法要低的么.(其实是一样, 从左往右的顺序)

     2. fetching document… 想咬人.
     最近 google 刚刚出了 sdk-26 的源码, 终于可以看文档了, 然而却看到了 fetching document.. 来配置一下.

     终端, 切换到 Android Studio 配置目录下.

1
2
:~ congguangzi$ cd ~/Library/Preferences/
:Preferences congguangzi$ cd AndroidStudio2.3/options/

     修改 jdk.tables.xml 文件.
     将相应的 节点的数据做修改. 将服务端的 url 修改为本地的.

1
2
3
4
5
<javadocPath>
<root type="composite">
<root type="simple" url="file://$USER_HOME$/Library/Android/sdk/docs/reference/" />
</root>
</javadocPath>

     上面是修改好了的, 在我 Mac 上的相应的本地地址为: file://$USER_HOME$/Library/Android/sdk/docs/reference/
     最后记得重新启动 Android Studio.

Wednesday 11th

     1. Android Studio 快捷, 导入静态方法, New Skill get!. 但是说, 快捷键跟系统的输入法切换的快捷键冲突. 暂时把输入法的快捷键暂停掉.

Thursday 12th

     1. gitlab 输入用户名密码的问题, 公司的项目使用的是 gitlab 来维护, http 的方式, 每次fetch, push 代码都需要 输入用户名和密码, 于是乎烦的我实在是不要不要的. 终于找到了一种解决方案.
     假设项目的 url 为: http://git.dian***huo.top/root/mobile_android_pos.git
     在项目目录下的 .git/config 文件中. url 一项添加用户名密码.

1
2
3
[remote "origin"]
url = http://congguangzi:qgby=750@git.dian***huo.top/root/mobile_android_pos.git
fetch = +refs/heads/*:refs/remotes/origin/*

     用户名为 congguangzi; 密码为 qgby=750
     最后, 记得重新启动终端.

Tuesday 17th

     1. debug 代码可能会走到 Android 的系统级别的源码中, 这个时候可能会存在对不上的问题. 这个原因是因为项目编译的 sdk 与设备的 sdk 不统一的原因, 所以会出现 debug 对不上的现象.
     解决这个问题建议使用模拟器, 创建相应的 sdk 的系统, 然后运行代码就可以了. 如果是修改 build.gradle 中的 compileSdkVersion 一项, 可能会导致项目编译不通过.

     2. EditText 获取焦点时, 数字键区的 enter 键与主键盘区的 enter 都执行换行功能.(这个问题折腾了我好长时间.)
     思路是重写 EditText 的 onKeyDown(int keyCode, KeyEvent event), 修改其中的 keyCode 和 KeyEvent, 将 KeyEvent.KEYCODE_NUMPAD_ENTER 替换为 KeyEvent.KEYCODE_ENTER.
     然而并没有什么卵用的说… 跟踪源码的话, 在系统级别的源码并没有找到修改焦点的逻辑. 这个事件会一直传递到系统, 应该是底层系统处理了这个事件.
     但是如果把 KeyEvent.KEYCODE_NUMPAD_ENTER 修改为 keyEvent.KEYCODE_TAB 就可以实现了.

     其实没有必要那么麻烦, 只需要在 Fragment 界面设置 OnKeyListener 的监听就可以实现了.

Monday 22nd

     1. 获取图片矩阵.

1
2
3
4
5
6
7
8
if (drawable != null) {
canvas.save();
// 确保尺寸绘制在图片上. 而不是整个 view 上.
canvas.concat(getImageMatrix());
Rect bounds = drawable.getBounds();
canvas.drawText(getResources().getString(R.string.image_size, bounds.width(), bounds.height()), 20, 40, paint);
canvas.restore();
}

     2. 获取 TextView 的每一行文字的坐标.

1
2
3
4
5
6
7
8
9
10
11
12
13
@Override
protected void onDraw(Canvas canvas) {
Layout layout = getLayout();
// 获取第二行文字的上下左右的位置.
bounds.left = layout.getLineLeft(1);
bounds.right = layout.getLineRight(1);
bounds.top = layout.getLineTop(1);
bounds.bottom = layout.getLineBottom(1);
canvas.drawRect(bounds, paint);
super.onDraw(canvas);
}

Tuesday 26th

     1.git 远程分支的同步. 如果是第一次 clone 同步, 那么远程的分支会全部同步下来, 可以直接切换远程分支就好.
     但是分支如果是后来建立的, 那么不会自动同步到本地. 需要执行.

1
$ git fetch

     之后, 就可以在 git branch -r 的结果中看到所有的远程分支了.

     2. Android Studio 添加依赖的 Module.
     添加的 Module 可以作为独立的一个模块, 可以理解为任务拆分, 也可以理解为解耦, 也可以理解为模块化. 好像是还可以导出一个包, 兼职不能更加完美.
     这个过程可以分为两步, 首先在住项目中添加 Module. 选择 File –> new –> new Module/import Module… 导入一个新的或是第三方的 Module.
     然后, 添加主工程对该 Module 的依赖. 选择 File –> Project Structure… , 或者直接快捷键 Command + ; 打开项目结构设置页面. 添加依赖.



     然后, 就可以在项目主工程下引用相应 Module 的代码了.

     3. 不同的电脑在相同的 Android 机器上装包时, 会要求先卸掉, 然后重新装. 除了 versionCode 不同之外, 还是因为 debug.keystore 不同所导致的.
     如果项目需要多人协同在一台机子上工作, 可以分享根目录下的 .android 目录下的 debug.keystore 文件. 所有的开发者共用一套, 这样就不会导致重新安装了.

Tuesday 31st

     双十一就要来了, 打算入一个运动耳机.
     1. 在 ViewGroup 中添加 View, 在代码中处理的方式. 这里我们在一个 RelativeLayout 中添加两个 View 并对他们做处理. 类似于 Activity 中对 View 处理的方式, 只不过不是在 onCreate() 方法中罢了.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Practice06KeyframeLayout extends RelativeLayout {
Practice06KeyframeView view;
Button animateBt;
//.. 构造方法省略..
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
// 在这里去获取 ViewGroup 中的控件, 并执行相应的操作.
view = (Practice06KeyframeView) findViewById(R.id.objectAnimatorView);
animateBt = (Button) findViewById(R.id.animateBt);
}
}

     2. DialogFragment 按照比例显示.
     亲测 DialogFragment 虽然是官方推荐, 但是并不会像你想象中的那个样子. 没法确定对话框的宽高, 即使使用布局的嵌套都不行, 包括使用 ConstraintLayout… 我去, 为何 Google 也会有这么反人类的设计…
     解决这个问题需要在代码中动态的设置比例.

1
2
3
4
5
6
7
8
9
10
11
@Override
public void onStart() {
super.onStart();
Dialog dialog = getDialog();
if (dialog != null && getActivity() != null && dialog.getWindow() != null) {
DisplayMetrics metrics = new DisplayMetrics();
getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics);
dialog.getWindow().setLayout(((int) (metrics.widthPixels * WIDTH_PERCENT)),
((int) (metrics.heightPixels * HEIGHT_PERCENT)));
}
}

     对话框就可以正常的按照要求显示了.
     但是, 这是一种非常非常搓的实现方式, 绘制的逻辑, 尽量放在 .xml 文件中, 不要放在代码中.
     其实弹出框可以直接指定宽高. 添加两条属性.

1
2
android:minHeight=""
android:minWidth=""

     就可以指定最小宽高了, 然后就可以正常显示了.

~感谢捧场,您的支持将鼓励我继续创作~