我有一个自定义的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()动画时阻止触摸能力的方法。我该如何实现这样的东西呢?
发布于 2019-10-10 15:20:35
在要设置动画的类中声明一个布尔变量(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.In我的应用程序重写了父类中的分派接触时返回false,并且不让任何事件到达父类或它的任何子类。
override fun dispatchTouchEvent(ev: MotionEvent?): Boolean {
if (isAnimationOnGoing) {
return false
}
return super.dispatchTouchEvent(ev)
}https://stackoverflow.com/questions/58317365
复制相似问题