1、定义广告条的xml文件
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.viewpager.widget.ViewPager
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/vppager"/>
<RadioGroup
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingBottom="2dp"
android:orientation="horizontal"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:id="@+id/rgpager"/>
</RelativeLayout>
2、在对应的类文件中,加载视图,数据等
public class BannerPager extends RelativeLayout implements View.OnClickListener {
private static final String TAG = "BannerPager";
private Context mContext; // 声明一个上下文对象
private ViewPager vp_banner; // 声明一个翻页视图对象
private RadioGroup rg_indicator; // 声明一个单选组对象
private List<ImageView> mViewList = new ArrayList<ImageView>(); // 声明一个图像视图列表
private int mInterval = 2000; // 轮播的时间间隔,单位毫秒
/**
*加载视图
*/
public BannerPager(Context context) {
this(context, null);
}
public BannerPager(Context context, AttributeSet attrs) {
super(context, attrs);
mContext = context;
initView(); // 初始化视图
}
// 初始化视图
private void initView() {
// 根据布局文件banner_pager.xml生成视图对象
View view = LayoutInflater.from(mContext).inflate(R.layout.banner_pager, null);
// 从布局文件中获取名叫vp_banner的翻页视图
vp_banner = view.findViewById(R.id.vppager);
// 从布局文件中获取名叫rg_indicator的单选组
rg_indicator = view.findViewById(R.id.rgpager);
addView(view); // 将该布局视图添加到广告轮播条
}
// 开始广告轮播
public void start() {
mHandler.postDelayed(mScroll, mInterval); // 延迟若干秒后启动滚动任务
}
// 停止广告轮播
public void stop() {
mHandler.removeCallbacks(mScroll); // 移除滚动任务
}
// 设置广告轮播的时间间隔
public void setInterval(int interval) {
mInterval = interval;
}
/**
*加载数据,并定义翻页适配器
*/
// 设置广告图片列表
public void setImage(List<Integer> imageList) {
int dip_15 = Utils.dip2px(mContext, 15);
// 根据图片列表生成图像视图列表
for (int i = 0; i < imageList.size(); i++) {
Integer imageResId = imageList.get(i); // 获取图片的资源编号
ImageView iv = new ImageView(mContext); // 创建一个图像视图对象
iv.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
iv.setScaleType(ImageView.ScaleType.FIT_XY);
iv.setImageResource(imageResId); // 设置图像视图的资源图片
iv.setOnClickListener(this);
mViewList.add(iv); // 往视图列表添加新的图像视图
}
// 设置翻页视图的图像适配器
vp_banner.setAdapter(new ImageAdapater());
// 给翻页视图添加简单的页面变更监听器,此时只需重写onPageSelected方法
vp_banner.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
setSelectedButton(position); // 高亮显示该位置的指示按钮
}
});
// 根据图片列表生成指示按钮列表
for (int i = 0; i < imageList.size(); i++) {
RadioButton radio = new RadioButton(mContext); // 创建一个单选按钮对象
radio.setLayoutParams(new RadioGroup.LayoutParams(dip_15, dip_15));
radio.setButtonDrawable(R.drawable.indicator_selector); // 设置单选按钮的资源图片
rg_indicator.addView(radio); // 往单选组添加新的单选按钮
}
vp_banner.setCurrentItem(0); // 设置翻页视图显示第一页
setSelectedButton(0); // 默认高亮显示第一个指示按钮
}
// 定义一个图像翻页适配器
private class ImageAdapater extends PagerAdapter {
// 获取页面项的个数
public int getCount() {
return mViewList.size();
}
// 判断当前视图是否来自指定对象
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
// 从容器中销毁指定位置的页面
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(mViewList.get(position));
}
// 实例化指定位置的页面,并将其添加到容器中
public Object instantiateItem(ViewGroup container, int position) {
container.addView(mViewList.get(position));
return mViewList.get(position);
}
}
// 设置选中单选组内部的哪个单选按钮
private void setSelectedButton(int position) {
((RadioButton) rg_indicator.getChildAt(position)).setChecked(true);
}
/**
* 设置广告条的自动轮播功能
*/
private Handler mHandler = new Handler(Looper.myLooper()); // 声明一个处理器对象
// 定义一个广告滚动任务
private Runnable mScroll = new Runnable() {
@Override
public void run() {
int index = vp_banner.getCurrentItem() + 1; // 获得下一张广告图的位置
if (index >= mViewList.size()) { // 已经到末尾了,准备重头开始
index = 0;
}
vp_banner.setCurrentItem(index); // 设置翻页视图显示第几页
mHandler.postDelayed(this, mInterval); // 延迟若干秒后继续启动滚动任务
}
};
/**
*设置点击事件
*/
@Override
public void onClick(View v) {
int position = vp_banner.getCurrentItem(); // 获取翻页视图当前页面项的序号
mListener.onBannerClick(position); // 触发点击监听器的onBannerClick方法
}
// 设置广告图的点击监听器
public void setOnBannerListener(BannerClickListener listener) {
mListener = listener;
}
// 声明一个广告图点击的监听器对象
private BannerClickListener mListener;
// 定义一个广告图片的点击监听器接口
public interface BannerClickListener {
void onBannerClick(int position);
}
}
3、在活动页面中使用广告条控件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical">
<com.example.eightapp.BannerPager
android:layout_width="match_parent"
android:layout_height="360dp"
android:id="@+id/bppager"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/tv_pager"/>
</LinearLayout>
public class MainActivity extends AppCompatActivity implements BannerPager.BannerClickListener {
private static final String TAG = "MainActivity";
private TextView tv_pager; // 声明一个文本视图对象
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_pager = findViewById(R.id.tv_pager);
// 从布局文件中获取名叫banner_pager的广告轮播条
BannerPager banner = findViewById(R.id.bppager);
// 获取广告轮播条的布局参数
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) banner.getLayoutParams();
params.height = (int) (Utils.getScreenWidth(this) * 250f / 640f);
banner.setLayoutParams(params); // 设置广告轮播条的布局参数
banner.setImage(getImageList()); // 设置广告轮播条的广告图片列表
banner.setOnBannerListener(this); // 设置广告轮播条的广告点击监听器
banner.start(); // 开始广告图片的轮播滚动
}
private List<Integer> getImageList() {
ArrayList<Integer> imageList = new ArrayList<Integer>();
imageList.add(R.drawable.banner_1);
imageList.add(R.drawable.banner_2);
imageList.add(R.drawable.banner_3);
imageList.add(R.drawable.banner_4);
imageList.add(R.drawable.banner_5);
return imageList; // 返回默认的广告图片列表
}
// 一旦点击了广告图,就回调监听器的onBannerClick方法
public void onBannerClick(int position) {
String desc = String.format("您点击了第%d张图片", position + 1);
tv_pager.setText(desc);
}
}
public class Utils {
// 根据手机的分辨率从 dp 的单位 转成为 px(像素)
public static int dip2px(Context context, float dpValue) {
// 获取当前手机的像素密度(1个dp对应几个px)
float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f); // 四舍五入取整
}
// 根据手机的分辨率从 px(像素) 的单位 转成为 dp
public static int px2dip(Context context, float pxValue) {
// 获取当前手机的像素密度(1个dp对应几个px)
float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f); // 四舍五入取整
}
// 根据手机的分辨率从 sp 的单位 转成为 px(像素)
public static int sp2px(Context context, float spValue) {
// 获取当前手机的像素密度(1个dp对应几个px)
float scale = context.getResources().getDisplayMetrics().density;
return (int) (spValue * scale + 0.5f); // 四舍五入取整
}
// 根据手机的分辨率从 px(像素) 的单位 转成为 sp
public static int px2sp(Context context, float pxValue) {
// 获取当前手机的像素密度(1个dp对应几个px)
float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f); // 四舍五入取整
}
// 获得屏幕的宽度
public static int getScreenWidth(Context ctx) {
int screenWidth;
// 从系统服务中获取窗口管理器
WindowManager wm = (WindowManager) ctx.getSystemService(Context.WINDOW_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
// 获取当前屏幕的四周边界
Rect rect = wm.getCurrentWindowMetrics().getBounds();
screenWidth = rect.width();
} else {
DisplayMetrics dm = new DisplayMetrics();
// 从默认显示器中获取显示参数保存到dm对象中
wm.getDefaultDisplay().getMetrics(dm);
screenWidth = dm.widthPixels;
}
return screenWidth; // 返回屏幕的宽度数值
}
// 获得屏幕的高度
public static int getScreenHeight(Context ctx) {
int screenHeight;
// 从系统服务中获取窗口管理器
WindowManager wm = (WindowManager) ctx.getSystemService(Context.WINDOW_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
// 获取当前屏幕的四周边界
Rect rect = wm.getCurrentWindowMetrics().getBounds();
screenHeight = rect.height();
} else {
DisplayMetrics dm = new DisplayMetrics();
// 从默认显示器中获取显示参数保存到dm对象中
wm.getDefaultDisplay().getMetrics(dm);
screenHeight = dm.heightPixels;
}
return screenHeight; // 返回屏幕的高度数值
}
}