`
ctfzh
  • 浏览: 31867 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

android手势识别ViewFlipper触摸动画

阅读更多

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

 

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>
		<include android:id="@+id/secondlayout" layout="@layout/second"></include>
		<include android:id="@+id/thirdlayout" layout="@layout/third"></include>
		<include android:id="@+id/fourthlayout" layout="@layout/fourth"></include>
         </viewflipper>
</linearlayout>

 

ViewFlipper

<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需要实现两个接口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);
	}
}
 

 

 

分享到:
评论

相关推荐

    android中使用ViewFlipper实现滑动翻页示例

    在Android开发中,ViewFlipper是一个...通过结合手势识别和动画,我们可以创建出流畅、互动性强的用户体验。在实际项目中,你可以根据需求扩展这个示例,比如添加无限轮播、自动切换等功能,以满足更复杂的应用场景。

    Android源码-使用ViewFlipper+GestureDetector实现划动翻页

    在Android开发中,实现用户友好的交互体验是至关重要的,其中划动翻页是一种常见的功能,常见于电子书、幻灯片展示等...通过对这些代码的学习和理解,开发者可以进一步提升自己在Android手势识别和视图切换方面的技能。

    android 手势识别

    总结来说,Android手势识别结合`ViewFlipper`可以实现动态的触摸交互,使用户能够通过简单的手势在多个视图间切换。这种技术广泛应用于新闻阅读应用、幻灯片展示等场景,极大地提高了应用的可操作性和用户满意度。...

    Android ActivtiyGroup和ViewFlipper实现Activity滑屏切换

    `GestureDetector`是一个监听触摸事件的工具类,它可以识别各种手势,如滑动、点击等。首先,你需要创建一个`GestureDetector`的实例,并实现`OnGestureListener`接口。在`onTouchEvent()`方法中,传递触摸事件给`...

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

    至此,我们就完成了使用ViewFlipper和手势识别在Android中切换视图的基本实现。通过这种方式,用户可以通过简单的手势操作来浏览多个视图,提升了应用的交互性和用户体验。当然,实际项目中可能需要对滑动边界、手势...

    Android手势滑动图片浏览

    本教程将详细介绍如何利用`ViewFlipper`组件结合手势识别来创建一个平滑的手势滑动图片浏览功能。 `ViewFlipper`是Android SDK提供的一种布局容器,它可以轻松地在多个子视图之间进行切换,通常用于实现动画效果,...

    android 手势 滑动翻页

    在Android中,手势识别主要依赖于`MotionEvent`类,它包含了用户触摸屏幕时的各种动作信息,如ACTION_DOWN(按下)、ACTION_UP(抬起)、ACTION_MOVE(移动)等。开发者可以通过重写`onTouchEvent()`方法来捕获这些...

    【Android】滑动屏幕效果GestureDetector、OnGestureListener、ViewFlipper

    在Android开发中,实现...在实际项目中,可能还需要考虑手势识别的灵敏度、滑动阈值等因素,以提供更优质的用户体验。同时,可以结合使用 `Scroller` 或 `Animator` 类来实现更复杂的动画效果,提升应用的视觉吸引力。

    ViewFlipper和Gesture的使用(1)

    在“ViewFlipper和Gesture的使用(一)”的例子中,我们将探讨如何结合`ViewFlipper` 和手势识别来实现更丰富的用户交互。 `ViewFlipper` 内部可以包含多个子视图,比如`ImageView`、`TextView` 或者自定义的布局。...

    图片手势切换

    总的来说,“图片手势切换”功能涉及到Android手势识别、视图切换以及动画应用等多方面的知识。通过结合`GestureDetector`、`ViewFlipper`以及自定义动画,我们可以创建出一款既美观又易用的图片浏览应用。在实际...

    安卓动画效果相关-GiftCard-Android好看的卡片动画效果.rar

    在实际应用中,卡片动画可能需要与触摸事件和手势检测相结合。例如,通过监听`MotionEvent`,开发者可以判断用户的滑动动作,触发卡片翻转。`GestureDetector`和`ScaleGestureDetector`等工具可以帮助识别和处理这些...

    UI开发第八篇——ViewFlipper 左右滑动效果

    在Android UI开发中,实现界面元素的动态交互是提升用户体验的关键之一。本篇将深入探讨如何利用ViewFlipper组件和GestureDetector...通过不断优化手势识别和动画效果,开发者可以进一步提升应用的交互性和用户满意度。

    Android滑动手势侦测方法介绍

    开发者可以通过继承这个类并重写其中的方法来实现特定的手势识别功能。下面是一个简单的示例: ```java class MyGestureDetector extends SimpleOnGestureListener { private static final int SWIPE_MIN_DISTANCE...

    ViewFlipper+GestureDetector多页面切换

    在Android开发中,ViewFlipper和GestureDetector是两个非常重要的组件,它们可以帮助开发者实现丰富的用户交互...在实际项目中,你可以根据需求进行扩展,比如增加手势识别的种类,或者结合ViewPager实现更复杂的效果。

    Android使用ViewFlipper和GestrueDetector共同实现滑屏效果实例

    ViewFlipper是Android提供的一个可以切换显示多个视图的容器,而GestrueDetector则用于处理触摸事件,识别用户的特定手势。 首先,我们来看`main.xml`布局文件。在这个布局中,我们创建了一个LinearLayout作为根...

    Android中ViewFlipper的使用及设置动画效果实例详解

    这个实例不仅展示了ViewFlipper的基本用法,还涉及到手势识别和视图动画的综合运用,是Android开发中一个典型的交互设计案例。通过熟练掌握这些技术,开发者可以构建更加动态和用户体验丰富的应用程序。

    viewflipper的使用

    总结来说,ViewFlipper是Android中实现多视图切换的利器,配合手势识别,可以轻松地创建出具有滑动效果的图片轮播或其他动画效果。通过灵活运用不同的Animation,我们可以实现更加丰富多彩的用户界面。记得在实际...

    Android应用源码之android-flip 类似Flipboard翻转动画的实现.zip

    在Android开发中,动画是提升用户体验的...通过学习和分析这个源码项目,开发者不仅可以掌握翻转动画的实现原理,还能提升对Android动画系统和触摸事件处理的理解,从而在自己的应用中创造出更加生动、互动的用户体验。

    代码,滑动手势切换屏幕

    另外,使用`ViewFlipper`或`ViewAnimator`也可以帮助实现平滑的屏幕切换动画。 5. **性能优化**: 提到的`.proguard.cfg`文件是ProGuard配置文件,用于混淆、优化和压缩Java字节码,提升应用运行效率并减小APK体积...

    Android手势操作

    `ViewFlipper`是Android SDK提供的一种布局容器,它允许我们在多个子视图之间进行动画切换。在我们的场景中,我们可以将它用作一个图片轮播器,通过手势左右滑动来切换不同的图片。要实现这个功能,你需要在布局XML...

Global site tag (gtag.js) - Google Analytics