丙午🐎年

acc8226 的博客

if 逻辑判断

<if> 标签没有任何的标签内属性,在 <if> 标签下紧跟着嵌套一个条件判断任务,如果条件判断为真,则直接处理 <then> 标签的内容;如果条件为假,则跳转到 <elseif> 标签中,接下判断该标签内的条件判断并根据结果选择去处理接下来的 <then> 内容或者再跳转出来处理 <else> 标签的内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<property name="what.is.your.name" value="mobile.qq"/>
<if>
<equals arg1="${what.is.your.name}" arg2="mobile"/>
<then>
<echo message="My name is mobile."></echo>
</then>
<elseif>
<equals arg1="${what.is.your.name}" arg2="qq"/>
<then>
<echo message="My name is qq."></echo>
</then>
</elseif>
<else>
<echo message="I don't know your name."/>
</else>
</if>
阅读全文 »

要点:如果不是必须, 用系统控件

RxJava

线程切换需要注意的地方
RxJava 内置的线程调度器的确可以让我们的线程切换得心应手,但其中也有些需要注意的地方。

  • 简单地说,subscribeOn() 指定的就是发射事件的线程,observerOn() 指定的就是订阅者接收事件的线程。
  • 多次指定发射事件的线程只有第一次指定的有效,也就是说多次调用 subscribeOn() 只有第一次的有效,其余的会被忽略。
  • 但多次指定订阅者接收线程是可以的,也就是说每调用一次 observerOn(),下游的线程就会切换一次。

RxJava 中,已经内置了很多线程选项供我们选择,例如有:

  • Schedulers.io() 代表io操作的线程, 通常用于网络,读写文件等 IO 密集型的操作;

  • Schedulers.computation() 代表CPU计算密集型的操作, 例如需要大量计算的操作;

  • Schedulers.newThread() 代表一个常规的新线程;

阅读全文 »

先总结下自定义 View 的步骤:

  1. 自定义 View 的属性
  2. 在 View 的构造方法中获得我们自定义的属性
  3. [重写 onMeasure]
  4. 重写 onDraw

我把 3 用[]标出了,所以说 3 不一定是必须的,当然了大部分情况下还是需要重写的。

  1. 自定义 View 的属性,首先在 res/values/ 下建立一个 attrs.xml , 在里面定义我们的属性和声明我们的整个样式。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0" encoding="utf-8"?>
<resources>

<attr name="titleText" format="string" />
<attr name="titleTextColor" format="color" />
<attr name="titleTextSize" format="dimension" />

<declare-styleable name="CustomTitleView">
<attr name="titleText" />
<attr name="titleTextColor" />
<attr name="titleTextSize" />
</declare-styleable>

</resources>

format 是值该属性的取值类型:
string, color, demension, integer, enum, reference, float,boolean, fraction, flag;不清楚的可以 google

自定义 View 之基础概念之用到的六个工具

  • Configuration

  • ViewConfiguration
    提供了一些自定义控件用到的标准常量, 比如UI超时, 尺寸大小, 滑动距离, 敏感度等等

  • GestureDetector
    简化Touch操作

  • VelocityTracker
    用于跟踪触摸屏事件(比如: Flingling 以及其他手势事件)的速率

1
2
3
4
5
6
7
8
9
10
11
mVelocityTracker = VelocityTracker.obtain();
mVelocityTracker.addMovement(MotionEvent event);

// 获取1000毫秒内运行的像素
mVelocityTracker.computeCurrentVeleocity(1000)

// 获取1S内 X 方向上移动的像素
mVelocityTracker.getXVelocity()

// 最后记得释放
mVelocityTracker.recycle()
  • Scroller
    scrollBy() 内部还是调用了scrollTo()
    scrollTo() 和 scrollBy()

mTextView.scrollTo(0, 25)

  • ViewDragHelper
    简化 View 的拖拽操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
ViewDragHelper mViewDragHelper = ViewDragHelper.create(context, 1.0f, new ViewDragHelper.Callback(){
clampViewPositionHorizontal(View child, int left, int dx)
clampViewPositionVertical(View child, int left, int dx)
onViewDragStateChanged(int state){
ViewDragHelper.STATE_DRAGGING:
ViewDragHelper.STATE_IDLE:
ViewDragHelper.STATE_SETTLING:
}
}

然后代理两个方法

```java
public boolean onINterrceptTouchEvent(MotionEvent ev) {
return mViewDragHelper.shouldInterceptTouchEvent(ev);
}

public boolean onTouchEvent(MotionEvent ev) {
mViewDragHelper.processTouchEvent(ev);
return true;
}
1
2
3
4
int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);

int measureSpec = MeasureSpec.makeMeasureSpec(size, mode);

四大组件

活动(activity)

android-lifecycle/complete_android_fragment_lifecycle

服务(Service)

最终结果不会影响 UI, 例如将数据缓存到数据库中。

  • Service
  • IntentService
  • 会在后台线程执行 onHandleIntent 方法
  • 按顺序执行, 但一次只能处理一个

广播接受者(Broadcast Receive)

  • 动态注册: 电池电量变化
  • 静态注册: 耗电, 一般不推荐

内容提供者(Content Provider)

参考

Android 四大组件(整理相关知识点)_Calvert 的博客- CSDN 博客_安卓四大组件 https://blog.csdn.net/xchaha/article/details/80398620

0%