Android从圆点导航的两个案例(ViewPager)

案例一效果:

布局文件:

<RelativeLayout    xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:id="@+id/activity_view_pager"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context="com.jogger.demo.ViewPagerActivity">

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

<LinearLayout        android:id="@+id/ll_container"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_alignParentBottom="true"        android:layout_marginBottom="40dp"        android:gravity="center"        android:orientation="horizontal"></LinearLayout>

</RelativeLayout>

Activity:
public class ViewPagerActivity extends FragmentActivity {

private ViewPager vp_guide;    private List<ImageView> mImgList;//导航图集合    private LinearLayout ll_container;//小圆点容器    private int mCurrentIndex = 0;//当前小圆点的位置    private int[] imgArray = {R.drawable.guidance1, R.drawable.guidance2, R.drawable.guidance3, R            .drawable.guidance4};

@Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_view_pager);        vp_guide = (ViewPager) findViewById(R.id.vp_guide);        ll_container = (LinearLayout) findViewById(R.id.ll_container);        mImgList = new ArrayList<>();        for (int i = 0; i < imgArray.length; i++) {            ImageView imageView = new ImageView(this);//获取4个圆点            imageView.setImageResource(imgArray[i]);            mImgList.add(imageView);            ImageView dot = new ImageView(this);            if (i == mCurrentIndex) {                dot.setImageResource(R.drawable.page_now);//设置当前页的圆点            } else {                dot.setImageResource(R.drawable.page);//其余页的圆点            }            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout                    .LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);            if (i > 0) {                params.leftMargin = 10;//设置圆点边距            }            dot.setLayoutParams(params);            ll_container.addView(dot);//将圆点添加到容器中        }        vp_guide.setAdapter(new MyAdapter(mImgList));        //添加监听        vp_guide.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {            @Override            public void onPageScrolled(int position, float positionOffset, int                    positionOffsetPixels) {

}

@Override            public void onPageSelected(int position) {                //根据监听的页面改变当前页对应的小圆点                mCurrentIndex = position;                for (int i = 0; i < ll_container.getChildCount(); i++) {                    ImageView imageView = (ImageView) ll_container.getChildAt(i);                    if (i == position) {                        imageView.setImageResource(R.drawable.page_now);                    } else {                        imageView.setImageResource(R.drawable.page);                    }                }            }

@Override            public void onPageScrollStateChanged(int state) {

}        });    }

public class MyAdapter extends PagerAdapter {        private List<ImageView> mViewList;

public MyAdapter(List<ImageView> viewList) {            mViewList = viewList;        }

@Override        public ImageView instantiateItem(ViewGroup container, int position) {            ImageView view = mViewList.get(position);            container.addView(view);            return view;        }

@Override        public int getCount() {            return mViewList.size();        }

@Override        public boolean isViewFromObject(View view, Object object) {            return view == object;        }

@Override        public void destroyItem(ViewGroup container, int position, Object object) {            container.removeView(mViewList.get(position));        }    }}

案例二效果:

布局文件:
<?xml version="1.0" encoding="utf-8"?><RelativeLayout    xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:id="@+id/activity_view_pager"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context="com.jogger.demo.ViewPagerActivity">

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

<RelativeLayout        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignParentBottom="true"        android:layout_centerHorizontal="true"        android:layout_marginBottom="40dp">

<LinearLayout            android:id="@+id/ll_container"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:orientation="horizontal">        </LinearLayout>

<ImageView            android:id="@+id/iv_dot_now"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:src="@drawable/page_now"/>    </RelativeLayout>

</RelativeLayout>

Activity:
public class ViewPagerActivity extends FragmentActivity {

private ViewPager vp_guide;    private List<ImageView> mImgList;//导航图集合    private LinearLayout ll_container;//小圆点容器    private int mCurrentIndex = 0;//当前小圆点的位置    private int mDotDis;//小圆点的距离    private ImageView iv_dot_now;//当前圆点    private int[] imgArray = {R.drawable.guidance1, R.drawable.guidance2, R.drawable.guidance3, R            .drawable.guidance4};

@Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_view_pager);        vp_guide = (ViewPager) findViewById(R.id.vp_guide);        ll_container = (LinearLayout) findViewById(R.id.ll_container);        iv_dot_now = (ImageView) findViewById(R.id.iv_dot_now);        mImgList = new ArrayList<>();        for (int i = 0; i < imgArray.length; i++) {            ImageView imageView = new ImageView(this);//获取4个圆点            imageView.setImageResource(imgArray[i]);            mImgList.add(imageView);            ImageView dot = new ImageView(this);            dot.setImageResource(R.drawable.page);            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout                    .LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);            if (i > 0) {                params.leftMargin = 10;//设置圆点边距            }            dot.setLayoutParams(params);            ll_container.addView(dot);//将圆点添加到容器中        }        vp_guide.setAdapter(new MyAdapter(mImgList));        //添加监听        vp_guide.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {            @Override            public void onPageScrolled(int position, float positionOffset, int                    positionOffsetPixels) {                // 滚动过程中                // 红色小圆点的移动距离=移动百分比*两个圆点的间距                // 更新小红点距离                int dis = (int) (mDotDis * positionOffset) + position * mDotDis;//                // 因为移动完一个界面后,百分比会归0,所以要加上移动过的单位position*mPointDis                //获取小圆点的布局属性,更新左边距                RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) iv_dot_now                        .getLayoutParams();                params.leftMargin = dis;// 修改左边距                // 重新设置布局参数                iv_dot_now.setLayoutParams(params);            }

@Override            public void onPageSelected(int position) {

}

@Override            public void onPageScrollStateChanged(int state) {

}        });        // 监听layout方法结束的事件,位置确定之后获取圆点间距        // 视图树        iv_dot_now.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver                .OnGlobalLayoutListener() {

@Override            public void onGlobalLayout() {                //视图树移除监听                iv_dot_now.getViewTreeObserver().removeOnGlobalLayoutListener(this);                //计算得到小圆点距离                mDotDis = ll_container.getChildAt(1).getLeft() - ll_container.getChildAt(0)                        .getLeft();            }        });    }

public class MyAdapter extends PagerAdapter {        private List<ImageView> mViewList;

public MyAdapter(List<ImageView> viewList) {            mViewList = viewList;        }

@Override        public ImageView instantiateItem(ViewGroup container, int position) {            ImageView view = mViewList.get(position);            container.addView(view);            return view;        }

@Override        public int getCount() {            return mViewList.size();        }

@Override        public boolean isViewFromObject(View view, Object object) {            return view == object;        }

@Override        public void destroyItem(ViewGroup container, int position, Object object) {            container.removeView(mViewList.get(position));        }    }}
时间: 2024-10-10 07:55:25

Android从圆点导航的两个案例(ViewPager)的相关文章

Android 利用ViewPager实现底部圆点导航左右滑动效果以及Fragment页面切换

上一篇博文我们介绍了利用ViewPager和Fragment实现顶部滑块左右滑动效果,具体参考(http://blog.csdn.net/a123demi/article/details/39480385). 而本篇博文将实例讲解利用ViewPager实现底部圆点导航左右滑动效果,以及被滑动界面实现监听事件,同时通过Fragment实现页面的切换. 对于该效果的实现,需要实现以下几个问题: 1. 底部圆点加载和实现方法? 2. 怎样实现左右滑动效果? 3. 被滑动页面,怎样实现监听事件? 4.

Android界面编程——导航栏及菜单(六)

Android界面编程--导航栏及菜单 2.7导航栏及菜单 2.7.1  ActionBar ActionBar是Android3.0(API 11)开始增加的新特性,ActionBar出现在活动窗口的顶部,可以显示标题.icon.Actions按钮.可交互View,可实现应用程序级的导航,如图2.7-1所示 图2.7-1 其中 1. App icon: 主要用于展示App的Logo,如果当前界面不是一级界面,还可以展示返回航. 2.View Control: 用于切换不同的视图或者展示非交互信

Android模拟点击的两种方式

导论 在Android中模拟一个点击事件有两种方式是通过模拟MotionEvent来实现:一种是通过ADB来实现 第一种:模拟MotionEvent 通用方法如下: private void setSimulateClick(View view, float x, float y) { long downTime = SystemClock.uptimeMillis(); final MotionEvent downEvent = MotionEvent.obtain(downTime, dow

android改动tab 导航 指示器颜色

我事实上想改动的上面的蓝色条条,改成红色. 这个问题实在是困扰我了太长时间.之前參照google的这个文章: https://developer.android.com/training/basics/actionbar/styling.html 可是事与愿违,我发现居然连我整个tab颜色都改了. 认为非常奇怪,为什么google给的方法是改动整个tab?难道google搞错了? 网上找了非常久,发现非常多人都在问这个问题,而实际解决的人非常少.偶尔有几个解决的,也是採用google的那个方法.

Android Project和app中两个build.gradle配置的区别

Android 开发也挺长时间了,从开始就使用的AndroidStudio开发,但是说下来其实自己对AS(AndroidStudio简称)还真的是不了解不深入.好吧,其实我只知道AS是一个相当强大的工具,我要学习的还有很多.  言归正传,这段时间在学习RtroLambda和ButterKnife的使用,我发现他们的导入在Project的build.gradle中引入的而不是在app的build.gradle中,这让我觉得有点郁闷,因为我才发现不太知道这两个gradle的区别,下面来总结一下. 一

Android开发者网址导航

出自干货http://www.jianshu.com/p/54902270249d文/张明云(简书作者)原文链接:http://www.jianshu.com/p/54902270249d著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 随着Android开发越来越庞大,Android的开源项目.开发资源越来越多,作为需要不断学习的程序猿,每天浏览的技术文章也是不少,但目前为止没有看到一个比较满意的Android开发者网址导航,找资料的时候很麻烦,这是我整理的自己经常浏览的开发者网

Unity3d Android SDK接入解析(二)Unity3d Android SDK的设计与两种接入方式

一.前言 上篇说清楚了Unity和Android调用的方式,但很多实际接入的部分没有讲的很详细,因为重头在这篇,会详细讲述具体接入Android SDK的方式,和怎么去做一个方便Unity接入的SDK. 传送门: 前篇:Unity3d 与 Android之间的互相调用 http://blog.csdn.net/yang8456211/article/details/51331358 后篇:Unity3d Android SDK接入解析(三)接入Android Library的理解 http://

Android开发中单元测试的两种方式

Android开发中单元测试的两种方式 一位优秀的程序员也同样不能保证自己的程序没有bug,因此编写合适的测试程序是完全有必要的,这样也会降低程序在后期出现各种奇奇怪怪bug的可能,降低维护成本,未雨绸缪将bug扼杀在摇篮之中. 看到网上有很多依旧用写java单元测试的方式在写android程序的单元测试程序--junit,当然我一直都反感将不合时宜的东西强搬到新的技术应用以获取一席之地的这种做法,不断的应用新的方法提高效率,完善程序才是真理!废话不多说,直接说到今天的重点:Android开发中

Android使用DrawerLayout创建左右两个抽屉菜单

在android support.v4 中有一个抽屉视图控件DrawerLayout.使用这个控件,可以生成通过在屏幕上水平滑动打开或者关闭菜单,能给用户一个不错的体验效果. 最近在项目中,设计中有用到这个效果,但是是左右两边都能划出这样的一个菜单效果.经过使用发现,在xml布局中和代码中,几乎是添加添加同样的代码,就可以实现这种作用两种菜单的效果. 效果图如下: 左边拉出菜单: 右边拉出菜单效果: 具体的实现方法如下,结合代码文件,跟大家分享一下: 主页布局文件: <?xml version=