2011-04-06 73 views
6

我有一个ViewFlipper,它应该对一个手势作出反应,但事实并非如此。Android ViewFlipper没有翻转

活动

@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; 
} 

查看与ViewFlipper它实现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 

我得到正确的日志信息等等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); 

} 
+0

我发现了这个错误。我没有在课堂上的某个时刻保存上下文。上面的代码工作完美。 – dbrettschneider 2011-04-06 11:19:45

+0

从哪里得到“IFlingable”?无法在Android API中看到它。另外,“源”是什么类型的对象?还有,“GUIHelper”来自的idk。你在背景中做了一些事情,使这个例子有点难以遵循。 – moonlightcheese 2011-05-04 23:38:10

+0

我自己做了。我编辑了帖子,并把它们放进去。 – dbrettschneider 2011-05-05 06:20:48

回答

7

你好,这是在ListView中运行刷卡代码只是作为你的XML我在ViewFlipper

import android.app.Activity; 
import android.os.Bundle; 

import android.view.GestureDetector; 

import android.view.GestureDetector.SimpleOnGestureListener; 

import android.view.MotionEvent; 

import android.view.View; 
import android.view.animation.Animation; 
import android.view.animation.AnimationUtils; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 
import android.widget.Toast; 
import android.widget.ViewFlipper; 

import android.widget.AdapterView.OnItemClickListener; 


public class MainActivity extends Activity { 

    private static final int SWIPE_MIN_DISTANCE = 120; 
    private static final int SWIPE_MAX_OFF_PATH = 250; 
    private static final int SWIPE_THRESHOLD_VELOCITY = 200; 
    private GestureDetector gestureDetector; 
    View.OnTouchListener gestureListener; 
    private Animation slideLeftIn; 
    private Animation slideLeftOut; 
    private Animation slideRightIn; 
    private Animation slideRightOut; 
    private ViewFlipper viewFlipper; 
    private ListView lv; 
    private String[] city = { "Indore", "Bhopal", "Khargone", "Ujjain", 
     "Nasik", "Pune", "Delhi", "Mumbai", "Noida", "Hyderabad", 
     "Banglore", "Ajmer", "Goa", "Jaipur", "Nagpur", "" }; 
    private String[] country = { "India", "Bhutan", "Kuwait", "USA", }; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main_layout); 
     lv = (ListView) findViewById(R.id.List01); 
     ListView lv2 = (ListView) findViewById(R.id.List02); 

     viewFlipper = (ViewFlipper) findViewById(R.id.flipper); 
     slideLeftIn = AnimationUtils.loadAnimation(this, R.anim.slide_left_in); 
     slideLeftOut = AnimationUtils 
       .loadAnimation(this, R.anim.slide_left_out); 
     slideRightIn = AnimationUtils 
       .loadAnimation(this, R.anim.slide_right_in); 
     slideRightOut = AnimationUtils.loadAnimation(this, 
       R.anim.slide_right_out); 

     gestureDetector = new GestureDetector(new MyGestureDetector()); 
     gestureListener = new View.OnTouchListener() { 
      public boolean onTouch(View v, MotionEvent event) { 
       if (gestureDetector.onTouchEvent(event)) { 
        return true; 
       } 
       return false; 
      } 
     }; 
     lv.setAdapter(new ArrayAdapter<String>(this, 
       android.R.layout.simple_list_item_1, city)); 
     lv2.setAdapter(new ArrayAdapter<String>(this, 
       android.R.layout.simple_list_item_1, country)); 
     lv.setOnItemClickListener(new OnItemClickListener() { 
      public void onItemClick(AdapterView arg0, View view, int position, 
        long id) { 
       // user clicked a list item, make it "selected" 
       Toast.makeText(getBaseContext(), "Item Clicked", 
         Toast.LENGTH_SHORT).show(); 
       // selectedAdapter.setSelectedPosition(position); 
      } 
     }); 
     lv2.setOnItemClickListener(new OnItemClickListener() { 
      public void onItemClick(AdapterView arg0, View view, int position, 
        long id) { 
       // user clicked a list item, make it "selected" 
       Toast.makeText(getBaseContext(), "Item List2 Clicked", 
         Toast.LENGTH_SHORT).show(); 
       // selectedAdapter.setSelectedPosition(position); 
      } 
     }); 
    } 

    class MyGestureDetector extends SimpleOnGestureListener { 
     @Override 
     public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, 
       float velocityY) { 
      try { 
       if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) 
        return false; 
       // right to left swipe 
       if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE 
         && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
        viewFlipper.setInAnimation(slideLeftIn); 
        viewFlipper.setOutAnimation(slideLeftOut); 
        viewFlipper.showNext(); 
       } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE 
         && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
        viewFlipper.setInAnimation(slideRightIn); 
        viewFlipper.setOutAnimation(slideRightOut); 
        viewFlipper.showPrevious(); 
       } 
      } catch (Exception e) { 
       // nothing 
      } 
      return false; 
     } 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     if (gestureDetector.onTouchEvent(event)) 
      return true; 
     else 
      return false; 
    } 
} 
放置一个ListView与父母的LinearLayout

包含使用的布局(main_layout).....

<?xml version="1.0" encoding="UTF-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/linearLayout1" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 

    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" > 

     <Button 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Do not Click Just swipe on remaining area" /> 
    </LinearLayout> 

    <ViewFlipper 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/flipper" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" > 

     <LinearLayout 
      android:id="@+id/ViewFlipper01" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:orientation="vertical" > 

      <ListView 
       android:id="@+id/List01" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" > 
      </ListView> 
     </LinearLayout> 
+0

我已经使用列表视图实现了我的ViewFlipper的代码,但手势对我来说不起作用:( – 2012-01-19 10:32:15

+0

在您制作的代码中无法识别投掷和触摸手势... – 2012-01-19 10:46:45

+0

如果我把一些视图,而不是ListView,它工作正常。但是,当放置一个ListView或ScrollView,ViewFlipper不翻转。 – 2012-01-19 10:50:57

0

这是我使用的xml代码。

<ViewFlipper 
    android:id="@+id/vf" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 
    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical" 
     > 

    <ListView 
     android:id="@+id/list1" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     ></ListView> 
    </LinearLayout> 
    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical" 
     > 
    <ListView 
     android:id="@+id/list2" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     ></ListView> 
    </LinearLayout> 
</ViewFlipper> 

覆盖dispatchTouchEvent代替的onTouchEvent

@Override 
    public boolean dispatchTouchEvent(MotionEvent event) { 
     super.dispatchTouchEvent(event); 
     return gestureDetector.onTouchEvent(event); 
    } 

这工作得很好:)滚动查看和鳍都工作正常。

+0

布局似乎是f9 ..您能分享您的完整代码并解释您的确切要求 – 2012-01-19 11:49:32

+0

@Arpit Garg代码与您对dbrettschneider的回答相同。 – 2012-01-19 11:56:01

+0

我编辑了布局..现在尝试使用它 – 2012-01-19 12:12:56