Я создал представление, которое имеет MapFragment, который занимает верхнюю 1/3 экрана и ListView, который занимает нижнюю часть 2/3 экрана. ListView имеет «дескриптор» непосредственно над его элементами списка, которые пользователь может использовать для перетаскивания всего списка ListView вверх или вниз. Как только пользователь отпустит свой палец на экране, ListView должен анимировать верхнюю или нижнюю границу шкафа на весь экран. Я работаю до сих пор, но анимация негладкая. После того, как пользователь отпустит палец с экрана, появляется заметная пауза, прежде чем ListView начнет анимацию в направлении ближайшего края. Я использую реализацию Objectolder для девятилетних разработчиков, чтобы анимация работала на устройствах с предварительной сотой. Есть идеи?Как плавно анимировать представление вверх/вниз на основе движения перетаскивания с помощью ObjectAnimator?
Вот мое onTouch осуще ниже:
public boolean onTouch(View v, MotionEvent event) {
final LayoutParams listLp = (LayoutParams) mListFrame.getLayoutParams();
final int topMargin = -mHandleShadow.getHeight();
final int middleMargin = getResources().getDimensionPixelSize(R.dimen.map_handle_margin_top);
final int bottomMargin = getView().getHeight() - mHandle.getHeight() - mHandleShadow.getHeight();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mInitY = (int) event.getRawY();
mTopMargin = listLp.topMargin;
break;
case MotionEvent.ACTION_MOVE:
int y = mTopMargin + (int) event.getRawY() - mInitY;
if (y >= -mHandleShadow.getHeight() && y <= (mViewHeight - mHandle.getHeight() - mHandleShadow.getHeight())) {
listLp.topMargin = y;
mListFrame.setLayoutParams(listLp);
}
break;
case MotionEvent.ACTION_UP:
if ((mInitY > event.getRawY() && mClosestAnchor == Anchor.MIDDLE) || (listLp.topMargin < middleMargin && mClosestAnchor == Anchor.BOTTOM)) {
ObjectAnimator animator = ObjectAnimator.ofInt(AnimatorProxy.wrap(mListFrame), "topMargin", topMargin);
animator.setInterpolator(new AccelerateInterpolator());
animator.start();
mClosestAnchor = Anchor.TOP;
}
else if ((mInitY < event.getRawY() && mClosestAnchor == Anchor.MIDDLE) || (listLp.topMargin > middleMargin && mClosestAnchor == Anchor.TOP)) {
ObjectAnimator animator = ObjectAnimator.ofInt(AnimatorProxy.wrap(mListFrame), "topMargin", bottomMargin);
animator.setInterpolator(new AccelerateInterpolator());
animator.start();
mClosestAnchor = Anchor.BOTTOM;
}
else {
ObjectAnimator animator = ObjectAnimator.ofInt(AnimatorProxy.wrap(mListFrame), "topMargin", middleMargin);
animator.setInterpolator(new AccelerateInterpolator());
animator.start();
mClosestAnchor = Anchor.MIDDLE;
}
break;
}
return true;
}
Почему вы не используете setY на ACTION_MOVE? –