触摸事件 ACTION_UP/ACTION_MOVE 的分发

MotionEvent 的 ACTIONDOWN 是按照传递流程执行的, 但是 ACTIONUP/ACTION_MOVE 的传递过程会 受到事件是否被消费的影响 (被消费指的是方法返回 true ) 基础知识 触摸事件的分发主要涉及以下三个方法 boolean dispatchTouchEvent(MotionEvent event) boolean onTouchEvent(MotionEvent event) boolean onInterceptTouchEvent(MotionEvent event) // ViewGroup 独有 MotionEvent 有三种动作 (actoin) ACTION_DOWN 按下 ACTION_UP 抬起 ACTION_MOVE 移动 总的来说触摸事件的 传递流程 是: dispatchTouchEvent() -> onIntercept ...

Program type already present

Program type already present: android.support.annotation.AnimRes Message{kind=ERROR, text=Program type already present: android.support.annotation.AnimRes, sources=[Unknown source file], tool name=Optional.of(D8)} 12 Program type already present: android.support.annotation.AnimResMessage{kind=ERROR, text=Program type already present: android.support.annotation.AnimRes, sources=[Unknown source file], tool name=Optional ...

使用 HanziToPinyin 转拼音

看源码时发现, 在联系人存储的代码下, 有一个汉字转拼音的工具类 HanziToPinyin; 使用了全球化支持库 icu4j 导入依赖文件: implementation 'com.ibm.icu:icu4j:60.2' 1     implementation 'com.ibm.icu:icu4j:60.2' 使用方法: hanziToPinyin = HanziToPinyin.getInstance(); String pinyin = hanziToPinyin.transliterate("汉语拼音"); ...

JNI 回调报错

java_vm_ext.cc:534] JNI DETECTED ERROR IN APPLICATION: can't call void com.jnidemo.NativeInterface.onConnectionStateChanged(int, int) on instance of java.lang.Class jni 中无法回调某个 java 方法; 因为使用了错误的 jobject 对象来回调 java 中的方法; // java public native static void initNative(); public void stateCallback(){ } // C 中 static JNIEnv *sCallbackEnv = NULL; static jobject mCallbacksObj = NULL; // 第二个参数应是 jclass, 虽不报错但使用 ...

activity-alias 和 meta-data 标签

activity-alias 标签 activity 别名, 使用 android:targetActivity 指定真正指向的 activity, 调用这个 activity 会打开 targetActivity; <activity-alias android:enabled=["true" | "false"] android:exported=["true" | "false"] android:icon="drawable resource" android:label="string resource" android:name="string" android:permission="string" android:targetActivity="strin ...

java原子性

原子操作被认为是原子性; 一个操作是 不可打断 的, 一旦开始, 就运行到结束, 就认为是原子操作, 像 a=0, 只有一个操作, 不可打断, 认为是原子操作, 还有一些语句块, 用 sychronized 加锁后, 也可认为是原子操作; java 提供了位于包 java.util.concurrent.atomic 中的原子类, 使用该工具包中的原子类, 可在不加锁的情况下对单个变量安全的进行多线程编程; 包中的类 AtomicBoolean 可以用原子方式更新的 boolean 值。 AtomicInteger 可以用原子方式更新的 int 值。 AtomicIntegerArray 可以用 ...

JNI 引入已有的库文件遇到的问题

软件环境 Android studio: 3.1.1 NDK 版本: r15c targetSdkVersion 27 Gradle Version: 4.4 Android Plugin Version:3.1.1 error adding symbols: File in wrong format 已有的动态库可能是针对一个特定的平台, 指定想要编译出的库对应的平台与已有 so 文件相同 // Module 下的 build.gradle // 假设已有的一个 so 文件对应的指令集是 armeabi-v7a android { defaultConfig { ... ndk { abiFilters "armeabi-v7a" } } } ...

java 基础回顾 – 初始化类的变量

创建对象的过程 1: 首次创建类或者首次访问类的静态方法/静态域, 定位到该类的 .class 文件 2: 载入 .class 文件, 静态初始化的所有动作都会执行, 因此静态初始化只在 .class 对象首次加载时进行一次 3: new 对象, 首先在堆上分配足够的空间给对象 4: 这块存储空间会被清 0, 基本类型设为默认值, 引用设为 null 5: 执行字段定义处的初始化动作 6: 执行构造器 java 中创建和初始化是一体的, 创建的时候就已经有初始化操作, 即使想延后初始化(比如像在构造器里) 基本数据类型初始化时的默认值 boolean > false char > 0 byte & ...

View 构造方法中第三个参数 defStyleAttr

今天使用一个自定义控件继承自 AppCompatButton, 字体不是居中的, 最后排查发现是构造方法的问题; 对比 AppCompatButton 的源码发现是 defStyleAttr 参数的问题 public class TButton extends android.support.v7.widget.AppCompatButton { public TButton(Context context) { this(context, null); } public TButton(Context context, AttributeSet attrs) { this(context, attrs, 0); } public TButton(Context context, AttributeSet attrs, in ...

java 基础回顾 – Object

Object 是 java 中的基类 里面的部分方法经常需要被重写, 所以必须对 Object 内的方法有所了解. 下面是 Object 的部分源码内容和注释 package java.lang; public class Object { public Object() { } /** * 拷贝对象, 直接调用是浅拷贝, 重写后通过对非基础类型的属性调用循环调用 clone() 方法实现深拷贝 */ protected java.lang.Object clone() throws CloneNotSupportedException { } /** ...