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;
}

}

整个项目中注释比较多,相信大家能够看懂。

运行程序即可看到效果。

时间: 2024-11-05 14:41:23

Android中 ViewPager的使用的相关文章

Android中ViewPager+Fragment懒加载问题解决方案

转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/53205878 本文出自[DylanAndroid的博客] Android中ViewPager+Fragment懒加载问题解决方案 在Android中我们经常会用到ViewPager+Fragment组合.然而,有一个很让人头疼的问题就是,我们去加载数据的时候 由于ViewPager的内部机制所限制,所以它会默认至少预加载一个.这让人很郁闷,所以,我就想到要封装一个Fragme

android中viewPager+fragment实现的屏幕左右切换(进阶篇)

Fragment支持在不同的Activity中使用并且可以处理自己的输入事件以及生命周期方法等.可以看做是一个子Activity. 先看一下布局: 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match

Android中ViewPager的使用

我们在一个apk中第一次開始的时候,会有一个guide界面.一般使用ViewPager来完毕. 布局文件例如以下: <? xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent&quo

Android中ViewPager与HorizontalListView的滑动冲突处理

Android开发中,有不少的控件都有点击或滑动冲突事件,比如ListView的onitemclick事件与item上的Button(如果有Button的话)等.今天在工作中用ViewPager里面的页面套用HorizontalListView,横向 划动也有冲突,解决办法很简单,只要在HorizontalListView中重写onInterceptTouchEvent(MotionEvent ev)方法中添加 getParent().requestDisallowInterceptTouchE

android中viewPager实现的屏幕左右切换(入门篇)

大多数的APP都可以实现几个屏幕来回的切换, 首先新建两个Activity,内容随意,布局随意.接下来在MainActivity.xml: 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match_p

Android中ViewPager+Fragment的基本使用

这几天学习了一下ViewPager+Fragement的基本使用方法并写了个Demo.现将代码和效果图放上. 首先是布局文件  <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:tools="http://schemas.android.com/tools"     android:layout_width="match_paren

Android 中ViewPager练习

新手一枚,昨天在爱代码上看到一个关于ViewPager的小练习,于是今天动手写了一遍.代码不复杂,只是练习基础. 思路是建立两个fragment界面加载到ArrayList<Fragment>中去,设置ViewPager的适配器,在本例中使用的是FragmentStatePagerAdapter,设置点击的监听事件,设置页面变化的监听事件 设置适配器代码 viewPager.setAdapter(new FragmentStatePagerAdapter( getSupportFragment

Android中ViewPager如何设置不能通过屏幕左右滑动来切换页面

//很多时候,我想禁止用户通过屏幕的左右滑动来切换界面!如何实现! //创建一个类继承viewpager,实现 onTouchEvent   和   onInterceptTouchEvent方法,都返回   false public class MyViewPagerHome extends ViewPager{         public MyViewPagerHome(Context context, AttributeSet attrs) {        super(context,

Android中使用ViewPager实现屏幕页面切换和页面轮播效果

之前关于如何实现屏幕页面切换,写过一篇博文<Android中使用ViewFlipper实现屏幕切换>,相比ViewFlipper,ViewPager更适用复杂的视图切换,而且Viewpager有自己的adapter,这也让其适应复杂对象,实现数据的动态加载. ViewPager是谷歌官方给我们提供的一个兼容低版本安卓设备的软件包,里面包囊了只有在安卓3.0以上可以使用的api.而viewpager就是其中之一,利用它,我们可以做很多事情,从最简单的导航,到页面菜单等等. 下面我们就展示下Vie