Android HorizontalScrollView滑动与ViewPager切换案例详解

layout布局

<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:context=".MainActivity" >

    <HorizontalScrollView
        android:id="@+id/sc"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:scrollbars="none" >

        <LinearLayout
            android:id="@+id/line_sc"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >
        </LinearLayout>
    </HorizontalScrollView>

    <LinearLayout
        android:id="@+id/view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/sc"
      />

    <android.support.v4.view.ViewPager
        android:id="@+id/vp"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/view" >
    </android.support.v4.view.ViewPager>

</RelativeLayout>

 MainActivity.java

package com.bwie.test;
import java.util.ArrayList;
import com.bwie.adapter.MyAdapter;
import com.bwie.fragment.F1;
import com.bwie.utils.Myutil;
import android.os.Bundle;
import android.app.Activity;
import android.graphics.Color;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.DisplayMetrics;
import android.view.Menu;
import android.view.View;
import android.widget.HorizontalScrollView;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.TextView;

public class MainActivity extends FragmentActivity {

    private LinearLayout line_sc;
    private HorizontalScrollView sc;
    private String[] column = new String[] { "舍内要闻", "本社介绍", "履行职能", "自身建设",
            "社员风采", "自我介绍", "校内趣闻", "爆料" };
    private ArrayList<Fragment> list;
    private ViewPager vp;
    private int widthPixels;
    private ArrayList<TextView> list_view;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        /**
         * 获取窗口的 宽度
         */
        // 创建DisplayMetrics类对象
        DisplayMetrics dm = new DisplayMetrics();
        // 将当前窗口的一些信息放在DisplayMetrics类中
        getWindowManager().getDefaultDisplay().getMetrics(dm);
        widthPixels = dm.widthPixels;
        // 初始化数据
        init();
        // 获取栏目的数据
        getColumn();
        // 创建fragment数据
        setFragment();
        // 为vp设置数据
        FragmentManager fm = getSupportFragmentManager();
        vp.setAdapter(new MyAdapter(fm, list));
        setTitle_1(vp.getCurrentItem());

        // 为vp设置页面滑动监听
        vp.setOnPageChangeListener(new OnPageChangeListener() {

            @Override
            public void onPageSelected(int arg0) {
                //设置游标
                setTitle_1(arg0);
                //设置滑动
                setAutoScroll(arg0);
            }

            @Override
            public void onPageScrolled(int arg0, float arg1, int arg2) {
                // TODO Auto-generated method stub
            }
            @Override
            public void onPageScrollStateChanged(int arg0) {
                // TODO Auto-generated method stub
            }
        });

    }

    protected void setAutoScroll(int p) {
        // TODO Auto-generated method stub

        //获取当前要展示的游标
        TextView textView = list_view.get(p);
        //获取其宽度
        int w = textView.getMeasuredWidth();
        int left = textView.getLeft();
        int address=left-widthPixels/2;
        sc.smoothScrollTo(address, 0);
    }

    private void setFragment() {
        // 创建集合存放fragment对象
        list = new ArrayList<Fragment>();
        for (int i = 0; i < column.length; i++) {
            F1 f1 = new F1();
            // 传值
            Bundle b = new Bundle();
            b.putInt("column", i);
            f1.setArguments(b);
            // 将创建的fragment添加到集合中
            list.add(f1);
        }
    }
    private void setTitle_1(int arg0) {
        //设置当前显示的textview控件
        TextView textView = list_view.get(arg0);
        //将当前的textview显示
        textView.setVisibility(View.VISIBLE);
        for(int i=0;i<list_view.size();i++)
        {
            TextView tv = list_view.get(i);

            if(tv!=textView)
            {
                tv.setVisibility(View.GONE);
            }
        }
    }
    private void getColumn() {
        // TODO Auto-generated method stub
        list_view = new ArrayList<TextView>();
        for (int i = 0; i < column.length; i++) {
            // 创建线性布局来整体作为水平滚动的子布局
            LinearLayout sc = new LinearLayout(MainActivity.this);
            // 设置线性布局的排列方式(垂直)
            sc.setOrientation(1);
            sc.setPadding(30, 0, 0, 0);
            // 1.首先向线性布局中添加textview
            // 创建textview
            TextView tv = new TextView(MainActivity.this);
            // 为tv设置数据
            tv.setText(column[i]);
            LinearLayout.LayoutParams params = new LayoutParams(
                    widthPixels / 5, LayoutParams.WRAP_CONTENT);
            sc.addView(tv, params);

            // 2.向线性布局中添加下面的横线
            TextView tv_line = new TextView(MainActivity.this);
            LinearLayout.LayoutParams params_2 = new LayoutParams(
                    widthPixels / 5, 10);
            tv_line.setBackgroundColor(Color.GRAY);
            tv_line.setVisibility(View.INVISIBLE);
            list_view.add(tv_line);
            sc.addView(tv_line, params_2);

            // 将数据添加到 线性布局中
            line_sc.addView(sc);
        }

    }

    private void init() {
        line_sc = (LinearLayout) findViewById(R.id.line_sc);
        sc = (HorizontalScrollView) findViewById(R.id.sc);
        vp = (ViewPager) findViewById(R.id.vp);
    }
}

horizontalScrollView viewpager  字体颜色   滑动距离

FragmentManager fm = getSupportFragmentManager();
        viewPager.setAdapter(new MyFragmentAdapter(fm, getData()));
        viewPager.setOnPageChangeListener(new OnPageChangeListener() {

            public void onPageSelected(int arg0) {
                // TODO Auto-generated method stub
                setTag(arg0);
            }

            public void onPageScrolled(int arg0, float arg1, int arg2) {
                // TODO Auto-generated method stub
            }

            public void onPageScrollStateChanged(int arg0) {
                // TODO Auto-generated method stub

            }
        });

public ArrayList<Fragment> getData() {

        ArrayList<Fragment> list = new ArrayList<Fragment>();
        for (int i = 0; i < str.length; i++) {
            list.add(new F1(str[i]));
        }
        return list;
    }

    private void setData() {
        // TODO Auto-generated method stub
        List<String> list = new ArrayList<String>();
        for (int i = 0; i < str.length; i++) {
            View view = View.inflate(MainActivity.this,
                    android.R.layout.simple_list_item_1, null);
            TextView textView = (TextView) view
                    .findViewById(android.R.id.text1);
            list.add(str[i]);
            textView.setText(list.get(i));
            scroll_ly.addView(view);

            textView.setTag(i);
            textView.setOnClickListener(this);
        }
        TextView childAt = (TextView) scroll_ly.getChildAt(0);
        // childAt.setTextColor(Color.RED);
        childAt.setBackgroundColor(Color.RED);
        childAt.setTextColor(Color.WHITE);
    }

// 设置scrollview中textview的变化
    public void setTag(int position) {
        for (int i = 0; i < scroll_ly.getChildCount(); i++) {
            /**
             * textView滑动的位置
             */
            // 获取textview的viewpager滑动的当前子类
            TextView textView = (TextView) scroll_ly.getChildAt(position);
            int k = textView.getMeasuredWidth();
            int l = textView.getLeft();
            int s = k / 2 + l - wid / 2;
            // 设置scrollView x轴的距离
            scrollView.smoothScrollTo(s, 0);
            /**
             * textview滑动变色
             */
            TextView textView2 = (TextView) scroll_ly.getChildAt(i);
            if (position == i) {
                textView2.setBackgroundColor(Color.RED);
                textView2.setTextColor(Color.WHITE);
            } else {
                textView2.setTextColor(Color.BLACK);
                textView2.setBackgroundColor(Color.WHITE);
            }

        }
    }

    public void onClick(View v) {
        // TODO Auto-generated method stub
        if (v.getTag() != null) {
            int i = (Integer) v.getTag();
            View childAt = scroll_ly.getChildAt(i);
            if (v == childAt) {
                viewPager.setCurrentItem(i);
            }
        }
    }

到此这篇关于Android HorizontalScrollView滑动与ViewPager切换案例详解的文章就介绍到这了,更多相关Android HorizontalScrollView滑动与ViewPager切换内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Android自定义HorizontalScrollView实现qq侧滑菜单

    今天看了鸿洋_大神在慕课网讲的qq5.0侧滑菜单.学了不少的知识,同时也佩服鸿洋_大神思路的清晰. 看了教程课下也自己实现了一下.代码几乎完全相同  别喷我啊..没办法 o(︶︿︶)o 唉 像素不好 没办法 找不到好的制作gif的软件. 我们暂且称侧滑左边界面的为menu,右边为content 首先是menu的布局 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:androi

  • Android HorizontalScrollView左右滑动效果

    本文实例为大家分享了Android HorizontalScrollView左右滑动的具体代码,供大家参考,具体内容如下 效果图 一.什么是HorizontalScrollView HorizontalScrollView实际上是一个FrameLayout ,这意味着你只能在它下面放置一个子控件 ,这个子控件可以包含很多数据内容.有可能这个子控件本身就是一个布局控件,可以包含非常多的其他用来展示数据的控件.这个布局控件一般使用的是一个水平布局的LinearLayout.TextView也是一个可

  • Android使用HorizontalScrollView实现水平滚动

    HorizontalScrollView 和 ScrollView 都是由 FrameLayout 派生出来的.它们就是一个用于为普通组件添加滚动条的组件.且 HorizontalScrollView 和 ScrollView 里面最多只能包含一个组件(当然组件里面还可以嵌套组件).它们不同的是 HorizontalScrollView 用于添加水平滚动,而 ScrollView 用于添加垂直滚动. 突然间想到 做一个屏幕下方水平滑动,屏幕上方并作出相应的反应的效果.只是在下方滚动时,屏幕上方没

  • Android UI系列-----ScrollView和HorizontalScrollView的详解

    本篇随笔将讲解一下Android当中比较常用的两个布局容器--ScrollView和HorizontalScrollView,从字面意义上来看也是非常的简单的,ScrollView就是一个可以滚动的View,这个滚动的方向是垂直方向的,而HorizontalScrollView则是一个水平方向的可以滚动的View.本篇随笔可能描述性的知识比较少,最主要还是通过代码来看看如何使用这两个View. 一.ScrollView的简单介绍 首先来看看ScrollView和HorizontalScrollV

  • Android 自定义 HorizontalScrollView 打造多图片OOM 的横向滑动效果(实例代码)

    自从Gallery被谷歌废弃以后,Google推荐使用ViewPager和HorizontalScrollView来实现Gallery的效果.的确HorizontalScrollView可以实现Gallery的效果,但是HorizontalScrollView存在一个很大的问题,如果你仅是用来展示少量的图片,应该是没问题的,但是如果我希望HorizontalScrollView可以想ViewPager一样,既可以绑定数据集(动态改变图片),还能做到,不管多少图片都不会OOM(ViewPager内

  • Android HorizontalScrollView滑动与ViewPager切换案例详解

    layout布局 <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 Fragment滑动组件ViewPager的实例详解

    Android Fragment滑动组件ViewPager的实例详解 1适配器FragmentPagerAdapter的实现 对于FragmentPagerAdapter的派生类,只需要重写getItem(int)和getCount()就可以了. public class MyFragmentPagerAdapter extends FragmentPagerAdapter { private List<Fragment> list; public MyFragmentPagerAdapter

  • Android handle-message的发送与处理案例详解

    1.Handle,MessageQueue,Message类图 Handle: 处理消息,并提供一系列函数帮忙我们创建消息和插入消息到消息队列中 创建handle实例--PbapClientConnectionHandler mHandlerThread = new HandlerThread("PBAP PCE handler", Process.THREAD_PRIORITY_BACKGROUND); mHandlerThread.start(); //将这个线程设置为消息处理Lo

  • Android TextWatcher内容监听死循环案例详解

    Android TextWatcher内容监听死循环 TextWatcher如何避免在afterTextChanged中调用setText后导致死循环,今天在用TextView时,添加了addTextChangedListener方法监听内容改变,在afterTextChanged方法中又执行了setText方法,结果造成afterTextChanged方法再次调用,然后setText,因此造成了死循环的问题.列出此问题,以备后忘. 先贴Google文档原文说明: /** * This meth

  • Android中TelephonyManager类的用法案例详解

    本文以案例形式分析了Android中TelephonyManager类的用法.分享给大家供大家参考.具体如下: 目录结构: main.xml布局文件: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="ve

  • Android 使用registerReceiver注册BroadcastReceiver案例详解

    android.context.ContextWrapper.registerReceiver public Intent registerReceiver (BroadcastReceiver receiver, IntentFilter filter) Register a BroadcastReceiver to be run in the main activity thread. The receiver will be called with any broadcast Intent

  • Android 通过自定义view实现水波纹效果案例详解

    在实际的开发中,很多时候还会遇到相对比较复杂的需求,比如产品妹纸或UI妹纸在哪看了个让人兴奋的效果,兴致高昂的来找你,看了之后目的很明确,当然就是希望你能给她: 在这样的关键时候,身子板就一定得硬了,可千万别说不行,爷们儿怎么能说不行呢: 好了,为了让大家都能给妹纸们想要的,后面会逐渐分享一些比较比较不错的效果,目的只有一个,通过自定义view实现我们所能实现的动效: 今天主要分享水波纹效果: 标准正余弦水波纹: 非标准圆形液柱水波纹: 虽说都是水波纹,但两者在实现上差异是比较大的,一个通过正余

  • Android Location服务之LocationManager案例详解

    上次介绍了位置服务中的Geocoder,这次就来介绍一下LocationManager.LocationManager系统服务是位置服务的核心组件,它提供了一系列方法来处理与位置相关的问题,包括查询上一个已知位置.注册和注销来自某个LocationProvider的周期性的位置更新.注册和注销接近某个坐标时对一个已定义的Intent的触发等.今天我们就一起探讨一下LocationManager的简单应用. 在进入正题之前,朋友们需要了解与LocationManager相关的两个知识点: prov

  • Android mvvm之LiveData原理案例详解

    1. 生命周期感知 1.1 生命周期感知组件 我们知道,Controller(Activity or Fragment) 都是有生命周期的,但是传统的 Controller 实现方式只负责 Controller 本身的生命周期管理,而与业务层的数据之间并没有实现良好解耦的生命周期事件交换.所以业务层都需要自己主动去感知 Controller 生命周期的变化,并在 Controller 的生存期处理数据的保活,而在消亡时刻解除与 Controller 之间的关系,这种处理方式随着业务规模的扩大往往

  • Android bindService的使用与Service生命周期案例详解

    Android中有两种主要方式使用Service,通过调用Context的startService方法或调用Context的bindService方法,本文只探讨纯bindService的使用,不涉及任何startService方法调用的情况.如果想了解startService相关的使用,请参见<Android中startService的使用及Service生命周期>. bindService启动服务的特点 相比于用startService启动的Service,bindService启动的服务

随机推荐