Android 如何防止在视图关闭动画功能结束前触摸视图?

Android 如何防止在视图关闭动画功能结束前触摸视图?,android,animation,touch-event,Android,Animation,Touch Event,我有一个自定义java类,它扩展了FrameLayout,它位于另一个扩展FrameLayout的自定义父视图的顶部 我有以下功能,可以通过动画关闭视图- private void dismissCard(final View view, int xPos) { view.animate() .x(xPos) .y(0) .setInterpolator(new AccelerateInterpolator()) .setD

我有一个自定义java类,它扩展了FrameLayout,它位于另一个扩展FrameLayout的自定义父视图的顶部

我有以下功能,可以通过动画关闭视图-

private void dismissCard(final View view, int xPos) {
    view.animate()
        .x(xPos)
        .y(0)
        .setInterpolator(new AccelerateInterpolator())
        .setDuration(DURATION)
        .setListener(new Animator.AnimatorListener() {
          @Override
          public void onAnimationStart(Animator animator) {
            setOnTouchListener(null);
          }
          @Override
          public void onAnimationEnd(Animator animator) {
            ViewGroup viewGroup = (ViewGroup) view.getParent();
            if (viewGroup != null) {
              viewGroup.removeView(view);
            }
          }
          @Override
          public void onAnimationCancel(Animator animator) {
          }
          @Override
          public void onAnimationRepeat(Animator animator) {
          }
        });
  }
问题是,我已经覆盖了用于移动视图功能的
onTouch()
函数,对于每次触摸,我都会获得视图的父视图(这是一个自定义视图),获得视图的所有子视图,并通过确定哪个视图位于顶部。因此,我的问题是,在设置动画时,动画视图仍然是位于顶部的视图,因此可以再次移动它,直到动画消失并且调用
viewGroup.removeView(view)

这是我的
onTouch()
实现-

@Override
  public boolean onTouch(final View view, MotionEvent motionEvent) {
    TinderStackLayout tinderStackLayout = ((TinderStackLayout) view.getParent());
    TinderCardView topCard = (TinderCardView) tinderStackLayout.getChildAt(tinderStackLayout.getChildCount() - 1);
    if (topCard.equals(view)) {
      switch (motionEvent.getAction()) {
        case MotionEvent.ACTION_DOWN:
          oldX = motionEvent.getX();
          oldY = motionEvent.getY();
          // cancel any current animations
          view.clearAnimation();
          return true;
        case MotionEvent.ACTION_UP:
          if (isCardBeyondLeftBoundary(view)) {
            Log.d("top card dismissed - ", topCard.usernameTextView.getText().toString());
            onCardSwipedListener.send(new TopCardMovedEvent(-(screenWidth)));
            dismissCard(view, -(screenWidth * 2));
          } else if (isCardBeyondRightBoundary(view)) {
            showLawyerContactDetailsFragment(topCard);
            onCardSwipedListener.send(new TopCardMovedEvent(-(screenWidth)));
            resetCard(view);
          } else {
            onCardSwipedListener.send(new TopCardMovedEvent(-(screenWidth)));
            resetCard(view);
          }
          return true;
        case MotionEvent.ACTION_MOVE:
          newX = motionEvent.getX();
          newY = motionEvent.getY();
          dX = newX - oldX;
          dY = newY - oldY;
          float posX = view.getX() + dX;
          onCardSwipedListener.send(new TopCardMovedEvent(-(screenWidth)));
          // Set new position
          view.setX(view.getX() + dX);
          view.setY(view.getY() + dY);
          setCardRotation(view, view.getX());
          updateAlphaOfBadges(posX);
          return true;
        default:
          return super.onTouchEvent(motionEvent);
      }
    }
    return super.onTouchEvent(motionEvent);
  }
我缺少的是在
dismissCard()
设置动画时阻止触摸功能的方法。我怎样才能实现这样的事情

在要设置动画的类中声明一个布尔变量(isAnimating),并在
onAnimationStart
中将其设置为true,在
onAnimationEnd
中将其设置为false

在您的
onTouch

@Override
  public boolean onTouch(final View view, MotionEvent motionEvent) {
    TinderStackLayout tinderStackLayout = ((TinderStackLayout) view.getParent());
    TinderCardView topCard = (TinderCardView) tinderStackLayout.getChildAt(tinderStackLayout.getChildCount() - 1);
    if (topCard.equals(view)&& !isAnimating) { //access event's only if animation is ended.
      switch (motionEvent.getAction()) {
        case MotionEvent.ACTION_DOWN:
          oldX = motionEvent.getX();
          oldY = motionEvent.getY();
          // cancel any current animations
          view.clearAnimation();
          return true;
        case MotionEvent.ACTION_UP:
          if (isCardBeyondLeftBoundary(view)) {
            Log.d("top card dismissed - ", topCard.usernameTextView.getText().toString());
            onCardSwipedListener.send(new TopCardMovedEvent(-(screenWidth)));
            dismissCard(view, -(screenWidth * 2));
          } else if (isCardBeyondRightBoundary(view)) {
            showLawyerContactDetailsFragment(topCard);
            onCardSwipedListener.send(new TopCardMovedEvent(-(screenWidth)));
            resetCard(view);
          } else {
            onCardSwipedListener.send(new TopCardMovedEvent(-(screenWidth)));
            resetCard(view);
          }
          return true;
        case MotionEvent.ACTION_MOVE:
          newX = motionEvent.getX();
          newY = motionEvent.getY();
          dX = newX - oldX;
          dY = newY - oldY;
          float posX = view.getX() + dX;
          onCardSwipedListener.send(new TopCardMovedEvent(-(screenWidth)));
          // Set new position
          view.setX(view.getX() + dX);
          view.setY(view.getY() + dY);
          setCardRotation(view, view.getX());
          updateAlphaOfBadges(posX);
          return true;
        default:
          return super.onTouchEvent(motionEvent);
      }
    }
    return super.onTouchEvent(motionEvent);
  }
另外,更好的解决方案是在isAnimating为
true
时返回false。在我的应用程序中,我已覆盖父类中的dispatch touch,并且不让任何事件到达父类或其任何子类

override fun dispatchTouchEvent(ev: MotionEvent?): Boolean {
 if (isAnimationOnGoing) {
        return false
 }
 return super.dispatchTouchEvent(ev)
}

尝试了这两种解决方案。出于某种原因,当代码输入
onTouch
dispatchTouchEvent
时,布尔值始终为false,为什么会发生这种情况?另外,第一种方法和第二种方法有什么不同?您需要调试为什么重置布尔值,因为它对我来说非常有效。第一种方法仅对特定视图限制事件,而第二种方法对视图和视图的所有子视图限制事件@阿隆