首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何防止在视图解除动画功能结束之前接触视图?

如何防止在视图解除动画功能结束之前接触视图?
EN

Stack Overflow用户
提问于 2019-10-10 15:14:14
回答 1查看 21关注 0票数 0

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

我有下面的函数,它用动画消除视图-

代码语言:javascript
复制
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()实现:

代码语言:javascript
复制
@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()动画时阻止触摸能力的方法。我该如何实现这样的东西呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-10 15:20:35

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

onTouch中访问此变量

代码语言:javascript
复制
@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.In我的应用程序重写了父类中的分派接触时返回false,并且不让任何事件到达父类或它的任何子类。

代码语言:javascript
复制
override fun dispatchTouchEvent(ev: MotionEvent?): Boolean {
 if (isAnimationOnGoing) {
        return false
 }
 return super.dispatchTouchEvent(ev)
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58317365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档