HorizontalScrollView

HorizontalScrollView一、概述、水平滚动条可以左右滑动可与ViewPager协同使用二、HorizontalScrollView里边只能放一个子元素可以放一个Layout布局对象来盛放多个元素里边可以设置指示器

大家好,又见面了,我是你们的朋友全栈君。

 一、概述、 水平滚动条  可以左右滑动 可与ViewPager协同使用

    

二、HorizontalScrollView里边只能放一个子元素  可以放一个Layout布局对象来盛放多个元素

   里边可以设置指示器 和一条基准线 可以用来做导航栏类似于ActionBar的Tab导航栏,HorizontalScrollView做导航栏可以设置指示器跟随ViewPager页面移动实现动态效果   一般点击导航栏的某一项ViewPager相应跳到对应的页面,ViewPager跳到指定页面时导航栏也应该切换到对应的导航分类处

三、下面是实现的代码

<span role="heading" aria-level="2">HorizontalScrollView
<span role="heading" aria-level="2">HorizontalScrollView

  1 package com.qf.viewpager02_horizontalscrollview;
  2 
  3 import java.util.ArrayList;
  4 import java.util.List;
  5 import android.app.Activity;
  6 import android.graphics.Color;
  7 import android.os.Bundle;
  8 import android.support.v4.view.PagerAdapter;
  9 import android.support.v4.view.ViewPager;
 10 import android.view.View;
 11 import android.view.ViewGroup;
 12 import android.widget.HorizontalScrollView;
 13 import android.widget.LinearLayout;
 14 import android.widget.LinearLayout.LayoutParams;
 15 import android.widget.TextView;
 16 
 17 public class MainActivity extends Activity {
 18 
 19     private ViewPager vPager;
 20     private List<View> views;
 21     private HorizontalScrollView hScrollView; //水平滚动控件
 22     private LinearLayout navLayout; //标题模块所在的布局控件
 23     private View navIdicate; //指示器控件
 24     private LinearLayout.LayoutParams indicateParams; //指示器控件在线性布局中的参数对象
 25     
 26     @Override
 27     protected void onCreate(Bundle savedInstanceState) {
 28         super.onCreate(savedInstanceState);
 29         setContentView(R.layout.activity_main);
 30         
 31         vPager=(ViewPager) findViewById(R.id.viewPager);
 32         
 33         initViews();
 34         
 35         initNavLayout();
 36         
 37         viewPagerEvent();
 38         
 39         navLayoutEvent();
 40         
 41         selectNav(0);//默认选择第一页
 42     }
 43 
 44     private void navLayoutEvent() {
 45         // TODO 设置导航模块的点击事件
 46         TextView titleTv=null;
 47         for(int i=0;i<navLayout.getChildCount();i++){
 48             titleTv=(TextView) navLayout.getChildAt(i);
 49             titleTv.setTag(i);
 50             
 51             titleTv.setOnClickListener(new View.OnClickListener() {
 52                 
 53                 @Override
 54                 public void onClick(View v) {
 55                     // TODO Auto-generated method stub
 56                     vPager.setCurrentItem((Integer) v.getTag());
 57                 }
 58             });
 59         }
 60         
 61     }
 62 
 63     private void viewPagerEvent() {
 64         // TODO 处理ViewPager相关的事件
 65         vPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
 66             
 67             @Override
 68             public void onPageSelected(int position) {
 69                 // TODO Auto-generated method stub
 70                 selectNav(position);
 71             }
 72             
 73             @Override
 74             public void onPageScrolled(int position, float offset, int offsetPixels) {
 75                 // TODO 当页面滚动时,通过当前的位置和页面滚动的偏移量,计算指示器的左外边距的大小
 76                 int leftMargin=(int) (indicateParams.width*(position+offset));
 77                 indicateParams.leftMargin=leftMargin;
 78                 
 79                 navIdicate.setLayoutParams(indicateParams);//重新设置布局参数对象
 80                 
 81             }
 82             
 83             @Override
 84             public void onPageScrollStateChanged(int state) {
 85                 // TODO Auto-generated method stub
 86             }
 87         });
 88     }
 89 
 90     //选择导航模块的位置,将水平滚动控件滚动到当前模块位置的中心点
 91     private void selectNav(int position){
 92         
 93         TextView modelTv=(TextView) navLayout.getChildAt(position);
 94         
 95         int left=modelTv.getLeft();//获取当前模块控件的左边位置
 96         int offset=left-(getResources().getDisplayMetrics().widthPixels/2)+modelTv.getWidth()/2;
 97         
 98         hScrollView.smoothScrollTo(offset, 0);//水平滚动到指定位置(水平控件可见的左边位置)
 99         
100         for(int i=0;i<navLayout.getChildCount();i++){
101             modelTv=(TextView) navLayout.getChildAt(i);
102             if(i==position)
103                 modelTv.setTextColor(Color.argb(100, 255, 0, 0));
104             else
105                 modelTv.setTextColor(Color.argb(255,  0, 0, 0));
106         }
107         
108         
109     }
110     
111     private void initNavLayout() {
112         // TODO 查找导航中的相关控件
113         hScrollView=(HorizontalScrollView) findViewById(R.id.hScrollViewId);
114         navLayout=(LinearLayout) findViewById(R.id.navLayoutId);
115         navIdicate=findViewById(R.id.navIndicateId);
116         
117         indicateParams=(LayoutParams) navIdicate.getLayoutParams();//获取指示器控件的布局参数对象
118         
119     }
120 
121     private void initViews() {
122         // TODO 加载ViewPager中显示的页面资源
123         views=new ArrayList<View>();
124         views.add(getLayoutInflater().inflate(R.layout.viewpager_view01,null));
125         views.add(getLayoutInflater().inflate(R.layout.viewpager_view02,null));
126         views.add(getLayoutInflater().inflate(R.layout.viewpager_view03,null));
127         views.add(getLayoutInflater().inflate(R.layout.viewpager_view04,null));
128         views.add(getLayoutInflater().inflate(R.layout.viewpager_view05,null));
129         
130         vPager.setAdapter(new MyPagerAdapter()); //设置ViewPager的适配器
131         
132     }
133 
134     //自定义显示页面的适配(用于ViewPager中)
135     class MyPagerAdapter extends PagerAdapter{
136         @Override
137         public int getCount() {
138             return views.size();
139         }
140         @Override
141         public Object instantiateItem(ViewGroup container, int position) {
142             container.addView(views.get(position));
143             
144             return views.get(position);//作为数据对象返回
145         }
146         
147         @Override
148         public void destroyItem(ViewGroup container, int position, Object object) {
149             container.removeView(views.get(position));
150         }
151         
152         @Override
153         public boolean isViewFromObject(View view, Object obj) {
154             return view==obj;
155         }
156     }
157     
158 
159 }

MainActivity.java

<span role="heading" aria-level="2">HorizontalScrollView
<span role="heading" aria-level="2">HorizontalScrollView

 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:paddingBottom="@dimen/activity_vertical_margin"
 6     android:paddingLeft="@dimen/activity_horizontal_margin"
 7     android:paddingRight="@dimen/activity_horizontal_margin"
 8     android:paddingTop="@dimen/activity_vertical_margin"
 9     tools:context=".MainActivity" >
10 
11     <HorizontalScrollView
12         android:id="@+id/hScrollViewId"
13         android:layout_width="match_parent"
14         android:layout_height="50dp"
15         android:layout_marginBottom="2dp" 
16         android:scrollbars="none">
17 
18         <LinearLayout
19             android:layout_width="wrap_content"
20             android:layout_height="match_parent"
21             android:orientation="vertical" >
22 
23             <!-- 标题 -->
24 
25             <LinearLayout
26                 android:id="@+id/navLayoutId"
27                 android:layout_width="wrap_content"
28                 android:layout_height="45dp"
29                 android:orientation="horizontal" >
30 
31                 <TextView
32                     android:id="@+id/mode1Id"
33                     android:layout_width="150dp"
34                     android:layout_height="match_parent"
35                     android:gravity="center"
36                     android:text="第一个页面"
37                     android:textColor="#000"
38                     android:textSize="20sp" />
39 
40                 <TextView
41                     android:id="@+id/modelId2"
42                     android:layout_width="150dp"
43                     android:layout_height="match_parent"
44                     android:gravity="center"
45                     android:text="第2个页面"
46                     android:textColor="#000"
47                     android:textSize="20sp" />
48 
49                 <TextView
50                     android:id="@+id/mode1Id3"
51                     android:layout_width="150dp"
52                     android:layout_height="match_parent"
53                     android:gravity="center"
54                     android:text="第3个页面"
55                     android:textColor="#000"
56                     android:textSize="20sp" />
57 
58                 <TextView
59                     android:id="@+id/mode1Id4"
60                     android:layout_width="150dp"
61                     android:layout_height="match_parent"
62                     android:gravity="center"
63                     android:text="第4个页面"
64                     android:textColor="#000"
65                     android:textSize="20sp" />
66 
67                 <TextView
68                     android:id="@+id/mode1Id5"
69                     android:layout_width="150dp"
70                     android:layout_height="match_parent"
71                     android:gravity="center"
72                     android:text="第5个页面"
73                     android:textColor="#000"
74                     android:textSize="20sp" />
75             </LinearLayout>
76             <!-- 指示器 -->
77             <View
78                 android:id="@+id/navIndicateId"
79                 android:layout_width="150dp"
80                 android:layout_height="4dp"
81                 android:background="#f00"
82                 />
83             <!-- 基准线 -->
84              <View
85                 android:layout_width="match_parent"
86                 android:layout_height="1dp"
87                 android:background="#800"
88                 />
89             
90         </LinearLayout>
91     </HorizontalScrollView>
92 
93     <android.support.v4.view.ViewPager
94         android:id="@+id/viewPager"
95         android:layout_width="match_parent"
96         android:layout_height="match_parent"
97         android:layout_below="@id/hScrollViewId" />
98 
99 </RelativeLayout>

activity_main.xml

 

四、效果图

<span role="heading" aria-level="2">HorizontalScrollView

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/154571.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 五子棋人机对战思路「建议收藏」

    五子棋人机对战思路「建议收藏」五子棋人机对战:人机对战,我们可以想象一下我们在玩QQ游戏五子棋时的场景,根据每次下的步骤来分析电脑是怎样解析我们下棋的步骤的。下五子棋的步骤:1、第一步,黑子先下2、白子的第一步的最好的位置就是在黑子周围的八个点上3、接着黑子的第二步必然也是根据白子周围的八个点和自己的黑子所在的位置来下。4、如此循环下去。。。。那么对于计算机来说,就是让他找到第一个黑子周围的八个点,并且随机选中一个下白子。…

    2022年6月16日
    187
  • SDK封装_java封装类

    SDK封装_java封装类本文主要讲解java封装jar包的过程,一个简单的demo,方便大家入手学习打包jar包。转载地址:https://www.cnblogs.com/shirui/p/5270969.html准备材料: 1.java文件:      Helloworld.java packagecom.ray;publicclassHelloWorld{publicstaticvoidma…

    2022年10月21日
    3
  • 什么是跨域问题?跨域解决问题

    什么是跨域问题?跨域解决问题一 为什么会出现跨域问题 出于浏览器的同源策略限制 同源策略是一种约定 它是浏览器最核心也是最基本的安全功能 如果缺少了同源策略 则浏览器的正常的功能可能会受到影响 跨域收是 Web 是构建在同源策略基础上的 浏览器只是针对同源策略的一种实现 同源策略会阻止一个域的 JavaScript 脚本和另一个域的内容进行交互 所谓同源 即指同一个域 就是两个页面具备同样的协议 protocol 主机 host 和端口号 port 跨域报错的原因请求是跨域的 并不一定会报错 普通的图片请求 css 文件请求是不

    2025年6月12日
    4
  • IOS中多线程应用实践

    IOS中多线程应用实践

    2021年8月24日
    47
  • C++ 钩子 Hook

    C++ 钩子 Hook一 基本概念 钩子 Hook 是 Windows 消息处理机制的一个平台 应用程序可以在上面设置子程以监视指定窗口的某种消息 而且所监视的窗口可以是其他进程所创建的 当消息到达后 在目标窗口处理函数之前处理它 钩子机制允许应用程序截获处理 window 消息或特定事件 钩子实际上是一个处理消息的程序段 通过系统调用 把它挂入系统 每当特定的消息发出 在没有到达目的窗口前 钩子程序就先

    2025年11月24日
    3
  • netty编解码器_netty编程实战

    netty编解码器_netty编程实战目录​1Java序列化的缺点2业界主流的编解码框架2.1Google的Protobuf介绍2.2Facebook的Thrift介绍2.3JBossMarshalling介绍 第6章编解码技术1Java序列化的缺点java序列化通过实现Serializable接口来实现 无法跨语言 序列化后的码流太大  序列化性能太低java序列化的两…

    2022年9月28日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号