android手势识别ViewFlipper触摸动画

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

转自 http://www.ideasandroid.com/archives/414

标签:Android
手势

[1].[代码] layout 跳至
[1]
[2]
[3]

?


1

2

3

4

5

6

7

8

<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>

[2].[代码] ViewFlipper 跳至
[1]
[2]
[3]

?


1

2

3

<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>

[3].[代码] 我们的Activity需要实现两个接口OnGestureListener,OnTouchListener。
跳至 [1] [2] [3]

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

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-18 03:31:53

android手势识别ViewFlipper触摸动画的相关文章

札记:android手势识别,MotionEvent

札记:android手势识别,MotionEvent 摘要 本文是手势识别输入事件处理的完整学习记录.内容包括输入事件InputEvent响应方式,触摸事件MotionEvent的概念和使用,触摸事件的动作分类.多点触摸.根据案例和API分析了触摸手势Touch Gesture的识别处理的一般过程.介绍了相关的GestureDetector,Scroller和VelocityTracker.最后分析drag和scale等一些手势的识别. 输入源分类 虽然android本身是一个完整的系统,它主要

Android 通过ViewFlipper实现广告轮播功能并可以通过手势滑动进行广告切换

为了实现广告轮播功能,在网上找了很多方法,有的效果很好,但是代码太麻烦,并且大多是用的viewpager,总之不是很满意. 于是看了一下sdk有个控件是ViewFlipper,使用比较方便,于是尝试了一下,最终实现了所需效果.在这里与大家分享. 首先看一下效果(主要是布局方面的效果,毕竟手势识别和滑动不太好显示,懒得弄成gif了): 1.布局文件.xml <LinearLayout android:layout_width="fill_parent" android:layout

Android手势识别的发展

在播放器.与手势识别.所以,看看今天的我们Android手势识别. 首先,我们需要站在巨人的肩膀上.有些人举了个例子和说明. 第一章: http://www.2cto.com/kf/201110/109480.html 对于触摸屏.其原生的消息无非按下.抬起.移动这几种,我们仅仅须要简单重载onTouch或者设置触摸侦听器setOnTouchListener就可以进行处理.只是.为了提高我们的APP的用户体验,有时候我们须要识别用户的手势,Android给我们提供的手势识别工具GestureDe

android 使用viewflipper实现左右滑动的效果

public class MainActivity extends Activity implements OnGestureListener { private static final String TAG = "MainActivity"; private ViewFlipper viewFlipper; private GestureDetector detector; //手势检测 Animation leftInAnimation; Animation leftOutAni

Android 中 ViewFlipper 的简单实例

main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:co

Android 5.0自定义动画

材料设计中的动画对用户的操作给予了反馈,并且在与应用交互时提供了持续的可见性.材料主题提供了一些按钮动画和活动过渡,Android 5.0允许你自定义动画并且可以创建新的动画: Touch Feedback Circular Reveal Activity Transitions Curved Motion View State Changes 自定义触摸反馈 在用户与UI元素交互时,从接触的角度来看,材料设计中的触摸反馈提供了瞬间的视觉确认.按钮的默认触摸动画使用了新的RippleDrawab

Android编程之Fragment动画加载方法源码详解

上次谈到了Fragment动画加载的异常问题,今天再聊聊它的动画加载loadAnimation的实现源代码: Animation loadAnimation(Fragment fragment, int transit, boolean enter, int transitionStyle) { 接下来具体看一下里面的源码部分,我将一部分一部分的讲解,首先是: Animation animObj = fragment.onCreateAnimation(transit, enter, fragm

Android中的帧动画的简单使用

Android中动画主要有下面几种,帧动画(frame),补间动画(tween),属性动画(property) 我们平时项目中主要用的是帧动画和补间动画 帧动画需要我们准备一组静态图片,这些图片是通过分解动画得来的,静态图片连起来播放形成动画效果 我们在res目录下新建一个drawable目录,用来存放动画资源和xml文件 图片如下: girl.xml 注意android:oneshot="false|true" 该属性控制动画是否重复播放,false代表重复播放 <?xml v

Android 中多点触摸协议

http://blog.csdn.net/zuosifengli/article/details/7398661 Android 中多点触摸协议: 参考: http://www.kernel.org/doc/Documentation/input/multi-touch-protocol.txt 1, 两种多点触摸协议: 1)A类: 处理无关联的接触: 用于直接发送原始数据: B类: 处理跟踪识别类的接触: 通过事件slot发送相关联的独立接触更新. 2,  触摸协议的使用: A类协议: A类协