Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 443|回复: 0

开发交流:Android ViewFlipper触摸动画

[复制链接]

该用户从未签到

发表于 2011-10-24 09:39:41 | 显示全部楼层 |阅读模式
    如何实现androd主页面的左右拖动效果。实现起来很简单,就是使用ViewFlipper来将您要来回拖动的View装在一起,然后与GestureDetector手势识别类来联动,确定要显示哪个View,加上一点点动画效果即可。比如当手指向左快速滑动时跳转到上一个View,手指向右快速滑动时跳转到下一个View,本例中使用图片作为各个View的页面,实现左右快速滑动显示不同的图片。

       如上所示,在ViewFlipper中放置多个layout(接下来会在不同的layout中来回滑动),ViewFlipper在同一个页面就显示其中一个layout。ViewFlipper中的四个layout很简单,我们就放置一张图片,如下所示:

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

java代码: package eoe.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);

}

}
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2025-1-10 22:45 , Processed in 0.293911 second(s), 38 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表