Android ViewFlipper 不翻转
我有一个 ViewFlipper 应该对 fling 手势做出反应,但它没有。
的 ViewFlipper 的Activity
@Override
public void onCreate(Bundle savedInstanceState) {
...
listView = this.getListView();
detector = new GestureDetector(this, new FlingGestureListener(listView));
...
}
FlingGestureListener
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
int pos = source.pointToPosition(Math.round(e1.getX()), Math.round(e1.getY()));
View v = source.getChildAt(pos - source.getFirstVisiblePosition());
System.out.println("fling: x=" + velocityX + " y=" + velocityY);
try {
IFlingable flingable = (IFlingable) v;
if(velocityY > -200 && velocityY < 200) {
if(velocityX < 0)
flingable.fling(IFlingable.RIGHT_TO_LEFT);
else if(velocityX > 0)
flingable.fling(IFlingable.LEFT_TO_RIGHT);
}
} catch(Exception e) {}
return false;
}
带有实现 IFlingable
public void fling(int direction) {
System.out.println("flip: " + direction);
switch(direction) {
case IFlingable.LEFT_TO_RIGHT:
System.out.println("piep");
GUIHelper.setAnimationSlideLeftToRight(context, switcher);
switcher.showNext();
break;
case IFlingable.RIGHT_TO_LEFT:
System.out.println("pup");
GUIHelper.setAnimationSlideRightToLeft(context, switcher);
switcher.showPrevious();
break;
}
}
布局
<ViewFlipper android:id="@+id/viewSwitcher"
android:layout_height="wrap_content"
android:layout_width="match_parent" android:layout_weight="1"
android:inAnimation="@anim/slide_in_left"
android:outAnimation="@anim/slide_out_right">
<LinearLayout android:layout_height="wrap_content"
android:layout_width="match_parent" android:orientation="vertical">
...
</LinearLayout>
...
</ViewFlipper>
日志
fling: x=2542.3613 y=95.877945
flip: 0
piep
View我得到了正确的日志消息,因此 ViewFlipper 上的 showNext() 被执行,但它不会更改其在 gui 上的视图。我错过了什么吗?我有另一种布局,使用 ViewSwitcher 而不是 Flipper,并且该布局有效。
编辑:
以下是缺少的课程:
public class GUIHelper {
...
public static void setAnimationSlideLeftToRight(Context context, ViewAnimator switcher) {
Animation in = AnimationUtils.loadAnimation(context, R.anim.slide_in_left);
Animation out = AnimationUtils.loadAnimation(context, R.anim.slide_out_right);
switcher.setInAnimation(in);
switcher.setOutAnimation(out);
}
public static void setAnimationSlideRightToLeft(Context context, ViewAnimator switcher) {
Animation in = AnimationUtils.loadAnimation(context, R.anim.slide_in_right);
Animation out = AnimationUtils.loadAnimation(context, R.anim.slide_out_left);
switcher.setInAnimation(in);
switcher.setOutAnimation(out);
}
...
}
public interface IFlingable {
public static final int LEFT_TO_RIGHT = 0;
public static final int RIGHT_TO_LEFT = 1;
public void fling(int direction, boolean fling);
}
I have a ViewFlipper which should react to a fling gesture, but it does not.
Activity
@Override
public void onCreate(Bundle savedInstanceState) {
...
listView = this.getListView();
detector = new GestureDetector(this, new FlingGestureListener(listView));
...
}
FlingGestureListener
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
int pos = source.pointToPosition(Math.round(e1.getX()), Math.round(e1.getY()));
View v = source.getChildAt(pos - source.getFirstVisiblePosition());
System.out.println("fling: x=" + velocityX + " y=" + velocityY);
try {
IFlingable flingable = (IFlingable) v;
if(velocityY > -200 && velocityY < 200) {
if(velocityX < 0)
flingable.fling(IFlingable.RIGHT_TO_LEFT);
else if(velocityX > 0)
flingable.fling(IFlingable.LEFT_TO_RIGHT);
}
} catch(Exception e) {}
return false;
}
View with ViewFlipper which implements IFlingable
public void fling(int direction) {
System.out.println("flip: " + direction);
switch(direction) {
case IFlingable.LEFT_TO_RIGHT:
System.out.println("piep");
GUIHelper.setAnimationSlideLeftToRight(context, switcher);
switcher.showNext();
break;
case IFlingable.RIGHT_TO_LEFT:
System.out.println("pup");
GUIHelper.setAnimationSlideRightToLeft(context, switcher);
switcher.showPrevious();
break;
}
}
Layout
<ViewFlipper android:id="@+id/viewSwitcher"
android:layout_height="wrap_content"
android:layout_width="match_parent" android:layout_weight="1"
android:inAnimation="@anim/slide_in_left"
android:outAnimation="@anim/slide_out_right">
<LinearLayout android:layout_height="wrap_content"
android:layout_width="match_parent" android:orientation="vertical">
...
</LinearLayout>
...
</ViewFlipper>
Log
fling: x=2542.3613 y=95.877945
flip: 0
piep
I get the right log messages so the showNext() on the ViewFlipper gets executed but it does not change its view on the gui. Am I missing something? I have another layout with a ViewSwitcher instead of the Flipper and that one works.
EDIT:
Here are the missing classes:
public class GUIHelper {
...
public static void setAnimationSlideLeftToRight(Context context, ViewAnimator switcher) {
Animation in = AnimationUtils.loadAnimation(context, R.anim.slide_in_left);
Animation out = AnimationUtils.loadAnimation(context, R.anim.slide_out_right);
switcher.setInAnimation(in);
switcher.setOutAnimation(out);
}
public static void setAnimationSlideRightToLeft(Context context, ViewAnimator switcher) {
Animation in = AnimationUtils.loadAnimation(context, R.anim.slide_in_right);
Animation out = AnimationUtils.loadAnimation(context, R.anim.slide_out_left);
switcher.setInAnimation(in);
switcher.setOutAnimation(out);
}
...
}
public interface IFlingable {
public static final int LEFT_TO_RIGHT = 0;
public static final int RIGHT_TO_LEFT = 1;
public void fling(int direction, boolean fling);
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
你好,这是 listView 上正在运行的滑动代码,就像你的 xml 一样,我在 ViewFlipper 中放置了一个带有父 LinearLayout 的 ListView
包括所使用的布局(main_layout)......
Hello this is the running swipe code on listView just as your xml I have placed a ListView with parent LinearLayout in ViewFlipper
Included the layout(main_layout) that is used.....
这是我使用的xml代码。
覆盖dispatchTouchEvent而不是onTouchEvent
这工作正常:)滚动视图和翻转器都工作正常。
This is my xml code used.
Override dispatchTouchEvent instead of onTouchEvent
This works fine :) Scroll View and flipper both works fine.