Android重写HorizontalScrollView模仿ViewPager效果

Android提供的ViewPager类太复杂,有时候没有必要使用,所以重写一个HorizontalScrollView来实现类似的效果,也可以当做Gallery来用

思路很简单,就是重写onTouchEvent事件,在手指抬起或者取消的时候,进行smoothScroll的操作,具体请看代码:

布局文件:activity_test.xml

?


1

2

3

4

5

6

1 <!--?xml version=1.0 encoding=utf-8?-->

 2 <com.example.testxinye.myscrollview 3="" 4="" 5="" 6="" android:layout_height="fill_parent" android:layout_width="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android">

 7     <linearlayout 10="" 11="" 8="" 9="" android:id="@+id/container" android:layout_height="match_parent" android:layout_width="match_parent" android:orientation="horizontal">

12

13     </linearlayout>

14 </com.example.testxinye.myscrollview>

Activity类:TestActivity.java

?


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

1 package com.example.testxinye;

 2

 3 import android.app.Activity;

 4 import android.graphics.Color;

 5 import android.os.Bundle;

 6 import android.util.DisplayMetrics;

 7 import android.widget.ImageView;

 8 import android.widget.ImageView.ScaleType;

 9 import android.widget.LinearLayout;

10 import android.widget.LinearLayout.LayoutParams;

11 /**

12  *

13  * @author xinye

14  *

15  */

16 public class TestActivity extends Activity {

17     private LinearLayout mContainer = null;

18     @Override

19     protected void onCreate(Bundle savedInstanceState) {

20         // TODO Auto-generated method stub

21         super.onCreate(savedInstanceState);

22         setContentView(R.layout.activity_test);

23

24         mContainer = (LinearLayout) findViewById(R.id.container);

25

26         LayoutParams params = new LayoutParams(getWinWidth(), getWinHeight());

27

28         ImageView imageView1 = new ImageView(this);

29         imageView1.setLayoutParams(params);

30         imageView1.setImageResource(R.drawable.call_show_medal5);

31         imageView1.setScaleType(ScaleType.CENTER);

32         mContainer.addView(imageView1);

33

34         ImageView imageView2 = new ImageView(this);

35         imageView2.setLayoutParams(params);

36         imageView2.setImageResource(R.drawable.call_show_medal1);

37         imageView2.setScaleType(ScaleType.CENTER);

38         imageView2.setBackgroundColor(Color.RED);

39         mContainer.addView(imageView2);

40

41         ImageView imageView3 = new ImageView(this);

42         imageView3.setLayoutParams(params);

43         imageView3.setImageResource(R.drawable.call_show_medal2);

44         imageView3.setScaleType(ScaleType.CENTER);

45         imageView3.setBackgroundColor(Color.GRAY);

46         mContainer.addView(imageView3);

47

48

49         ImageView imageView4 = new ImageView(this);

50         imageView4.setLayoutParams(params);

51         imageView4.setImageResource(R.drawable.call_show_medal3);

52         imageView4.setScaleType(ScaleType.CENTER);

53         imageView4.setBackgroundColor(Color.BLUE);

54         mContainer.addView(imageView4);

55

56

57         ImageView imageView5 = new ImageView(this);

58         imageView5.setLayoutParams(params);

59         imageView5.setImageResource(R.drawable.call_show_medal4);

60         imageView5.setScaleType(ScaleType.CENTER);

61         imageView5.setBackgroundColor(Color.GREEN);

62         mContainer.addView(imageView5);

63

64

65

66     }

67

68     @Override

69     protected void onResume() {

70 //        ((MyScrollView)mContainer.getParent()).init();

71         super.onResume();

72     }

73

74     private int getWinWidth(){

75         DisplayMetrics dm = new DisplayMetrics();

76         //获取屏幕信息

77         getWindowManager().getDefaultDisplay().getMetrics(dm);

78         return dm.widthPixels;

79     }

80     private int getWinHeight(){

81         DisplayMetrics dm = new DisplayMetrics();

82         //获取屏幕信息

83         getWindowManager().getDefaultDisplay().getMetrics(dm);

84         return dm.heightPixels;

85     }

86 }

重写的HorizontalScrollView:MyScrollView.java

1 package com.example.testxinye;

?


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

  2

  3 import java.util.ArrayList;

  4

  5 import android.content.Context;

  6 import android.util.AttributeSet;

  7 import android.view.MotionEvent;

  8 import android.view.View;

  9 import android.view.ViewGroup;

 10 import android.widget.HorizontalScrollView;

 11 /**

 12  *

 13  * @author XINYE

 14  *

 15  */

 16 public class MyScrollView extends HorizontalScrollView {

 17     private int subChildCount = 0;

 18     private ViewGroup firstChild = null;

 19     private int downX = 0;

 20     private int currentPage = 0;

 21     private ArrayList<integer> pointList = new ArrayList<integer>();

 22

 23     public MyScrollView(Context context, AttributeSet attrs, int defStyle) {

 24         super(context, attrs, defStyle);

 25         init();

 26     }

 27

 28

 29     public MyScrollView(Context context, AttributeSet attrs) {

 30         super(context, attrs);

 31         init();

 32     }

 33

 34     public MyScrollView(Context context) {

 35         super(context);

 36         init();

 37     }

 38     private void init() {

 39         setHorizontalScrollBarEnabled(false);

 40     }

 41     @Override

 42     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

 43         super.onMeasure(widthMeasureSpec, heightMeasureSpec);

 44         receiveChildInfo();

 45     }

 46     public void receiveChildInfo() {

 47

 48         firstChild = (ViewGroup) getChildAt(0);

 49         if(firstChild != null){

 50             subChildCount = firstChild.getChildCount();

 51             for(int i = 0;i < subChildCount;i++){

 52                 if(((View)firstChild.getChildAt(i)).getWidth() > 0){

 53                     pointList.add(((View)firstChild.getChildAt(i)).getLeft());

 54                 }

 55             }

 56         }

 57

 58     }

 59     @Override

 60     public boolean onTouchEvent(MotionEvent ev) {

 61         switch (ev.getAction()) {

 62         case MotionEvent.ACTION_DOWN:

 63             downX = (int) ev.getX();

 64             break;

 65         case MotionEvent.ACTION_MOVE:{

 66

 67         }break;

 68         case MotionEvent.ACTION_UP:

 69         case MotionEvent.ACTION_CANCEL:{

 70             if( Math.abs((ev.getX() - downX)) > getWidth() / 4){

 71                 if(ev.getX() - downX > 0){

 72                     smoothScrollToPrePage();

 73                 }else{

 74                     smoothScrollToNextPage();

 75                 }

 76             }else{           

 77                 smoothScrollToCurrent();

 78             }

 79             return true;

 80         }

 81         }

 82         return super.onTouchEvent(ev);

 83     }

 84

 85     private void smoothScrollToCurrent() {

 86         smoothScrollTo(pointList.get(currentPage), 0);

 87     }

 88

 89     private void smoothScrollToNextPage() {

 90         if(currentPage < subChildCount - 1){

 91             currentPage++;

 92             smoothScrollTo(pointList.get(currentPage), 0);

 93         }

 94     }

 95

 96     private void smoothScrollToPrePage() {

 97         if(currentPage > 0){           

 98             currentPage--;

 99             smoothScrollTo(pointList.get(currentPage), 0);

100         }

101     }

102     /**

103      * 下一页

104      */

105     public void nextPage(){

106         smoothScrollToNextPage();

107     }

108     /**

109      * 上一页

110      */

111     public void prePage(){

112         smoothScrollToPrePage();

113     }

114     /**

115      * 跳转到指定的页面

116      * @param page

117      * @return

118      */

119     public boolean gotoPage(int page){

120         if(page > 0 && page < subChildCount - 1){

121             smoothScrollTo(pointList.get(page), 0);

122             currentPage = page;

123             return true;

124         }

125         return false;

126     }

127 }</integer></integer>

结伴旅游,一个免费的交友网站:www.jieberu.com

推推族,免费得门票,游景区:www.tuituizu.com

时间: 2024-10-11 04:31:21

Android重写HorizontalScrollView模仿ViewPager效果的相关文章

Android 使用HorizontalScrollView 实现Gallery效果

Gallery(画廊)是一个锁定中心条目并且拥有水平滚动列表的视图,一般用来浏览图片,并且可以响应事件显示信息:Gallery还可以和ImageSwitcher组件结合使用来实现一个通过缩略图来浏览图片的效果: 但Gallery被谷歌废弃了,Google推荐使用ViewPager和HorizontalScrollView来实现Gallery的效果: 看一个例子:用Gallery来实现: 代码: ScrollView1.java package com.xiaozhang.dialog; impo

Android开发之自定义HorizontalScrollView视图实现仿ViewPager效果

开发过程中,需要达到 HorizontalScrollView和ViewPager的效果,于是直接重写了HorizontalScrollView来达到实现ViewPager的效果. 实际效果图如下: (1)自定义HorizontalScrollView类:AppHorizontalScrollView实现: package com.czm.ui.view; import java.util.ArrayList; import android.content.Context; import and

Android 自定义 HorizontalScrollView 打造再多图片(控件)也不怕 OOM 的横向滑动效果

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38140505 自从Gallery被谷歌废弃以后,Google推荐使用ViewPager和HorizontalScrollView来实现Gallery的效果.的确HorizontalScrollView可以实现Gallery的效果,但是HorizontalScrollView存在一个很大的问题,如果你仅是用来展示少量的图片,应该是没问题的,但是如果我希望HorizontalScr

[移动开发] Android自定义控件系列六:自定义ViewGroup(一)实现ViewPager效果

今天我们开始新的Android自定组件旅程,下面一个内容是如何自定义一个ViewGoup,之前我们已经通过几篇博文已经了解了自定义view的基本写法,如果有不了解的同学,可以参看下面专栏中的文章:Android自定义控件. 这次同样也是通过一个例子来说明要如何自定义一个ViewGroup,最终目标就是要实现一个类ViewPager功能的ViewGroup. 我们先来看看最终效果: 对于系统的ViewGroup我们已经是十分熟悉了,最常用的LinearLayout和RelativeLayout几乎

ScrollView + viewpager实现android的app主界面效果

ScrollView + viewpager实现android的app主界面效果 Android的主界面一般由两部分组成:导航栏,滑动的分屏(我自己这么叫的).其中滑动的分屏肯定是用的fragment,具体的承载的控件是viewpager.而导航分页栏用的控件就有很多了,tabhost,Scrollview或者自定义的都行. 个人认为tabhost和Scrollview都是比较好的,因为后期的可拓展性比较好,除非导航栏界面确实属于"自定义"范畴,基本上我们可以选择这两样就可以了. 其实

Android重写ViewPager修改滑动灵敏度

使用ViewPager作为一个页面进行切换,里面可以存放很多View,但有时在操作View时不小心滑动一下就有可能跳到下一页,这并不是我们想要的,这里就需要重写ViewPager修改它的滑动条件 效果图 程序目录结构 BTViewPager.java package com.example.viewpagerdemo; import android.content.Context; import android.support.v4.view.ViewPager; import android.

【Android界面实现】使用ScrollingTabsView实现有滑动标签的ViewPager效果

转载自:http://blog.csdn.net/zhaokaiqiang1992/article/details/40378285 在前面的文章中,我们使用支持包里面的PagerTabStrip实现了有滑动标签的viewPager效果,今天,再给大家介绍另外一种开源项目,来实现类似的效果. 在这篇文章中,我们将使用第三方开源项目ViewPagerExtensions实现. 先看效果 ViewPagerExtensions的github地址:https://github.com/astuetz/

android 重写 viewpager

重写viewpager在viewpager里调用getChildAt(position)的时候发现有问题 很多获取的view都为null 查资料发现 是因为我在instantiateitem的时候调用的是((ViewPager) container).addView(view); 应该写成((ViewPager) container).addView(view, position); 运行之后报错,index越界 又查是因为viewpager里面默认可存的数量是有限的 ,应该是viewpager

Android实现图片轮显效果——自定义ViewPager控件

一.问题概述 使用ViewPager控件实现可横向翻页.水平切换图片等效果,但ViewPager需要手动滑动才能切换页面,图片轮显效果的效果本质上就是在ViewPager控件的基础上让它能自动的进行切换,所以实现图片轮显步骤如下: 1.  扩展ViewPager自定义一个MyScrollImageView类 2.  为MyScrollImageView定义适配器,装载图片信息 3.  定义图片滑动动画时间控制类 接下来我们就一步步实现下图案例: 二.实现套路 1.为自定义ViewPager控件编