Android手势识别ViewFlipper触摸动画

本文介绍如何在Android应用中实现主页面的左右拖动效果,通过使用ViewFlipper和GestureDetector联动,结合动画效果,实现流畅的页面切换体验。布局中包含多个包含图片的View,通过手势识别实现快速滑动显示不同图片。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天给大家介绍一下如何实现Android主页面的左右拖动效果。实现起来很简单,就是使用ViewFlipper来将您要来回拖动的View装在一起,然后与GestureDetector手势识别类来联动,确定要显示哪个View,加上一点点动画效果即可。比如当手指向左快速滑动时跳转到上一个View,手指向右快速滑动时跳转到下一个View,本例中使用图片作为各个View的页面,实现左右快速滑动显示不同的图片。

首先来看看我们的layout,如下所示:

<linearlayout
androidandroid:layout_height="fill_parent"android:layout_width="fill_parent"
androidrientation="vertical"xmlns:android="http://schemas.android.com/apk/res/android">


<viewflipper
androidandroid:id="@+id/flipper"android:layout_below="@+id/CockpitLayout"android:layout_height="fill_parent"
android:layout_width="fill_parent">


<include
android:id="@+id/firstlayout"
layout="@layout/first">


<include
android:id="@+id/secondlayout"
layout="@layout/second">


<include
android:id="@+id/thirdlayout"
layout="@layout/third">


<include
android:id="@+id/fourthlayout"
layout="@layout/fourth">


</include></include></include></include></viewflipper>

</linearlayout>

 

如上所示,在ViewFlipper中放置多个layout(接下来会在不同的layout中来回滑动),ViewFlipper在同一个页面就显示其中一个layout。

ViewFlipper中的四个layout很简单,我们就放置一张图片,如下所示:

<linearlayout
androidandroid:gravity="center_vertical"android:layout_height="fill_parent"
android:layout_width="fill_parent"xmlns:android="http://schemas.android.com/apk/res/android">


<imageview
androidandroid:layout_height="wrap_content"android:layout_width="wrap_content"
android:src="@drawable/v1">

</imageview></linearlayout>

 

接下来我们来看看Activity,我们的Activity需要实现两个接口OnGestureListener,OnTouchListener。具体的代码如下所示,代码中都有相应的注释,这里就不再详述。

package com.ideasandroid.demo;  
import android.app.Activity;  
import android.os.Bundle;  
import android.view.GestureDetector;  
import android.view.MotionEvent;  
import android.view.View;  
import android.view.GestureDetector.OnGestureListener;  
import android.view.View.OnTouchListener;  
import android.view.animation.AccelerateInterpolator;  
import android.view.animation.Animation;  
import android.view.animation.TranslateAnimation;  
import android.widget.ViewFlipper;  
public class ViewFlipperDemo extends Activity implementsOnGestureListener,OnTouchListener{  
    private ViewFlipper mFlipper;  
    GestureDetector mGestureDetector;  
    private int mCurrentLayoutState;  
    private static final int FLING_MIN_DISTANCE = 100;  
    private static final int FLING_MIN_VELOCITY = 200;  


    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  

mFlipper = (ViewFlipper) findViewById(R.id.flipper);  
        //注册一个用于手势识别的类  

mGestureDetector = new GestureDetector(this);  
        //给mFlipper设置一个listener  
        mFlipper.setOnTouchListener(this);  

mCurrentLayoutState = 0;  
        //允许长按住ViewFlipper,这样才能识别拖动等手势  
        mFlipper.setLongClickable(true);  
    }  


    /**  
     * 此方法在本例中未用到,可以指定跳转到某个页面  
     * @param switchTo  
     */  
    public void switchLayoutStateTo(int switchTo) {  
        while (mCurrentLayoutState != switchTo) {  
            if (mCurrentLayoutState > switchTo) {  
                mCurrentLayoutState--;  
                mFlipper.setInAnimation(inFromLeftAnimation());  
                mFlipper.setOutAnimation(outToRightAnimation());  
                mFlipper.showPrevious();  
            } else {  
                mCurrentLayoutState++;  
                mFlipper.setInAnimation(inFromRightAnimation());  
                mFlipper.setOutAnimation(outToLeftAnimation());  
                mFlipper.showNext();  
            }  


        }  
        ;  
    }  


    /**  
     * 定义从右侧进入的动画效果  
     * @return  
     */  
    protected Animation inFromRightAnimation() {  
        Animation inFromRight = new TranslateAnimation(  
                Animation.RELATIVE_TO_PARENT, +1.0f,  
                Animation.RELATIVE_TO_PARENT, 0.0f,  
                Animation.RELATIVE_TO_PARENT, 0.0f,  
                Animation.RELATIVE_TO_PARENT, 0.0f);  
        inFromRight.setDuration(500);  
        inFromRight.setInterpolator(new AccelerateInterpolator());  
        return inFromRight;  
    }  


    /**  
     * 定义从左侧退出的动画效果  
     * @return  
     */  
    protected Animation outToLeftAnimation() {  
        Animation outtoLeft = new TranslateAnimation(  
                Animation.RELATIVE_TO_PARENT, 0.0f,  
                Animation.RELATIVE_TO_PARENT, -1.0f,  
                Animation.RELATIVE_TO_PARENT, 0.0f,  
                Animation.RELATIVE_TO_PARENT, 0.0f);  
        outtoLeft.setDuration(500);  
        outtoLeft.setInterpolator(new AccelerateInterpolator());  
        return outtoLeft;  
    }  


    /**  
     * 定义从左侧进入的动画效果  
     * @return  
     */  
    protected Animation inFromLeftAnimation() {  
        Animation inFromLeft = new TranslateAnimation(  
                Animation.RELATIVE_TO_PARENT, -1.0f,  
                Animation.RELATIVE_TO_PARENT, 0.0f,  
                Animation.RELATIVE_TO_PARENT, 0.0f,  
                Animation.RELATIVE_TO_PARENT, 0.0f);  
        inFromLeft.setDuration(500);  
        inFromLeft.setInterpolator(new AccelerateInterpolator());  
        return inFromLeft;  
    }  


    /**  
     * 定义从右侧退出时的动画效果  
     * @return  
     */  
    protected Animation outToRightAnimation() {  
        Animation outtoRight = new TranslateAnimation(  
                Animation.RELATIVE_TO_PARENT, 0.0f,  
                Animation.RELATIVE_TO_PARENT, +1.0f,  
                Animation.RELATIVE_TO_PARENT, 0.0f,  
                Animation.RELATIVE_TO_PARENT, 0.0f);  
        outtoRight.setDuration(500);  
        outtoRight.setInterpolator(new AccelerateInterpolator());  
        return outtoRight;  
    }  


    public boolean onDown(MotionEvent e) {  
        // TODO Auto-generated method stub  
        return false;  
    }  


    /*  
     * 用户按下触摸屏、快速移动后松开即触发这个事件  
     * e1:第1个ACTION_DOWN MotionEvent  
     * e2:最后一个ACTION_MOVE MotionEvent  
     * velocityX:X轴上的移动速度,像素/秒  
     * velocityY:Y轴上的移动速度,像素/秒  
     * 触发条件 :  
     * X轴的坐标位移大于FLING_MIN_DISTANCE,且移动速度大于FLING_MIN_VELOCITY个像素/秒  
     */  
    public boolean onFling(MotionEvent e1, MotionEvent e2, floatvelocityX,  
            float velocityY) {  
        if (e1.getX() - e2.getX() > FLING_MIN_DISTANCE  
                && Math.abs(velocityX) > FLING_MIN_VELOCITY) {  
            // 当像左侧滑动的时候  
            //设置View进入屏幕时候使用的动画  
            mFlipper.setInAnimation(inFromRightAnimation());  
            //设置View退出屏幕时候使用的动画  
            mFlipper.setOutAnimation(outToLeftAnimation());  
            mFlipper.showNext();  
        } else if (e2.getX() - e1.getX() > FLING_MIN_DISTANCE  
                && Math.abs(velocityX) > FLING_MIN_VELOCITY) {  
            // 当像右侧滑动的时候  
            mFlipper.setInAnimation(inFromLeftAnimation());  
            mFlipper.setOutAnimation(outToRightAnimation());  
            mFlipper.showPrevious();  
        }  
        return false;  
    }  


    public void onLongPress(MotionEvent e) {  
        // TODO Auto-generated method stub  


    }  


    public boolean onScroll(MotionEvent e1, MotionEvent e2, floatdistanceX,  
            float distanceY) {  
        return false;  
    }  


    public void onShowPress(MotionEvent e) {  
        // TODO Auto-generated method stub  


    }  


    public boolean onSingleTapUp(MotionEvent e) {  
        // TODO Auto-generated method stub  
        return false;  
    }  
    public boolean onTouch(View v, MotionEvent event) {  
        // 一定要将触屏事件交给手势识别类去处理(自己处理会很麻烦的)  
        return mGestureDetector.onTouchEvent(event);  
    }  
}  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值