Android ViewFlipper触摸动画

 今天给大家介绍一下如何实现androd主页面的左右拖动效果。实现起来很简单,就是使用ViewFlipper来将您要来回拖动的View装在一起,然后与GestureDetector手势识别类来联动,确定要显示哪个View,加上一点点动画效果即可。比如当手指向左快速滑动时跳转到上一个View,手指向右快速滑动时跳转到下一个View,本例中使用图片作为各个View的页面,实现左右快速滑动显示不同的图片。
  
  首先来看看我们的layout,如下所示:
  
  <linearlayout android:layout_height="fill_parent" android:layout_width="fill_parent" android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android">
        <viewflipper android: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 android:gravity="center_vertical" android:layout_height="fill_parent" android:layout_width="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android">
  <imageview android: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 implements OnGestureListener,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, float velocityX,
                        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, float distanceX,
                        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);
        }
}

时间: 2024-10-30 16:54:06

Android ViewFlipper触摸动画的相关文章

android开发ViewFlipper触摸动画

背景介绍: 在做Android项目开发之前你需要做三件事情:第一.下载Android SDK(你可 以在这里下载),第二.准备项目编辑器(我建议使用eclipse )第三.下载 Android的Eclipse插件. 当你准备好你的环境之后,可以开始学习本教程. 当你第一次打开Android SDK,您需要创建一个虚拟设备,我打开建议创建一 个普遍的设备为目标的Android 1.6 API Level 4使用,然后你需要添加硬件功 能,例如:SD卡支持,Accellerometer,相机支持等等

Android ViewFlipper简单用法解析_Android

ViewFlipper和ViewPager挺像的,都是一个view容器.内部可以添加多个view,只是viewpager可以通过左右滑动来切换view,而viewFlipper则没有这个功能,所以需要在它上面监听手势.比较方便的是它不用使用适配器就能添加view,所以比较方便.   首先在布局文件中定义这个控件:  <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=

[译] 如何创建 BubblePicker – Android 多彩菜单动画

本文讲的是[译] 如何创建 BubblePicker – Android 多彩菜单动画, 原文地址:How We Created BubblePicker – a Colorful Menu Animation for Android 原文作者:Irina Galata, Yuliya Serbenenko 译文出自:掘金翻译计划 译者:hackerkevin 校对者:luoqiuyu phxnirvana 如何创建 BubblePicker – Android 多彩菜单动画 我们已经习惯了移动

Android开发之动画实现方法

  本文实例讲述了Android开发之动画实现方法.分享给大家供大家参考.具体分析如下: 动画分为三种: 逐帧动画.布局动画和控件动画 控件动画实现 通过重写Animation的 applyTransformation (float interpolatedTime, Transformation t)函数来实现自定义动画效果,另外一般也会实现 initialize (int width, int height, int parentWidth, int parentHeight)函数,这是一个

android中的动画可以改变一个view的高和宽吗?

问题描述 android中的动画可以改变一个view的高和宽吗? 简单点说把,就是在android中通过动画可以改变这个对象的高度和宽度吗?举个例子,现在有一个图片,是imageview,我可不可以给他做一个动画让他高度变大?这个变大是指他实际占用的位置,比如这个imagview我在xml里配置的是200dip,通过动画我可以让他再动画结束后的高度变成500dip吗? 解决方案 类似效果,你的动画改变view布局参数,应该对imageView应用新的布局参数. 创建应用新布局参数(lp)的自定义

图片-android一个简单动画的制作问题

问题描述 android一个简单动画的制作问题 我有一个Button,本来是这个样子,我想当按下的时候这三个样子轮流变化: 当再按下的时候变回原来的,也就是第一张的样子 怎么实现? 解决方案 制作一个简单的动画 解决方案二: j亲爱的发噶盛大而搁浅

android 巧用动画使您app风骚起来

巧用Android的自定义动画,使你更加的有动感,是大多数Android开发人员的目标,那怎么做到这点.请听下文分解: 3.0以前,android支持两种动画模式,tween animation(幅间动画),frame animation(帧动画),在android3.0中又引入了一个新的动画系统:property animation(值动画),这三种动画模式在SDK中被称为property animation,view animation,drawable animation. 可通过Nine

动画效果-android 一个旋转动画的效果,未完全展示

问题描述 android 一个旋转动画的效果,未完全展示 ndroid,我对一个按钮button做点击事件,点击button后将一张图片旋转90度,但是频繁点击的过程中,总会有几次图片没有旋转到90度,或者压根就没有旋转. 我在旋转动画的监听onAnimationEnd()方法里面,输出了debug,代码确实执行到这里了,为什么执行动画后,页面效果看不见. 请有经验和知道状况的朋友,指导下,谢谢 解决方案 最好用属性动画做,如果是需要完整执行每个点击响应就每次都起个线程post到ui进程来做动画

android fragment 退栈动画怎么设置

问题描述 android fragment 退栈动画怎么设置 我用的是add进行跳转的,为了防止重复加载问题. transaction.setCustomAnimations(R.anim.push_left_in,R.anim.push_left_out,R.anim.push_right_in,R.anim.push_right_out); 我是这样设置add跳转的动画,是可以的,但是我通过getFragmentManager().popBackStack();的时候却没有动画,不知道是怎么