开发过程中,需要达到 HorizontalScrollView和ViewPager的效果,于是直接重写了HorizontalScrollView来达到实现ViewPager的效果。

实际效果图如下:

(1)自定义HorizontalScrollView类:AppHorizontalScrollView实现:

  1. package com.czm.ui.view;
  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. * 应用详情页截图 自定义HorizontalScrollView视图 ( 仿ViewPager效果)
  14. * @author caizhiming
  15. *
  16. */
  17. public class AppHorizontalScrollView extends HorizontalScrollView {
  18.  
  19. /**
  20. * 数据定义
  21. */
  22. private int subChildCount = 0;
  23. private ViewGroup firstChild = null;
  24. private int downX = 0;
  25. private int currentPage = 0;
  26. private ArrayList<Integer> viewList = new ArrayList<Integer>();
  27.  
  28. /**
  29. * 构造方法
  30. * @author caizhiming
  31. */
  32. public AppHorizontalScrollView(Context context, AttributeSet attrs,
  33. int defStyle) {
  34. super(context, attrs, defStyle);
  35. init();
  36. }
  37.  
  38. public AppHorizontalScrollView(Context context, AttributeSet attrs) {
  39. super(context, attrs);
  40. init();
  41. }
  42.  
  43. public AppHorizontalScrollView(Context context) {
  44. super(context);
  45. init();
  46. }
  47.  
  48. private void init() {
  49. setHorizontalScrollBarEnabled(false);//设置原有的滚动无效
  50. }
  51.  
  52. @Override
  53. protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  54. super.onMeasure(widthMeasureSpec, heightMeasureSpec);
  55. getChildInfo();
  56. }
  57.  
  58. /**
  59. * 获取子视图信息
  60. * @author caizhiming
  61. */
  62. public void getChildInfo() {
  63.  
  64. firstChild = (ViewGroup) getChildAt(0);
  65. if (firstChild != null) {
  66. subChildCount = firstChild.getChildCount();
  67. for (int i = 0; i < subChildCount; i++) {
  68. if (((View) firstChild.getChildAt(i)).getWidth() > 0) {
  69. viewList.add(((View) firstChild.getChildAt(i)).getLeft());
  70. }
  71. }
  72. }
  73.  
  74. }
  75.  
  76. /**
  77. * 触摸监听时间
  78. * @author caizhiming
  79. */
  80. @Override
  81. public boolean onTouchEvent(MotionEvent ev) {
  82. switch (ev.getAction()) {
  83. case MotionEvent.ACTION_DOWN:
  84. downX = (int) ev.getX();
  85. break;
  86. case MotionEvent.ACTION_MOVE:
  87. break;
  88. case MotionEvent.ACTION_UP:
  89. case MotionEvent.ACTION_CANCEL: {
  90. if (Math.abs((ev.getX() - downX)) > getWidth() / 4) {
  91. if (ev.getX() - downX > 0) {
  92. smoothScrollToPrePage();
  93. } else {
  94. smoothScrollToNextPage();
  95. }
  96. } else {
  97. smoothScrollToCurrent();
  98. }
  99. return true;
  100. }
  101. }
  102. return super.onTouchEvent(ev);
  103. }
  104.  
  105. /**
  106. * 滑动到当前页
  107. * @author caizhiming
  108. */
  109. private void smoothScrollToCurrent() {
  110. smoothScrollTo(viewList.get(currentPage)-10, 0);
  111. }
  112.  
  113. /**
  114. * 滑动到下一页
  115. * @author caizhiming
  116. */
  117. private void smoothScrollToNextPage() {
  118. if (currentPage < subChildCount - 1) {
  119. currentPage++;
  120. smoothScrollTo(viewList.get(currentPage)-10, 0);
  121. }
  122. }
  123. /**
  124. * 滑动到上一页
  125. * @author caizhiming
  126. */
  127. private void smoothScrollToPrePage() {
  128. if (currentPage > 0) {
  129. currentPage--;
  130. smoothScrollTo(viewList.get(currentPage)-10, 0);
  131. }
  132. }
  133.  
  134. /**
  135. * 滑动到下一页
  136. * @author caizhiming
  137. */
  138. public void nextPage() {
  139. smoothScrollToNextPage();
  140. }
  141.  
  142. /**
  143. * 滑动到上一页
  144. * @author caizhiming
  145. */
  146. public void prePage() {
  147. smoothScrollToPrePage();
  148. }
  149.  
  150. /**
  151. * 跳转到指定的页面
  152. *
  153. * @param page
  154. * @author caizhiming
  155. */
  156. public boolean gotoPage(int page) {
  157. if (page > 0 && page < subChildCount - 1) {
  158. smoothScrollTo(viewList.get(page), 0);
  159. currentPage = page;
  160. return true;
  161. }
  162. return false;
  163. }
  164.  
  165. }

(2)UI配置文件xml中使用方法如下:

  1. <com.czm.ui.view.AppHorizontalScrollView
  2. android:id="@+id/horizontalScrollView1"
  3. android:layout_width="wrap_content"
  4. android:layout_height="wrap_content"
  5. android:visibility="gone"
  6. android:scrollbars="none" >
  7.  
  8. <LinearLayout
  9. android:id="@+id/llCoverList"
  10. android:layout_width="fill_parent"
  11. android:layout_height="wrap_content"
  12. android:padding="10dp"
  13. android:background="#DDDDDD"
  14. android:orientation="horizontal" >
  15.  
  16. </LinearLayout>
  17. </com.czm.ui.view.AppHorizontalScrollView>

Android 自定义View修炼-自定义HorizontalScrollView视图实现仿ViewPager效果的更多相关文章

  1. Android 自定义View修炼-自定义可动画展开收缩View的实现

    有时候需要点击一个view可以动画展开和收缩折叠一个View这样的效果,这样就可以直接自定义View来实现. 本例中,采用继承FrameLayout来实现自定义的ExpandView.下面将详细介绍各 ...

  2. Android 自定义View修炼-自定义View-带百分比进度的圆形进度条(采用自定义属性)

    很多的时候,系统自带的View满足不了我们功能的需求,那么我们就需要自己来自定义一个能满足我们需求的View,自定义View我们需要先继承View,添加类的构造方法,重写父类View的一些方法,例如o ...

  3. Android 自定义View修炼-自定义加载进度动画XCLoadingImageView

    一.概述 本自定义View,是加载进度动画的自定义View,继承于ImageView来实现,主要实现蒙层加载进度的加载进度效果. 支持水平左右加载和垂直上下加载四个方向,同时也支持自定义蒙层进度颜色. ...

  4. Android 自定义View修炼-自定义弹幕效果View

    一.概述 现在有个很流行的效果就是弹幕效果,满屏幕的文字从右到左飘来飘去.看的眼花缭乱,看起来还蛮cool的 现在就是来实现这一的一个效果,大部分的都是从右向左移动漂移,本文的效果中也支持从左向右的漂 ...

  5. Dialog详解(包括进度条、PopupWindow、自定义view、自定义样式的对话框)

    Dialog详解(包括进度条.PopupWindow.自定义view.自定义样式的对话框)   Android中提供了多种对话框,在实际应用中我们可能会需要修改这些已有的对话框.本实例就是从实际出发, ...

  6. Android 自定义View修炼-【2014年最后的分享啦】Android实现自定义刮刮卡效果View

    一.简介: 今天是2014年最后一天啦,首先在这里,我祝福大家在新的2015年都一个个的新健康,新收入,新顺利,新如意!!! 上一偏,我介绍了用Xfermode实现自定义圆角和椭圆图片view的博文& ...

  7. Android 自定义View修炼-Android实现圆形、圆角和椭圆自定义图片View(使用BitmapShader图形渲染方法)

    一.概述 Android实现圆角矩形,圆形或者椭圆等图形,一般主要是个自定义View加上使用Xfermode实现的.实现圆角图片的方法其实不少,常见的就是利用Xfermode,Shader.本文直接继 ...

  8. Android 自定义View修炼-Android开发之自定义View开发及实例详解

    在开发Android应用的过程中,难免需要自定义View,其实自定义View不难,只要了解原理,实现起来就没有那么难. 其主要原理就是继承View,重写构造方法.onDraw,(onMeasure)等 ...

  9. Android 自定义View修炼-Android 实现自定义的卫星式菜单(弧形菜单)View

    一.总述 Android 实现卫星式菜单也叫弧形菜单的主要要做的工作如下:1.动画的处理2.自定义ViewGroup来实现卫星式菜单View (1)自定义属性       a. 在attrs.xml中 ...

随机推荐

  1. SQLMAP系列教程

    1.SQLMAP安装及access注入: http://www.stronkin.com/en/CompHonorBig.asp?id=7   2.Mysql数据库注入 http://www.slib ...

  2. python邮件收发SAMPLE

    #!/usr/bin/env python # -*- encoding: utf-8 -*- import os, socket from time import localtime, strfti ...

  3. 【Xamarin挖墙脚系列:对设备/模拟器的查看调试监听】

    原文:[Xamarin挖墙脚系列:对设备/模拟器的查看调试监听] 有时候我们需要查看模拟器中的文件,比如进行了文件IO操作,sqlite数据库的操作等.我们想查看内容,这时候,如何将内容导出来?由于A ...

  4. [LeetCode] 315. Count of Smaller Numbers After Self (Hard)

    315. Count of Smaller Numbers After Self class Solution { public: vector<int> countSmaller(vec ...

  5. Linux下压缩某个文件夹(文件夹打包)

    tar -zcvf /home/xahot.tar.gz /xahottar -zcvf 打包后生成的文件名全路径 要打包的目录例子:把/xahot文件夹打包后生成一个/home/xahot.tar. ...

  6. linux ERROR: ld.so: object '/lib/libcwait.so' from /etc/ld.so.preload cannot be preloaded: ignored.

    [root@ora9i 3238244]# lsb_release -a LSB Version:    :core-3.0-amd64:core-3.0-ia32:core-3.0-noarch:g ...

  7. ☀【CSS3】形状

    CSS3shapeshttp://www.css3shapes.com/ <!DOCTYPE html> <html lang="zh-CN"> <h ...

  8. 手动启动jenkins

    无论Linux还是windows, jenkins都是作为一个后台服务存在的. 所以在Linux下,手动启动或停止jenkins: service jenkins start service jenk ...

  9. 《C语言程序设计现代方法》第2章 C语言基本概念

    C语言的基本概念 第一个C程序例子. /* pun.c */ #include <stdio.h> int main(void) { printf("To C, or not t ...

  10. Hdu 5213-Lucky 莫队,容斥原理,分块

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5213 Lucky Time Limit: 6000/3000 MS (Java/Others)    Me ...