Android中使用ViewFlipper进行手势切换实例

前端技术 2023/09/03 Android

本文实例讲述了Android中使用ViewFlipper进行手势切换的方法,分享给大家供大家参考。具体实现步骤如下:

首先在layout的xml文件中定义一个ViewFlipper:

复制代码 代码如下:
<?xml version=\"1.0\" encoding=\"utf-8\"?> 
<ViewFlipper xmlns:android=\"http://schemas.android.com/apk/res/android\" 
        android:id=\"@+id/viewFlipper\" 
        android:layout_width=\"fill_parent\"  
        android:layout_height=\"fill_parent\" 
        > 
         
    <LinearLayout 
        android:layout_width=\"fill_parent\" 
        android:layout_height=\"fill_parent\" 
        > 
         
        <TextView 
            android:layout_width=\"fill_parent\" 
            android:layout_height=\"fill_parent\" 
            android:background=\"#FF0000\" 
            /> 
             
    </LinearLayout> 
     
    <LinearLayout 
        android:layout_width=\"fill_parent\" 
        android:layout_height=\"fill_parent\" 
        > 
         
        <TextView 
            android:layout_width=\"fill_parent\" 
            android:layout_height=\"fill_parent\" 
            android:background=\"#00FF00\" 
            /> 
             
    </LinearLayout> 
     
</ViewFlipper>

声明一个新的GestureDetector,重写它的onFling()函数,在这个函数里面判断手势,这里为横向的拖动:

复制代码 代码如下:
public class MyGestureDetector extends SimpleOnGestureListener 

    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; 
     
    @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; 
               } 
               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) 
        { 
             
           } 
           return false; 
    } 
}

注意在Activity中重写onTouchEvent()函数:

复制代码 代码如下:
private ViewFlipper viewFlipper; 
 
private Animation slideLeftIn; 
private Animation slideLeftOut; 
private Animation slideRightIn; 
private Animation slideRightOut; 
 
private GestureDetector gestureDetector; 
@Override 
public void onCreate(Bundle savedInstanceState) 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
     
    viewFlipper = (ViewFlipper)findViewById(R.id.viewFlipper); 
       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()); 
        
       new View.OnTouchListener() 
       { 
           public boolean onTouch(View v, MotionEvent event) 
           { 
               if (gestureDetector.onTouchEvent(event)) 
               { 
                   return true; 
               } 
               return false; 
           } 
       }; 

 
@Override 
public boolean onTouchEvent(MotionEvent event) 

    if (gestureDetector.onTouchEvent(event)) 
    { 
        return true; 
    } 
    else 
    { 
        return false; 
    } 
}

最后,在res文件夹下新建一个anim文件夹,用来存放view之间切换的动画文件:

1.slide_left_in.xml

复制代码 代码如下:
<?xml version=\"1.0\" encoding=\"utf-8\"?> 
<set xmlns:android=\"http://schemas.android.com/apk/res/android\"> 
    <translate 
        android:fromXDelta=\"100%p\"  
        android:toXDelta=\"0\"  
        android:duration=\"500\" 
        /> 
    <alpha 
        android:fromAlpha=\"0.0\"  
        android:toAlpha=\"1.0\" 
        android:duration=\"500\" 
        /> 
</set>

2.slide_left_out.xml

复制代码 代码如下:
<?xml version=\"1.0\" encoding=\"utf-8\"?> 
<set xmlns:android=\"http://schemas.android.com/apk/res/android\"> 
    <translate 
        android:fromXDelta=\"0\"  
        android:toXDelta=\"-100%p\"  
        android:duration=\"500\" 
        /> 
    <alpha 
        android:fromAlpha=\"1.0\"  
        android:toAlpha=\"0.0\"  
        android:duration=\"500\" 
        /> 
</set>

3.slide_right_in.xml

复制代码 代码如下:
<?xml version=\"1.0\" encoding=\"utf-8\"?> 
<set xmlns:android=\"http://schemas.android.com/apk/res/android\"> 
    <translate  
        android:fromXDelta=\"-100%p\"  
        android:toXDelta=\"0\"  
        android:duration=\"500\" 
        /> 
    <alpha 
        android:fromAlpha=\"0.0\"  
        android:toAlpha=\"1.0\" 
        android:duration=\"500\" 
        /> 
</set>

4.slide_right_out.xml

复制代码 代码如下:
<?xml version=\"1.0\" encoding=\"utf-8\"?> 
<set xmlns:android=\"http://schemas.android.com/apk/res/android\"> 
    <translate  
        android:fromXDelta=\"0\"  
        android:toXDelta=\"100%p\"  
        android:duration=\"500\" 
        /> 
    <alpha 
        android:fromAlpha=\"1.0\"  
        android:toAlpha=\"0.0\" 
        android:duration=\"500\" 
        /> 
</set>

希望本文所述对大家的Android程序设计有所帮助

本文地址:https://www.stayed.cn/item/6752

转载请注明出处。

本站部分内容来源于网络,如侵犯到您的权益,请 联系我

我的博客

人生若只如初见,何事秋风悲画扇。