android-ViewPager的轮播

viewpager的轮播实现需要
1、定时切换:每隔一定时间自动播放,也支持手动切换
2、无限播放:最后一张切到第一张重新播放

第一步:主界面布局

activity_main.xml

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

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

    <!-- layout_alignBottom与below 的区别:在布局《里》下面 和 在布局 下面
    layout_alignBottom:与布局底部对齐
    below在布局的下方
    -->

    <LinearLayout
        android:id="@+id/layout_container"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/viewpager"
        android:background="#33000000"
        android:orientation="vertical">

        <TextView
            android:id="@+id/tv_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal" />

        <!--//放置点的布局-->
        <LinearLayout
            android:id="@+id/layout_points"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center_horizontal"
            android:orientation="horizontal" />
    </LinearLayout>

</RelativeLayout>

2、代码实现

package com.example.administrator.viewpagerdemo;

import android.os.Handler;
import android.os.SystemClock;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private ViewPager viewpager;
    private TextView textview;// 标题容器
    private LinearLayout layout_points;// 标题和圆点布局

    private String[] titles;// 标题资源
    // 初始化数据源(内容为空),不然空指针异常
    private List<ImageView> list = new ArrayList<ImageView>();

    private int[] imgIds = {R.drawable.a, R.drawable.b, R.drawable.c,
            R.drawable.d, R.drawable.e};// 图片资源

    private int prePosition;// 标识前一个点的位置

    private boolean isLoop = true;

    private Handler handler = new Handler() {
        public void handleMessage(android.os.Message msg) {
            switch (msg.what) {
                case 0:
                    // 得到viewpage中当前的索引
                    int currentItem = viewpager.getCurrentItem();
                    viewpager.setCurrentItem(currentItem + 1);
                    break;
                default:
                    break;
            }
        }

        ;
    };

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

        viewpager = (ViewPager) this.findViewById(R.id.viewpager);
        textview = (TextView) this.findViewById(R.id.tv_title);
        // 注意布局别找错了
        layout_points = (LinearLayout) this.findViewById(R.id.layout_points);

        titles = getResources().getStringArray(R.array.titleName);    //来自value的数组值

        // 初始化“点” ,List<Images>
        for (int i = 0; i < imgIds.length; i++) {
            ImageView imgview = new ImageView(this);
            imgview.setBackgroundResource(imgIds[i]);
            imgview.setScaleType(ImageView.ScaleType.CENTER_INSIDE);

            list.add(imgview);
            // 实例化‘点’
            View view = new View(this);
            // 默认全部不选中(灰色)
            view.setBackgroundResource(R.drawable.dot_normal);
            // 定义宽和高参数
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                    15, 15);
            // 点与点之间有间隙
            params.leftMargin = 5;
            view.setLayoutParams(params);

            // 存放到容器中
            layout_points.addView(view);
        }
        // 设置第一页显示的标题
        textview.setText(titles[0]);
        // 设置第一页相应的圆点的选中状态
        layout_points.getChildAt(0)
                .setBackgroundResource(R.drawable.dot_focused);

        MyPagerAdapter adapter = new MyPagerAdapter(list);
        viewpager.setAdapter(adapter);

        viewpager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

            @Override    //页面切换调用
            public void onPageSelected(int position) {
                textview.setText(titles[position % list.size()]);          //实现两头滑动步骤三

                // 设置前一个点的背景图
                layout_points.getChildAt(prePosition).setBackgroundResource(R.drawable.dot_normal);
                // 当前位置的点被选中
                layout_points.getChildAt(position % list.size()).setBackgroundResource(R.drawable.dot_focused);
                // 准备前一个点的位置的值
                prePosition = position % list.size();              //实现两头滑动步骤四
            }

            @Override    //滚动偏移
            public void onPageScrolled(int arg0, float arg1, int arg2) {
            }

            @Override    //滑动状态改变调用
            public void onPageScrollStateChanged(int arg0) {
            }
        });

        // 开辟线程:定时器
        new Thread(new Runnable() {

            @Override
            public void run() {
                while (isLoop) {
                    SystemClock.sleep(3000);
                    // 通知主线程更新图片
                    handler.sendEmptyMessage(0);
                }
            }
        }).start();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        isLoop = false;
    }


}

适配器

package com.example.administrator.viewpagerdemo;

import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

import java.util.List;

/**
 * Created by Administrator on 2017/6/13.
 */

public class MyPagerAdapter extends PagerAdapter {

    private List<ImageView> list;

    public MyPagerAdapter(List<ImageView> list) {
        this.list = list;
    }

    @Override
    public int getCount() {
        // 实现两头无线滑动
        return Integer.MAX_VALUE;        //实现两头滑动步骤一
    }

    @Override
    public boolean isViewFromObject(View arg0, Object arg1) {
        return arg0 == arg1;
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {      //实现两头滑动步骤二
        // position有可能无限大,所以要取模
        View view = this.list.get(position % list.size());
        container.addView(view);
        return view;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        View view = this.list.get(position % list.size());            //实现两头滑动步骤
        container.removeView(view);
    }

}

点的背景:

drawable/dot_focused.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="oval">
    <corners android:radius="5dip"/>
    <solid android:color="#55000000"/>
</shape>

drawable/dot_normal.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="oval">
    <corners android:radius="5dip"/>
    <solid android:color="#aaFFFFFF"/>
</shape>

values/arrays.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string-array name="titleName">
        <item>我是一个兵</item>
        <item>列出安装的应用程序</item>
        <item>把我们的应用程序作为home</item>
        <item>通过PackageManager的api 查询已经安装的apk</item>
        <item>监听GridView的onItemClick事件</item>
    </string-array>

</resources>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值