一、需求
在一个页面顶部展示多图,横向轮播,也即是通俗意义的Banner。需求细节解析:
1,同一个位置,展示不同的内容,包含展示图片、标题、内容描述【内容切换】;
2,因为同一个位置展示,需要有标示,告知用户当前所在的位置;【位置标识】;
3,便于内容的全部展示且不拒绝用户的主动操作,需要自动轮播与手动滑动处理相结合;【手动自动】;
4,当前位置内容可变,需要兼容多种模式【特值处理】;
二、实现思路
实现功能,一般通过现有控件,加以事件控制而达到目标。在基本实现上,可以通过抽取组合,形成自定控件。
基本实现:
1,选择ViewPager,基本已兼容大部分功能;
2,制作定位标志,标识当前所处位置;
3,再实现定时任务,达到各个页面的自动切换;
三、具体实现
1,xml文件
2,代码实现:
/**
* banner内容显示
*/
private ViewPager bannner;
/**
* 指示图标点
*/
private List dots;
/**
* 指示图标,动态构建
*/
private View dot0;
private View dot1;
private View dot2;
private View dot3;
private View dot4;
/**
* 展示数据
*/
private List adList;
/**
* 展示View
*/
private List imageViews;
/**
* 标题
*/
private TextView title;
/**
* 内容
*/
private TextView content;
/**
* 指示标整体布局
*/
private LinearLayout dotLL;
/**
* 当前位置
*/
private int currentPos = 0;
private ScheduledExecutorService scheduledExecutorService;
/**
* 初始化数据
*/
private void initData() {
/**
* 制造数据
*/
adList = new ArrayList<>();
// dots = new ArrayList<>();
// dotLL = (LinearLayout) findViewById(R.id.dot_ll);
// dotLL.setOrientation(LinearLayout.HORIZONTAL);
// dot = View.inflate(MainActivity.this, R.layout.dot_xml, null);
for (int i = 0; i < img_list.size(); i++) {
ADInfo ad = new ADInfo();
ad.setId(i + "");
ad.setContent("我是内容" + i);
ad.setTitle("这是标题" + i);
ad.setType(1 + "");
ad.setUrl(img_list.get(i));
adList.add(ad);
// dotLL.addView(dot);
}
}
/**
* 初始化控件
*/
private void initView1() {
title = (TextView) findViewById(R.id.tv_title);
dot0 = findViewById(R.id.v_dot0);
dot1 = findViewById(R.id.v_dot1);
dot2 = findViewById(R.id.v_dot2);
dot3 = findViewById(R.id.v_dot3);
dot4 = findViewById(R.id.v_dot4);
dots = new ArrayList<>();
dots.add(dot0);
dots.add(dot1);
dots.add(dot2);
dots.add(dot3);
dots.add(dot4);
for (int i = 0; i < adList.size(); i++) {
dots.get(i).setVisibility(View.VISIBLE);
}
/**
* 默认值
*/
dots.get(0).setBackgroundResource(R.mipmap.icon_point_pre);
content = (TextView) findViewById(R.id.tv_topic);
bannner = (ViewPager) findViewById(R.id.vp);
bannner.setAdapter(new MyAdapter());
bannner.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
int oldPos = 0;
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
currentPos = position;
ADInfo ad = adList.get(position);
title.setText(ad.getTitle());
content.setText(ad.getContent());
dots.get(position).setBackgroundResource(R.mipmap.icon_point_pre);
dots.get(oldPos).setBackgroundResource(R.mipmap.icon_point);
oldPos = position;
// setContentView(imageViews.get(position));
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
}
/**
* 刷新页面数据
*/
private void initPageView() {
imageViews = new ArrayList<>();
for (int i = 0; i < adList.size(); i++) {
// 加载图片
ImageView imageView = ViewFactory.getImageView(MainActivity.this, adList.get(i).getUrl());
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
imageViews.add(imageView);
}
}
/**
* 添加定时任务,动态更新页面
*/
private Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
bannner.setCurrentItem(currentPos);
}
};
Timer timer = new Timer();
TimerTask task = new TimerTask() {
@Override
public void run() {
synchronized (bannner) {
currentPos = (currentPos + 1) % imageViews.size();
handler.obtainMessage().sendToTarget();
}
}
};
private void startAd() {
scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
// 执行定时任务
scheduledExecutorService.scheduleAtFixedRate(new ScrollTask(), 1, 2,
TimeUnit.SECONDS);
}
private class ScrollTask implements Runnable {
@Override
public void run() {
synchronized (bannner) {
currentPos = (currentPos + 1) % imageViews.size();
handler.obtainMessage().sendToTarget();
}
}
}
private class MyAdapter extends PagerAdapter {
@Override
public int getCount() {
return adList.size();
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
ImageView iv = imageViews.get(position);
((ViewPager) container).addView(iv);
final ADInfo adinfo = adList.get(position);
/**
* 添加Item点击事件
*/
iv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, adinfo.getTitle(), Toast.LENGTH_SHORT).show();
}
});
return iv;
}
@Override
public void destroyItem(View arg0, int arg1, Object arg2) {
((ViewPager) arg0).removeView((View) arg2);
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}
@Override
public void restoreState(Parcelable arg0, ClassLoader arg1) {
}
@Override
public Parcelable saveState() {
return null;
}
@Override
public void startUpdate(View arg0) {
}
@Override
public void finishUpdate(View arg0) {
}
}
@Override
protected void onStop() {
super.onStop();
if (timer != null) {
timer.cancel();
timer = null;
}
}
onCreate()调用:
initData();
initView1();
initPageView();
// startAd();
timer.schedule(task, 2000, 2000);
initData()://初始化数据,包含有每个页面的ID、标题、内容、图片,甚至于跳转链接等;
initView1()://初始化页面View,ViewPager、知识图标等;
initPageView()://填充数据,页面展示;
四、实现效果
有故事有啤酒还有代码:
我希望你能重梳婵鬓美扫蛾眉,沿途美丽下去 ,就像我第一次遇到你的那样。
我祝福你遇到一个对的人,恋爱、结婚、生两个孩子,就像我们从前计划的那样。
好姑娘,遗憾我不能陪着你了。
转过身,只剩一捧没你好看的傻月亮, 月光和你一样凉。
便是当我走了,不管走的多远,
我也会记着,
把手上的温暖给那月亮留下。