轮播图带加点,带时间自动轮播加手动轮播

效果图:

布局分析:

<?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_main"
android:layout_width="match_parent" android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="etest.ll.com.mybanner.MainActivity">

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

</android.support.v4.view.ViewPager>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="35dp"
android:layout_gravity="bottom"
android:background="#33000000"
android:gravity="center"
android:orientation="vertical">
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@android:color/white"
android:text="图片标题"/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="3dp"
android:orientation="horizontal"
>
<View
android:id="@+id/dot_0"
android:layout_width="5dp"
android:layout_height="5dp"
android:layout_marginLeft="2dp"
android:layout_marginRight="2dp"
android:background="@drawable/dot_normal"/>
<View
android:id="@+id/dot_1"
android:layout_width="5dp"
android:layout_height="5dp"
android:layout_marginLeft="2dp"
android:layout_marginRight="2dp"
android:background="@drawable/dot_normal"/>
<View
android:id="@+id/dot_2"
android:layout_width="5dp"
android:layout_height="5dp"
android:layout_marginLeft="2dp"
android:layout_marginRight="2dp"
android:background="@drawable/dot_normal"/>
<View
android:id="@+id/dot_3"
android:layout_width="5dp"
android:layout_height="5dp"
android:layout_marginLeft="2dp"
android:layout_marginRight="2dp"
android:background="@drawable/dot_normal"/>
</LinearLayout>
</LinearLayout>
</FrameLayout>
</RelativeLayout>

========================================

===============================

activity中:

线程池,用来定时轮播,

package etest.ll.com.mybanner;

import android.os.Handler;
import android.os.Message;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;


public class MainActivity extends AppCompatActivity {
private ViewPager mPager;
private ViewPagerAdapter mAdapter;
private List<ImageView> imageVeiws;//存放图片的集合
//存放文字描述的集合
private String[] titles=new String[]{"丽丽1","叫我索大人", "德芙", "我曾经很瘦"};
private List<View> dots;
private TextView title;//图片的标题
private int[] imageIds=new int[]{
R.drawable.bb,
R.drawable.cc,
R.drawable.dd,
R.drawable.ee
};
//记录上一个点的位置
private int oldPosition=0;
private int currentItem;
private ScheduledExecutorService scheduledExecutorService;//线程池,用来定时轮播
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mPager= (ViewPager) findViewById(R.id.vp);
imageVeiws=new ArrayList<>();
for (int i = 0; i <imageIds.length ; i++) {
ImageView imageView=new ImageView(this);
imageView.setBackgroundResource(imageIds[i]);
imageVeiws.add(imageView);

}
//显示小点的集合
dots = new ArrayList<>();
dots.add(findViewById(R.id.dot_0));//单行复制 ctrl + d
dots.add(findViewById(R.id.dot_1));//单行复制 ctrl + d
dots.add(findViewById(R.id.dot_2));//单行复制 ctrl + d
dots.add(findViewById(R.id.dot_3));//单行复制 ctrl + d
dots.get(0).setBackgroundResource(R.drawable.dot_focesed);//刚进来默认显示的点

title = (TextView) findViewById(R.id.tv);//显示图片标题
title.setText(titles[0]);

mAdapter = new ViewPagerAdapter();
mPager.setAdapter(mAdapter);

mPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

}

@Override
public void onPageSelected(int position) {
//标题的改变
title.setText(titles[position]);
//小点的改变
dots.get(position).setBackgroundResource(R.drawable.dot_focesed);
dots.get(oldPosition).setBackgroundResource(R.drawable.dot_normal);
oldPosition=position;//再次改变时候,当前position即为老的position
currentItem=position;//用于当用户手动滑动轮播图处理
}

@Override
public void onPageScrollStateChanged(int state) {

}
});
}

@Override
protected void onStart() {
super.onStart();
//开启一个单独的后台线程
scheduledExecutorService= Executors.newSingleThreadScheduledExecutor();

//给线程添加一个定时的调度任务
// Runnable command,
// long initialDelay,
// long delay,
// TimeUnit unit
//参数说明:延迟initialDelay时间后,开始执行command。
//并且按照delay时间周期性重复调用
//TimeUnit用来定义时间单位
scheduledExecutorService.scheduleWithFixedDelay(new ViewPagerTask(),2,2, TimeUnit.SECONDS);
}
private class ViewPagerTask implements Runnable{

@Override
public void run() {
//确定ViewPager跳转到哪个页面
//使用取余德方式来确定
currentItem=(currentItem+1)%imageIds.length;
mhandler.sendEmptyMessage(0);//只是为了调用ui更新,发一个空消息
}
}
private Handler mhandler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
//更新viewpager当前显示的pager
mPager.setCurrentItem(currentItem);
}
};

private class ViewPagerAdapter extends PagerAdapter{
//获取当前窗体界面的数量
@Override
public int getCount() {
return imageVeiws.size();
}
//用于判断是否有对象生成的界面

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

@Override //return一个对象,这个对象表明了pagerAdapter适配器选择哪个对象放入当前的viewPager中
public Object instantiateItem(ViewGroup container, int position) {
container.addView(imageVeiws.get(position));
return imageVeiws.get(position);
}
//从Viewgroup中移除当前的view
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(imageVeiws.get(position));
}
}
}

原文地址:https://www.cnblogs.com/ll-ouyang/p/6476821.html