本demo主要是属于自定义View的内容,在ViewPager控件进行拓展,配合相应的动画和逻辑实现广告切换的效果。
一、效果动画
二、代码解析
1、图片滑动控件(ViewPager)
Android原生控件ViewPager可以实现图片切换的效果
<?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="com.project.codingma.carouseladvertising.MainActivity">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="160dp">
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_alignParentBottom="true"
android:background="#66000000"
android:gravity="center_horizontal"
android:orientation="vertical"
android:padding="5dp">
<TextView
android:id="@+id/des"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxLines="1"
android:text="天王盖地虎, 天王盖地虎, 天王盖地虎,"
android:textColor="@android:color/white" />
<LinearLayout
android:id="@+id/ll_point_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:orientation="horizontal" />
</LinearLayout>
</RelativeLayout>
</RelativeLayout>
2、对应并绑定好相关控件,控制器
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
initView();
initData();
initAdapter();
}
/**
* 适配器
*/
private void initAdapter() {
llPointContainer.getChildAt(0).setEnabled(true);
tvDes.setText(contentDescs[0]);
previousSelectedPosition = 0;
viewPager.setAdapter(new MyAdapter());
}
/**
* 初始化数据,包括ViewPager中的图片和文字
*/
private void initData() {
//图片数组
imageIds =new int[]{
R.drawable.a,
R.drawable.b,
R.drawable.c,
R.drawable.d,
R.drawable.e
};
contentDescs = new String[]{
"巩俐不低俗,我就不能低俗",
"扑树又回来啦!再唱经典老歌引万人大合唱",
"揭秘北京电影如何升级",
"乐视网TV版大派送",
"热血屌丝的反杀"
};
//初始化5个ImageView
imageViewList = new ArrayList<ImageView>();
ImageView imageView;
View pointView;
LinearLayout.LayoutParams layoutParams;
for (int i=0;i<imageIds.length;i++){
imageView = new ImageView(this);
imageView.setImageResource(imageIds[i]);
imageViewList.add(imageView);
//加小白点
pointView = new View(this);
pointView.setBackgroundResource(R.drawable.selector_bg_point);
layoutParams = new LinearLayout.LayoutParams(5,5);
if (i!=0){
layoutParams.leftMargin = 10;
}
//默认设置圆点呈灰色
pointView.setEnabled(false);
llPointContainer.addView(pointView, layoutParams);
}
}
/**
* 初始化界面
*/
private void initView() {
viewPager = (ViewPager) findViewById(R.id.viewpager);
tvDes = (TextView) findViewById(R.id.des);
llPointContainer= (LinearLayout) findViewById(R.id.ll_point_container);
//设置页面更新监听
viewPager.addOnPageChangeListener(this);
viewPager.setCurrentItem(5000000);//设置到某个位置
}
3、ViewPager无限循环
由于本demo只有5张图片,所以一开始存在界限,越界将会报异常以及无法循环;通过对ViewPager一开始赋予无限大的数,接着对相应的position进行求余,从而实现无限循环的假效果
private class MyAdapter extends PagerAdapter {
@Override
public int getCount() {
return Integer.MAX_VALUE;
}
//指定复杂的判断逻辑
@Override
public boolean isViewFromObject(View view, Object object) {
// 当划到新的条目, 又返回来, view是否可以被复用.
// 返回判断规则
return view == object;
}
//返回要显示的条目内容, 创建条目
@Override
public Object instantiateItem(ViewGroup container, int position) {
//确认返回位置
int newPosition = position%imageViewList.size();
//获取相应的视图
ImageView imageView = imageViewList.get(newPosition);
//必须放入到container里
container.addView(imageView);
return imageView;//返回,否则会有异常
}
//销毁视图
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
//滑动时调用
}
@Override
public void onPageSelected(int position) {
// 新的条目被选中时调用
int newPosition = position%imageViewList.size();
tvDes.setText(contentDescs[newPosition]);
llPointContainer.getChildAt(previousSelectedPosition).setEnabled(false);
llPointContainer.getChildAt(newPosition).setEnabled(true);
previousSelectedPosition=newPosition;
}
@Override
public void onPageScrollStateChanged(int state) {
// 滚动状态变化时调用
}
4、自动播放
// 开启轮询
new Thread(){
public void run() {
isRunning = true;
while(isRunning){
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 往下跳一位
runOnUiThread(new Runnable() {
@Override
public void run() {
System.out.println("设置当前位置: " + viewPager.getCurrentItem());
viewPager.setCurrentItem(viewPager.getCurrentItem()+1);
}
});
}
};
}.start();