接着上一篇博客。上一篇博客是用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, ...

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

    然后在一个博客,以前的博客ImageSwitcher实现用户向导,现在,随着ViewPager实现同样的功能.直接看代码: 布局文件activity_main.xml <RelativeLayo ...

  3. Android之怎样实现滑动页面切换【Fragment】

    Fragment 页面切换不能滑动 所以对于listview 能够加入的左右滑动事件 .不会有冲突比如(QQ的好友列表的删除)  Fragment 和viewpager 的差别  Viewpager ...

  4. Centos系统创建用户oracle后,用该用户登陆系统,页面加载报错GConf error

    Linux 的 GConf error 解决办法 问题: Centos系统创建用户oracle后,用该用户登陆系统,页面加载报错,导致重新进入Centos系统后出现: GConf error:Fail ...

  5. 利用HTML5判断用户是否正在浏览页面技巧

    现在,HTML5里页面可见性接口就提供给了程序员一个方法,让他们使用visibilitychange页面事件来判断当前页面可见性的状态,并针对性的执行某些任务.同时还有新的document.hidde ...

  6. Spring Security默认的用户登录表单 页面源代码

    Spring Security默认的用户登录表单 页面源代码 <html><head><title>Login Page</title></hea ...

  7. (26)基于cookie的登陆认证(写入cookie、删除cookie、登陆后所有域下的网页都可访问、登陆成功跳转至用户开始访问的页面、使用装饰器完成所有页面的登陆认证)

    获取cookie request.COOKIES['key'] request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age ...

  8. js判断用户是否离开当前页面

    简介 VisibilityChange 事件:用于判断用户是否离开当前页面 Code // 页面的 visibility 属性可能返回三种状态 // prerender,visible 和 hidde ...

  9. 以+scheduledTimerWithTimeInterval...的方式触发的timer,在滑动页面上的列表时,timer会暂定回调,为什么?如何解决?

    这里强调一点:在主线程中以+scheduledTimerWithTimeInterval...的方式触发的timer默认是运行在NSDefaultRunLoopMode模式下的,当滑动页面上的列表时, ...

随机推荐

  1. NS2学习笔记(二)

    Tcl语言 变量和变量赋值 set a "Hello World!" #将字符串赋值给变量a puts "NS2 say $a" #输出字符串的内容,其中$a表 ...

  2. ACM_3n+1问题(克拉兹问题+线段树区间查询最大值)

    3n+1问题 Time Limit: 2000/1000ms (Java/Others) Problem Description: 考虑如下的序列生成算法:从整数n开始,如果n是偶数,把它除以2:如果 ...

  3. 326 Power of Three 3的幂

    给出一个整数,写一个函数来确定这个数是不是3的一个幂.后续挑战:你能不使用循环或者递归完成本题吗? 详见:https://leetcode.com/problems/power-of-three/de ...

  4. 详谈java集合框架

    1.为什么使用集合框架 当我们并不知道程序运行时会需要多少对象,或者需要更复杂方式存储对象——可以使用Java集合框架 2.Java集合框架包含的内容 接口:(父类)Collection接口下包含Li ...

  5. Python 之糗事百科多线程爬虫案例

    import requests from lxml import etree import json import threading import queue # 采集html类 class Get ...

  6. 怎么选择最适合自己的Linux培训机构?

    Linux培训已经成为入门Linux的一个重要途径,它的优势在于学习知识的系统性.快速性和实用性.Linux培训毕业的学员大多数拥有较强的实战动手能力,能够较快上手,更符合企业需求. 不过,大部分同学 ...

  7. 68.document增删改原理

    主要知识点 document增的原理 document删的原理 document改的原理 一.document增的原理 一个document存入es大致要分以下几个步骤 (1)数据写入buffer, ...

  8. STM32串口通信配置(USART1+USART2+USART3+UART4)

    一.串口一的配置(初始化+中断配置+中断接收函数) 1 /*====================================================================== ...

  9. LeetCode 712. Minimum ASCII Delete Sum for Two Strings

    Given two strings s1, s2, find the lowest ASCII sum of deleted characters to make two strings equal. ...

  10. PAT 1039. Course List for Student

    Zhejiang University has 40000 students and provides 2500 courses. Now given the student name lists o ...