然后在一个博客,以前的博客ImageSwitcher实现用户向导,现在,随着ViewPager实现同样的功能。直接看代码:

布局文件activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
tools:context=".MainActivity" > <android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/> <LinearLayout
android:id="@+id/dots"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginBottom="50dp"
android:gravity="center_horizontal"
android:orientation="horizontal" >
</LinearLayout>
</RelativeLayout>

ViewPager页面的切换用小圆点来表示当前是第几页,这里使用drawable.xml文件去绘制的,例如以下:

dot_focus.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<corners android:radius="5dip" />
<solid android:color="#FF930000" />
</shape>

dot_nomal.xml

<?xml version="1.0" encoding="utf-8"?

>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<corners android:radius="5dip" />
<solid android:color="#FF3C3C3C" />
</shape>

在Activity中例如以下代码:

package com.example.viewpagerautoswitch;

import java.util.ArrayList;
import java.util.List; import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast; @SuppressLint("HandlerLeak")
public class MainActivity extends Activity {
private ViewPager mViewPager ;
private MyPagerAdapter mViewPagerAdapter ;
private LinearLayout mLinearLayout ;
private ImageView[] mImageDots ;
private Context mContext ; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mContext = MainActivity.this ;
mViewPager = (ViewPager)findViewById(R.id.viewpager);
mLinearLayout = (LinearLayout)findViewById(R.id.dots);
initViewPager(getImageItem() ,0);
} public void initViewPager(List<ImageView> mList ,int position){
mImageDots = new ImageView[mList.size()];
for(int i=0 ;i<mList.size() ;i++){
ImageView image = new ImageView(mContext);
image.setLayoutParams(new LayoutParams(10, 10));
image.setBackgroundResource(R.drawable.dot_nomal);
mImageDots[i] = image ;
mLinearLayout.addView(image);
TextView tv = new TextView(mContext);
tv.setLayoutParams(new LayoutParams(20, 10));
mLinearLayout.addView(tv);
}
mViewPagerAdapter = new MyPagerAdapter(mContext,mList); mViewPager.setOnPageChangeListener(new OnPageChangeListener() {
// onPageScrollStateChanged --> onPageSelected --> onPageScrolled -->onPageScrollStateChanged
@Override
public void onPageSelected(int position) {
for(int i=0 ;i<mImageDots.length ;i++){
if(i == position){
mImageDots[i].setBackgroundResource(R.drawable.dot_focus);
}else{
mImageDots[i].setBackgroundResource(R.drawable.dot_nomal);
}
}
} @Override
public void onPageScrolled(int current_position, float persent, int px) {
} @Override
public void onPageScrollStateChanged(int state) { }
}); mViewPager.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
}
}); mViewPager.setAdapter(mViewPagerAdapter);
mViewPager.setCurrentItem(position);
mImageDots[position].setBackgroundResource(R.drawable.dot_focus);
} public List<ImageView> getImageItem(){
List<ImageView> list = new ArrayList<ImageView>();
ImageView img = new ImageView(mContext);
img.setBackgroundResource(R.drawable.img1);
list.add(img);
img = new ImageView(mContext);
img.setBackgroundResource(R.drawable.img2);
list.add(img);
img = new ImageView(mContext);
img.setBackgroundResource(R.drawable.img3);
list.add(img);
return list ;
} @Override
public void finish() {
super.finish();
}
}

这里ViewPager和ImageSwitcher不同的地方在于ViewPager是用Adapter去封装须要加装的页面。而ImageSwitcher使用ViewFactory去加装图片的。所以使用viewPager时须要集成PagerAdapter实现对应的接口就可以。

例如以下:

MyPagerAdapter.java

package com.example.viewpagerautoswitch;

import java.util.List;

import android.content.Context;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView; public class MyPagerAdapter extends PagerAdapter { private List<ImageView> items ;
private Context mContext ; public MyPagerAdapter(Context context,List<ImageView> item){
mContext = context ;
items = item ;
} @Override
public int getCount() {
return items == null ? 0 : items.size();
} @Override
public boolean isViewFromObject(View view, Object obj) {
return view == (View)obj;
} @Override
public Object instantiateItem (ViewGroup container, int position) {
ImageView image = items.get(position);
((ViewPager)container).addView(image, 0);
return image;
} @Override
public void destroyItem (ViewGroup container, int position, Object object) {
container.removeView((View)object);
}
}

这样就能够实现用户向导的功能了,详细的页面效果例如以下:图片显示的是第二张pager的情况,这个是android手机上的demo,假设是Android机顶盒上使用的话,能够捕捉左右键去时间滑动。





有时候,在应用中不不过为了能够切换图片。也许这个Pager他有点击事件所表示的意思。比方点击之后跳转到某个网页。这么办!? 这里能够封装你的Adapter数据,将ImageView,替换成你定义的封装数据。在Adapter中重写的instantiateItem()中去实例化一个View,然后返回就可以,因为初始化Adapter的list在MainActivity中有原始数据。那么当用户在点击某个pager时,提取这个Pager所表示的信息,比方一个网址链接等。

事实上。如今好多app中使用了自己主动循环切换的效果。这个效果不外乎就是用计时器+Handler实现,仅仅须要加入例如以下代码就可以:

private Timer mTimer ;
private void startTimer(){
if(mTimer == null){
mTimer = new Timer(true);
}
mTimer.schedule(new TimerTask(){
@Override
public void run() {
mHandler.sendEmptyMessage(0);
}
}, 1000, 4000) ;// 延迟1秒開始运行,循环运行时间是4秒
} private void stopTimer(){
if(mTimer != null){
mTimer.cancel() ;
mTimer = null ;
}
} @SuppressLint("HandlerLeak")
Handler mHandler = new Handler(){
public void handleMessage(android.os.Message msg) {
if(msg.what == 0){
int mViewPagerCurrentIndex = mViewPager.getCurrentItem();
mViewPagerCurrentIndex = (++mViewPagerCurrentIndex) % mViewPager.getAdapter().getCount() ;
mViewPager.setCurrentItem(mViewPagerCurrentIndex, true);
}
};
};

这段代码中提供了開始和停止自己主动循环切换的开关startTimer()、stopTimer(),通过这两个方法。能够更具需求对ViewPager是否须要自己主动切换做操作。

此外,ImageSwitcher同样可用于自己主动控制该代码转换。

版权声明:本文博主原创文章,博客,未经同意不得转载。

用户向导页面实现左右滑动的ViewPager的更多相关文章

  1. 用户向导页面实现左右滑动的ImageSwitcher

    当你第一次打开app时刻,通常有使用向导现在演示APK基本功能和用法,该向导是非常重要的,用户可以知道并调整到速度app如何. 实现此使用向导有非常多种方法,比方用ImageSwitcher.View ...

  2. 用户向导左右滑动页面实现之ViewPager

    接着上一篇博客.上一篇博客是用ImageSwitcher实现用户向导功能,如今用ViewPager实现同样的功能. 直接看代码: 布局文件activity_main.xml <RelativeL ...

  3. android 布局 使用 viewPager 时,如何解决 和 子页面 长按滑动 冲突问题

    使用 viewPager 时,如何解决 和 子页面 长按滑动 冲突问题. 我的问题原型: 这个问题,我相信遇到的人会比较少,我是在 一个 viewPager 中,其中 一个 fragment 中实现了 ...

  4. NSIS MUI 的内置向导页面

    MUI 的内置向导页面和安装程序有关的向导页面MUI_PAGE_WELCOME 该向导页面显示欢迎信息MUI_PAGE_LICENSE text/rtf_file 该向导页面显示软件授权申明MUI_P ...

  5. Headroom.js – 快速响应用户的页面滚动操作

    Headroom.js 是一个轻量级,高性能的JS插件(无依赖性!),允许你响应用户的滚动行为.Headroom.js 使您能够在适当的时候把元素融入视图,而其它时候让内容成为焦点.Headroom. ...

  6. 自定义循环滑动的viewpager

    今天和大家分享一下如何定制一个可以循环滑动的viewpager.其实今天更重要的提供一种组件化思想,当然你可以理解为面向对象思想. 吐槽一下网上流行的实现方式吧(为了方便说明,下文称之为方式A),方式 ...

  7. 使用 StoryBoard 的时候加入用户引导页面

    如果想让一个APP加上引导页面是一个非常完美的举动 但是,总会遇到一些问题 (不要忘记在APDelegate里面加上用户引导页面的头文件和程序启动时的第一个页面哦) 情况一:纯代码 判断是否是第一次启 ...

  8. Android-垂直滑动的ViewPager

    该ViewPager和正常的ViewPager的使用方式是一样的,只不过是垂直滑动的. 下面是这个ViewPager的代码 /** * 垂直滑动的ViewPager */ public class V ...

  9. js jq输入框中按回车触发提交事件,用户在页面输入后按回车(Enter键)进行

    js jq输入框中按回车触发提交事件,用户在页面输入后按回车(Enter键)进行 代码如下: <!DOCTYPE html> <html lang="en" xm ...

随机推荐

  1. [LeetCode]题解(python):151-Reverse Words in a String

    题目来源: https://leetcode.com/problems/reverse-words-in-a-string/ 题意分析: 给定一个字符串,里面包括多个单词,将这个字符串的单词翻转,例如 ...

  2. J2SE知识点摘记(二十)

    List 1.3.1        概述 前面我们讲述的Collection接口实际上并没有直接的实现类.而List是容器的一种,表示列表的意思.当我们不知道存储的数据有多少的情况,我们就可以使用Li ...

  3. HDU 5723 Abandoned country(最小生成树 + 树形DP)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5723 [题目大意] n座城市,m条路径,求解: 1.最短的路径和,使得n座城市之间直接或者间接连通 ...

  4. iOS中的retainCount

    我们都知道iOS中采用引用计数的技术来管理内存,当一个对象没有任何一个地方引用的时候会自动释放,此时的retainCount为0,而且提供了一个-(NSInteger)retainCount的方法来获 ...

  5. 清风注解-Swift程序设计语言:Point1~5

    目录索引 清风注解-Swift程序设计语言 Point 1. Swift 风格的"Hello, world" 代码事例: println("Hello, world&qu ...

  6. poj1799---解析几何

    sin(a)=r/R-r,反三角asin(r/R-r),乘以2n=2pi,去化简,得到r 收获:define pi acos(-1) 这样pi的精度会高很多<math.h>(cos,sin ...

  7. Oracle Dataguard HA (主备,灾备)方案部署调试

    包括: centos6.5 oracle11gR2 DataGuard安装 dataGuard 主备switchover角色切换 数据同步测试 <一,>DG数据库数据同步测试1,正常启动主 ...

  8. JBoss+Ant实现EJB无状态会话bean实例

    EJB分为session bean.entity bean.message-driven bean,session bean又分为无状态会话bean和有状态会话bean. session bean负责 ...

  9. jQuery插件开发方法

    jQuery如此流行,各式各样的jQuery插件也是满天飞.你有没有想过把自己的一些常用的JS功能也写成jQuery插件呢?如果你的答案是肯定的,那么来吧!和我一起学写jQuery插件吧! 很多公司的 ...

  10. 【android】两个按钮的宽度各占屏幕的一半

    <LinearLayout> <Button android:layout_height="wrap_content" android:layout_width= ...