我目前正在使用此代码成功移动我的视图
public boolean onTouch(View view, MotionEvent event) {
final int X = (int) event.getRawX();
final int Y = (int) event.getRawY();
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
RelativeLayout.LayoutParams lParams = (RelativeLayout.LayoutParams) view.getLayoutParams();
xDelta = X - lParams.leftMargin;
yDelta = Y - lParams.topMargin;
break;
case MotionEvent.ACTION_UP:
break;
case MotionEvent.ACTION_POINTER_DOWN:
break;
case MotionEvent.ACTION_POINTER_UP:
break;
case MotionEvent.ACTION_MOVE:
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) view.getLayoutParams();
layoutParams.leftMargin = X - xDelta;
layoutParams.topMargin = Y - yDelta;
layoutParams.rightMargin = -250;
layoutParams.bottomMargin = -250;
view.setLayoutParams(layoutParams);
break;
}
root.invalidate();
return true;
}
如果我按下视图并移动我的手指,视图会跟随它,现在我想实现一个滑动手势,它应该像这样工作: 如果我从背景开始滑动并点击视图,我希望它根据滑动的方向(向上,向下,向左或向右)播放旋转动画。 我仍然希望保留移动视图的能力。
想象一下,我可以移动一枚硬币,如果我的手指晃动它,它会旋转360°
修改 以下是我的旋转视图代码的工作原理,但只有从视图内部开始旋转才能工作
public class OnSwipeTouchListener implements OnTouchListener {
public final GestureDetector gestureDetector;
public OnSwipeTouchListener (Context ctx){
gestureDetector = new GestureDetector(ctx, new GestureListener());
}
@Override
public boolean onTouch(View v, MotionEvent event) {
return false;
}
private final class GestureListener extends SimpleOnGestureListener {
private static final int SWIPE_THRESHOLD = 100;
private static final int SWIPE_VELOCITY_THRESHOLD = 100;
@Override
public boolean onDown(MotionEvent e) {
return true;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
boolean result = false;
try {
float diffY = e2.getY() - e1.getY();
float diffX = e2.getX() - e1.getX();
if (Math.abs(diffX) > Math.abs(diffY)) {
if (Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
if (diffX > 0) {
onSwipeRight();
} else {
onSwipeLeft();
}
}
} else {
if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) {
if (diffY > 0) {
onSwipeBottom();
} else {
onSwipeTop();
}
}
}
} catch (Exception exception) {
exception.printStackTrace();
}
return result;
}
}
public void onSwipeRight() {
}
public void onSwipeLeft() {
}
public void onSwipeTop() {
}
public void onSwipeBottom() {
}
}
答案 0 :(得分:0)
您应该覆盖RelativeLayout中的OnTouch()
并将MotionEvent传递给SimpleOnGestureListener。在那里你可以为除onFling()之外的所有方法返回false,在那里你检查第一个事件是否在你要旋转的视图之外,第二个事件是在你要旋转的视图内。如果事件不是,则返回false表示您没有处理事件,否则您旋转硬币并指示您通过返回true来处理触摸事件。
作为一个额外的观点,我不认为你应该将右边距和下边距设置为-250否则视图将延伸到RelativeLayout的右边缘和底边缘之后的250像素,当我希望你只想要它时分别延伸到视图的预期宽度和高度。