android ViewPager(广告条)

1,实现效果 

 

viewPager实现效果 ,handler实现轮播。 小圆点自己绘制

 

2,实现逻辑

【1】布局声明 

<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" >

    <android.support.v4.view.ViewPager

        android:id="@+id/vp"

        android:layout_width="match_parent"

        android:layout_height="180dp" >

    </android.support.v4.view.ViewPager>



</RelativeLayout>

 

【2】获取控件,初始化数据,创建适配器

  • 获取控件

vp = (ViewPager) findViewById(R.id.vp);

  • 初始化数据 ,数据的内容是一个ImageView  

    private int[] imageResIds = {R.drawable.icon_1, R.drawable.icon_2, R.drawable.icon_3,

            R.drawable.icon_4, R.drawable.icon_5};



    //初始化viewpager的数据

    private void initVpData() {

        ivs = new ArrayList<ImageView>();

        for (int i = 0; i < imageResIds.length; i++) {

            ImageView iv = new ImageView(this);

            //[1]给iv设置背景图片

            iv.setBackgroundResource(imageResIds[i]);

            //[2]把iv加入到集合

            ivs.add(iv);

        }

    }
  • 创建适配器

instantiateItem 预加载第二个页面,isViewFromObject多次判断  destroyItem移除用不到的方法

    //创建viewpager需要的适配器  

  class MyPagerAdapter extends PagerAdapter{





        //展示viewpager条目的数量

        @Override

        public int getCount() {

            return ivs.sice();

        }





        /**

         * Object:就是在instantiateItem方法里面返回的内容

         */

        @Override

        public boolean isViewFromObject(View view, Object object) {

            return view == object;

        }

        

        /**

         * 初始化条目的内容  类似lsitview getView方法

         * container:就是viewPager

         * position:每个页面的对应的位置

         */

        @Override

        public Object instantiateItem(ViewGroup container, int position) {

            position = position % ivs.size();

            //[1]根据位置 去集合里面取数据

            ImageView iv = ivs.get(position);

            //[2]获取到每个iv后加入到viewpager中

            container.addView(iv);

            return iv;

        }

        /**

         * 移除不用到页面

         * container:viewPager

         * object:就是instantiateItem方法里面的返回值

         */

        @Override

        public void destroyItem(ViewGroup container, int position, Object object) {

            container.removeView((View) object);

        }

    }

创建

 

滑动第二个先进行销毁,在初始化一个

 

【3】添加小圆点

  • 添加圆点存放的位置

<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" >

    <android.support.v4.view.ViewPager

        android:id="@+id/vp"

        android:layout_width="match_parent"

        android:layout_height="180dp" >

    </android.support.v4.view.ViewPager>



    <LinearLayout

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:layout_alignBottom="@id/vp"

        android:background="#66000000"

        android:gravity="center_horizontal"

        android:orientation="vertical"

        android:paddingBottom="5dp"

        android:paddingTop="5dp" >

        <TextView

            android:id="@+id/tv_content"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:text="我是小圆点对应的内容"

            android:textColor="#ffffff"

            android:textSize="17sp" />

        <!-- 动态的往布局里面添加小圆点 -->

        <LinearLayout

            android:id="@+id/ll_layout"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:layout_marginTop="4dp"

            android:orientation="horizontal" >

            <!-- <View

                android:layout_width="5dp"

                android:layout_height="5dp"

                android:background="@drawable/dot_selector" /> -->

        </LinearLayout>

    </LinearLayout>

</RelativeLayout>
  • 初始化UI 初始化小圆点的数据

private String[] descs = {"为梦想坚持", "大傻吊", "傻吊", "Google/IO", "灌灌灌灌"};

        LayoutParams 你要存放在那个布局就导入对应的包

//初始化小圆点的数据

    private void initDotdata() {

        dotLists = new ArrayList<View>();

        for (int i = 0; i < descs.length; i++) {

            //[1]初始化小圆点的view

            View dotView = new View(getApplicationContext());

            //[2]设置dotView宽和高

            LayoutParams params = new LayoutParams(5, 5);

            //[3]让小圆点之间有点距离

            if (i!=0) {

                params.leftMargin = 7;

            }

            dotView.setLayoutParams(params);

            dotView.setBackgroundResource(R.drawable.dot_selector);

            

            //[4]把dotview加入到水平的线性布局里

            ll_layout.addView(dotView);

            //[5]把dotview加入到集合

            dotLists.add(dotView);

        }

    }
  • viewPager 设置监听 

//初始化ui 

   private void initUI() {

        vp = (ViewPager) findViewById(R.id.vp);

        tv_content = (TextView) findViewById(R.id.tv_content);

        ll_layout = (LinearLayout) findViewById(R.id.ll_layout);

        //[2]viewpager展示数据的原理和listview一样 需要适配器  (pagerAdapter)  把集合里目的数据展示到viewpager里

        vp.setAdapter(new MyPagerAdapter());

        //[3]给viewpager设置滑动监听

        vp.setOnPageChangeListener(listener);

    }
  • 提取出监听的方法

//代表viewpager的监听

    OnPageChangeListener listener = new OnPageChangeListener() {

        //当一个新的页面被选中的时候调用

        @Override

        public void onPageSelected(int position) {

            position = position % ivs.size();

            changeDotstateAndText(position);

            

        }

        

        //当页面开始滚动

        @Override

        public void onPageScrolled(int position, float positionOffset,

                int positionOffsetPixels) {

            

        }

        //当滑动页面的状态改变的时候调用

        @Override

        public void onPageScrollStateChanged(int state) {

            

        }

    };

改小圆点状态和文本内容

  •  
  • 定义一个View 代表被选中的点

/**代表选中的点**/

    private View currentDotView;

/**改变小圆点的状态和对应文本的内容**/  

  private void changeDotstateAndText(int position) {

        //[1]动态改变小圆点的文本内容  数据在哪里存着就去哪里取

        tv_content.setText(descs[position]);

        

        if (currentDotView!=null) {

            currentDotView.setSelected(false);

        }

        //[2]更新小圆点的状态  小圆点在集合里面存着

        dotLists.get(position).setSelected(true);

        

        //[3]把dotLists.get(position)赋值给currentDotView

        currentDotView = dotLists.get(position);

    }

第一个被选中的初始化

  •  

//[4]初始化设置小圆点对应文本的内容和小圆点的状态  一定要保证集合初始化在更新小圆点的状态

        changeDotstateAndText(0);

 

【4】实现无线轮播

  • 定义轮播的次数

private int vpMaxSize = 1000000 * imageResIds.length;

  • 适配器

 

   //创建viewpager需要的适配器

    class MyPagerAdapter extends PagerAdapter{





        //展示viewpager条目的数量

        @Override

        public int getCount() {

            return vpMaxSize;

        }



        /**

         * 初始化条目的内容  类似lsitview getView方法

         * container:就是viewPager

         * position:每个页面的对应的位置

         */

        @Override

        public Object instantiateItem(ViewGroup container, int position) {

            position = position % ivs.size();

            //[1]根据位置 去集合里面取数据

            ImageView iv = ivs.get(position);

            //[2]获取到每个iv后加入到viewpager中

            container.addView(iv);

            return iv;

        }

        

    }
  • 监听中onPageSelected改变position的值

    position = position % ivs.size();

  • onStart开启循环

//当界面可见的时候执行

    @Override

    protected void onStart() {

        //4秒钟后 显示下一个页面的内容

//        handler.sendEmptyMessageDelayed(10, 4000);

        super.onStart();

    }

  • 更改图片文字

//创建handler对象

    private Handler handler = new Handler(){

        //处理消息

        public void handleMessage(android.os.Message msg) {

            //显示viewpager下个页面的内容

            vp.setCurrentItem(vp.getCurrentItem()+1);

            handler.sendEmptyMessageDelayed(10, 4000);

        };

    };

    

  • 关闭轮播

//当界面不可见的是 移除消息

    @Override

    protected void onStop(){

        handler.removeMessages(10);

        

        super.onStop();

    }

 

3,全部代码

package com.xiaoshuai.www.ad;





import android.app.Activity;

import android.os.Bundle;

import android.os.Handler;

import android.support.v4.view.PagerAdapter;

import android.support.v4.view.ViewPager;

import android.support.v4.view.ViewPager.OnPageChangeListener;

import android.view.View;

import android.view.ViewGroup;

import android.widget.ImageView;

import android.widget.LinearLayout;

import android.widget.LinearLayout.LayoutParams;

import android.widget.TextView;





import java.util.ArrayList;

import java.util.List;





public class MainActivity extends Activity {





    private int[] imageResIds = {R.drawable.icon_1, R.drawable.icon_2, R.drawable.icon_3,

            R.drawable.icon_4, R.drawable.icon_5};

    private String[] descs = {"为梦想坚持", "哈哈哈哈", "哈哈哈哈", "Google/IO", "哈哈哈哈哈哈"};

    //代表viewpger数据集合

    private List<ImageView> ivs;

    //代表小圆点的集合

    private List<View> dotLists;

    private LinearLayout ll_layout;

    private TextView tv_content;

    /**代表选中的点**/

    private View currentDotView;

    private int vpMaxSize = 1000000 * imageResIds.length;





    //创建handler对象

    private Handler handler = new Handler(){

        //处理消息

        public void handleMessage(android.os.Message msg) {

            //显示viewpager下个页面的内容

            vp.setCurrentItem(vp.getCurrentItem()+1);

            handler.sendEmptyMessageDelayed(10, 4000);

        };

    };









    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);





        initVpData();

        //[1]找到控件

        initUI();

        //[2]初始化小圆点的数据

        initDotdata();

        //[4]初始化设置小圆点对应文本的内容和小圆点的状态  一定要保证集合初始化在更新小圆点的状态

        changeDotstateAndText(0);

        vp.setCurrentItem(vpMaxSize/2);









    }









    //当界面可见的时候执行

    @Override

    protected void onStart() {

        //4秒钟后 显示下一个页面的内容

      handler.sendEmptyMessageDelayed(10, 4000);

        super.onStart();

    }





    //当界面不可见的是 移除消息

    @Override

    protected void onStop(){

        handler.removeMessages(10);





        super.onStop();

    }





    //初始化小圆点的数据

    private void initDotdata() {

        dotLists = new ArrayList<View>();

        for (int i = 0; i < descs.length; i++) {

            //[1]初始化小圆点的view

            View dotView = new View(getApplicationContext());

            //[2]设置dotView宽和高

            LayoutParams params = new LayoutParams(5, 5);

            //[3]让小圆点之间有点距离

            if (i!=0) {

                params.leftMargin = 7;

            }

            dotView.setLayoutParams(params);

            dotView.setBackgroundResource(R.drawable.dot_selector);





            //[4]把dotview加入到水平的线性布局里

            ll_layout.addView(dotView);

            //[5]把dotview加入到集合

            dotLists.add(dotView);





        }

    }





    //初始化ui

    private void initUI() {

        vp = (ViewPager) findViewById(R.id.am_vp);

        tv_content = (TextView) findViewById(R.id.tv_content);

        ll_layout = (LinearLayout) findViewById(R.id.ll_layout);

        //[2]viewpager展示数据的原理和listview一样 需要适配器  (pagerAdapter)  把集合里目的数据展示到viewpager里

        vp.setAdapter(new MyPagerAdapter());

        //[3]给viewpager设置滑动监听

        vp.setOnPageChangeListener(listener);













    }





    //初始化viewpager的数据

    private void initVpData() {

        ivs = new ArrayList<ImageView>();

        for (int i = 0; i < imageResIds.length; i++) {

            ImageView iv = new ImageView(this);

            //[1]给iv设置背景图片

            iv.setBackgroundResource(imageResIds[i]);

            //[2]把iv加入到集合

            ivs.add(iv);

        }

    }





    //创建viewpager需要的适配器

    class MyPagerAdapter extends PagerAdapter{





        //展示viewpager条目的数量

        @Override

        public int getCount() {

            return vpMaxSize;

        }





        /**

         * Object:就是在instantiateItem方法里面返回的内容

         */

        @Override

        public boolean isViewFromObject(View view, Object object) {

            return view == object;

        }





        /**

         * 初始化条目的内容  类似lsitview getView方法

         * container:就是viewPager

         * position:每个页面的对应的位置

         */

        @Override

        public Object instantiateItem(ViewGroup container, int position) {

            position = position % ivs.size();

            //[1]根据位置 去集合里面取数据

            ImageView iv = ivs.get(position);

            //[2]获取到每个iv后加入到viewpager中

            container.addView(iv);

            return iv;

        }





        /**

         * 移除不用到页面

         * container:viewPager

         * object:就是instantiateItem方法里面的返回值

         */

        @Override

        public void destroyItem(ViewGroup container, int position, Object object) {

            container.removeView((View) object);

        }









    }





    /**改变小圆点的状态和对应文本的内容**/

    private void changeDotstateAndText(int position) {

        //[1]动态改变小圆点的文本内容  数据在哪里存着就去哪里取

        tv_content.setText(descs[position]);





        if (currentDotView!=null) {

            currentDotView.setSelected(false);

        }

        //[2]更新小圆点的状态  小圆点在集合里面存着

        dotLists.get(position).setSelected(true);





        //[3]把dotLists.get(position)赋值给currentDotView

        currentDotView = dotLists.get(position);

    }





    //代表viewpager的监听

    OnPageChangeListener listener = new OnPageChangeListener() {

        //当一个新的页面被选中的时候调用

        @Override

        public void onPageSelected(int position) {

            position = position % ivs.size();

            changeDotstateAndText(position);





        }





        //当页面开始滚动

        @Override

        public void onPageScrolled(int position, float positionOffset,

                                   int positionOffsetPixels) {





        }

        //当滑动页面的状态改变的时候调用

        @Override

        public void onPageScrollStateChanged(int state) {





        }

    };

    private ViewPager vp;

















}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

兴帅_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值