Android中使用ViewPager实现广告条
我们在使用电商或视频的手机客户端时,通常会看到广告条的效果。在网上搜索时才知道使用的是ViewPager,于是自己也做了一个Demo。
以下是效果图:

图中包括背景图片、文字描述以及白点。
其中ViewPager是android中support.v4包下的view.ViewPager类。
下面贴出代码:(注意:项目中需要五张图片)
布局文件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"
tools:context="com.example.demo_viewpager.MainActivity$PlaceholderFragment" > <android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="fill_parent"
android:layout_height="200dip"/>
<LinearLayout
android:layout_alignBottom="@id/viewpager"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="#33000000"
android:orientation="vertical"> <TextView
android:id="@+id/tv_image_description"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@android:color/white"
android:layout_gravity="center"/>
<LinearLayout
android:id="@+id/ll_point_group"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_marginTop="5dip"
android:layout_marginBottom="5dip"
android:layout_gravity="center_horizontal"></LinearLayout>
</LinearLayout> </RelativeLayout>
因为文字描述下方需要有白点,这个我们使用XML的选择器来实现。(大家也可以用切换背景图片来实现)
下面我贴出XML的代码:
point_background.xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/point_bg_enable" android:state_enabled="true"></item>
<item android:drawable="@drawable/point_bg_normal" android:state_enabled="false"></item> </selector>
画出选中的白点和未选中的白点:
point_bg_enable.xml 和 point_bg_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="0.5dip" /> <solid android:color="#aaFFFFFF"/> </shape>
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval" > <corners android:radius="0.5dip" /> <solid android:color="#55000000"/> </shape>
MainActivity.class:
public class MainActivity extends Activity implements OnPageChangeListener {
private List<ImageView> imageviewlist;
private TextView tv_Description;
private LinearLayout llPointGroup;
private int previousEnablePosition = 0; // 前一个被选中的点的索引
private String[] imageDiscriptionArray = { "托普早上好", "托普中午好", "托普下午好",
"托普晚上好", "托普深夜好" };
private boolean isStop = false; // 是否停止子线程, 不会停止
private ViewPager viewpager;
@Override
protected void onDestroy() {
isStop = true;
super.onDestroy();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Init();
// 开启线程无限自动移动
Thread mThread = new Thread(new Runnable() {
@Override
public void run() {
while(!isStop) {
// 每隔2秒钟, 发送一条消息到主线程, 更新viewpager的界面
SystemClock.sleep(2000);
runOnUiThread(new Runnable() {
@Override
public void run() {
// 此方法是在主线程中执行
viewpager.setCurrentItem(viewpager.getCurrentItem() + 1);
}
});
}
}
});
mThread.start();
}
private void Init() {
ImageView iv;
View view;
LayoutParams params;
viewpager = (ViewPager) findViewById(R.id.viewpager);
llPointGroup = (LinearLayout) findViewById(R.id.ll_point_group);
tv_Description = (TextView) findViewById(R.id.tv_image_description);
imageviewlist = new ArrayList<ImageView>();
int[] imageresid = { R.drawable.img1, R.drawable.img2, R.drawable.img3,
R.drawable.img4, R.drawable.img5 };
for (int id : imageresid) {
iv = new ImageView(this);
iv.setBackgroundResource(id);
imageviewlist.add(iv);
// 每循环一次,添加一个点到Linearlayout中
view = new View(this);
view.setBackgroundResource(R.drawable.point_background);
params = new LayoutParams(10, 10);
params.leftMargin = 10;
view.setEnabled(false);
view.setLayoutParams(params);
llPointGroup.addView(view);// 向线性布局中添加点
}
viewpager.setAdapter(new MyAdapter());
viewpager.setOnPageChangeListener(this);
// 初始化ViewPager的默认position为Integer.MAX_VALUE的一半
int index = (Integer.MAX_VALUE / 2)
- (Integer.MAX_VALUE / 2 % imageviewlist.size());
viewpager.setCurrentItem(index); // 设置当前的默认索引
}
class MyAdapter extends PagerAdapter {
@Override
public int getCount() {
return Integer.MAX_VALUE;
}
/**
* View当前显示的ImageView,Object 可能是ImageView或下一个ImageView true 复用对象 false
* 用的是object
*/
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}
/**
* 销毁对象
*
* @param positon
* 将要被销毁对象的索引位置
*/
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(imageviewlist.get(position
% imageviewlist.size()));
}
/**
* 初始化一个View对象
*
* @param position
* 将要被创建的对象的索引位置
*/
@Override
public Object instantiateItem(ViewGroup container, int position) {
container
.addView(imageviewlist.get(position % imageviewlist.size()));
return imageviewlist.get(position % imageviewlist.size());
}
}
@Override
public void onPageScrollStateChanged(int arg0) {
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageSelected(int position) {
// 取余后的索引
int newPosition = position % imageviewlist.size();
// 根据索引设置图片的描述
tv_Description.setText(imageDiscriptionArray[newPosition]);
// 把上一个点设置为未选中
llPointGroup.getChildAt(previousEnablePosition).setEnabled(false);
// 根据索引设置被选中的点
llPointGroup.getChildAt(newPosition).setEnabled(true);
previousEnablePosition = newPosition;
}
}
整个项目中注释比较多,相信大家能够看懂。
运行程序即可看到效果。
Android中使用ViewPager实现广告条的更多相关文章
- Android 中 DrawerLayout + ViewPager 怎么解决滑动冲突?
DrawerLayout 是 Android 官方的侧滑菜单控件,而 ViewPager 相信大家都很熟悉了.今天这里就讲一下当在 DrawerLayout 中嵌套 ViewPager 时,要如何解决 ...
- 【Android 应用开发】Android中使用ViewPager制作广告栏效果 - 解决ViewPager占满全屏页面适配问题
. 参考界面 : 携程app首页的广告栏, 使用ViewPager实现 自制页面效果图 : 源码下载地址: http://download.csdn.net/detail/han1202 ...
- Android中使用ViewPager制作广告栏效果 - 解决ViewPager占满全屏页面适配问题
. 参考界面 : 携程app首页的广告栏, 使用ViewPager实现 自制页面效果图 : 源码下载地址: http://download.csdn.net/detail/han1202 ...
- Android中使用ViewPager实现屏幕页面切换和页面切换效果
之前关于如何实现屏幕页面切换,写过一篇博文<Android中使用ViewFlipper实现屏幕切换>,相比ViewFlipper,ViewPager更适用复杂的视图切换,而且Viewpag ...
- Android中Fragment+ViewPager的配合使用
官方推荐 ViewPager与Fragment一起使用,可以更加方便的管理每个Page的生命周期,这里有标准的适配器实现用于ViewPager和Fragment,涵盖最常见的用例.FragmentPa ...
- Android笔记(二十三) Android中的ProgressBar(进度条)
圆形进度条和水平进度条 进度条也是UI界面一种非常实用的组件,通常用于向用户显示某个耗时操作完成的百分比,进度条可以动态的显示进度,避免长时间的执行某个耗时操作时,让用户感觉程序失去了相应,从而更好的 ...
- android 中的 ViewPager+ Fragment
android的Viewpager 的各种经常的用法,朋友问我要过,所以就稍微总结一下, ViewPager + Fragment 经常用到 代码是从 actionbarsherlock 中提取 ...
- Android笔记(二十四) Android中的SeekBar(拖动条)
拖动条和进度条非常相似,只是进度条采用颜色填充来表明进度完成的程度,而拖动条则通过滑块的位置来标识数值——而且拖动条允许用户拖动滑块来改变值,因此拖动条通常用于对系统的某种数值进行调节,比如调节音量等 ...
- ViewPager的广告条轮播
首先布局 <?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:androi ...
随机推荐
- iphone4s丢失如何找回
iphone4s丢失如何找回 iphone4s手机丢了怎么办,其实苹果手机自带找回功能,但是前提你得打开了icloud这款软件. 方法/步骤 1 在手机的设置里找到icloud设置,如图. 2 点击进 ...
- mysql 查看死锁和去除死锁
1.查询是否锁表show OPEN TABLES where In_use > 0; 2.查询进程 show processlist 3. 查询到相对应的进程,然后 kill id 验证(ki ...
- NullableKey:解决Dictionary中键不能为null的问题 zt
2012-12-29 02:26 by 老赵, 1745 visits 众所周知,.NET中Dictionary的键不能为null,否则会抛出NullReferenceException,这在某些时候 ...
- HDU 2122
思路:prime,考虑重边!!! #include<stdio.h> #include<string.h> int map[1001][1001],dist[1001]; in ...
- [Rosa]Android ListView 适配器原理及优化(转)
ListView的Adapter的作用如下图所示: Adapter的作用就是ListView界面与数据之间的桥梁,当列表里的每一项显示到页面时,都会调用Adapter的getView方法返回一个V ...
- bootstrap-内联表单 水平(横向)表单 响应式图片 辅助类 [转]
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- (转载)JDK中的设计模式
写的很好,学习道路更轻松一些 原文地址:http://blog.csdn.net/gtuu0123/article/details/6114197 JDK中设计模式 分类: Java相关 设计模式 2 ...
- nyoj开心的小明
这个问题是01背包,而对于编程之美那道是完全背包问题,在编程之美中也有一个0,1背包问题. 而且是容量是小于等于,不是等于,对于是否等于,在初始化参数时候不一样,不小于全部初始化为0,恰好等于,初始化 ...
- linux内核中分配4M以上大内存的方法
在内核中, kmalloc能够分配的最大连续内存为2的(MAX_ORDER-1)次方个page(参见alloc_pages函数, "if (unlikely(order >= ...
- HDU4417 - Super Mario(主席树)
题目大意 给定一个数列,每次要求你查询区间[L,R]内不超过K的数的数量 题解 和静态的区间第K大差不多,这题是<=K,先建立好n颗主席树,然后用第R颗主席树区间[1,K]内数的数量减去第L-1 ...