我正在追踪一个问题,导致我的应用在拖动屏幕上的触摸时出现一些闪烁。
这个问题似乎与Math.min
在某些情况下没有返回正确的结果有关。
mPointerPos.mPos.x = Math.min(mPointerPos.mPos.x, 0.9f * mDragStartPos.x);
我通过条件语句更改了函数调用,但问题仍然存在。
float min = 0.9f * mDragStartPos.x;
Log.w("!", "" + mPointerPos.mPos.x + " " + min);
mPointerPos.mPos.x = mPointerPos.mPos.x < min ? mPointerPos.mPos.x : min;
Log.w("!\t->", "" + mPointerPos.mPos.x);
输出结果为:
01-12 08:36:34.133 26229-26229 W/!: -0.3032546
01-12 08:36:34.134 26229-26229 W/!: -0.3032546 -1.4999999
01-12 08:36:34.134 26229-26229 W/! ->: -1.4999999
01-12 08:36:34.147 26229-26229 W/!: -0.2417283
01-12 08:36:34.148 26229-26229 W/!: -0.2417283 -1.4999999
01-12 08:36:34.152 26229-26229 W/! ->: -1.5933207
01-12 08:36:34.158 26229-26229 W/!: -0.19270718
01-12 08:36:34.159 26229-26229 W/!: -0.19270718 -1.4999999
01-12 08:36:34.159 26229-26229 W/! ->: -1.4999999
在第6行,我期待看到-1.4999999,即-0.2417283和-1.4999999之间的最小值,而不是我得到-1.5933207
有什么我想念的吗? mPointerPos.mPos
和mDragStartPos
的类型为android.graphics.PointF
答案 0 :(得分:1)
mPointerPos显然是由其他一些线程在两行之间更新的。 mPointerPos如何更新?这段代码在哪里执行?回答这些问题可能会为您提供问题的答案(可能只是在双方添加同步块......或者重写该部分程序的整个逻辑)。