2017-01-12 1 views
0

Я отслеживаю проблему, которая вызывает у моего приложения некоторое мерцание при перетаскивании касания на экране.Проблема с Math.min на Android-приложении

Проблема, похоже, связана с 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

+2

Держу пари, что это проблема многопоточности – Selvin

+0

постарайтесь сделать ее максимально простой. Поэтому для этих операций используйте только локальные переменные: 'float x = mDragStartPos.x; 'и работать с' x' вместо глобальных или переменных параметров. Или синхронизировать код. Если вы этого не сделаете, 'mPointerPos.mPos.x' может быть изменен другим потоком, пока вы выполняете свои вычисления. –

ответ

1

mPointerPos, очевидно, обновляется между двумя линиями каким-либо другим потоком. Как обновляется mPointerPos? Где выполняется этот код? Ответ на эти вопросы, вероятно, даст вам ответ на вашу проблему (которая может просто состоять в том, чтобы добавить блок синхронизации с обеих сторон ... или переписать всю логику той части программы).

+0

' mPointerPos.mPos' обновляется в 'onDrawFrame' и' onTouch', я думаю, у меня будет чтобы переместить логику в первом в другое место, чтобы избежать подобных проблем. – rraallvv

Смежные вопросы