用户向导左右滑动页面实现之ViewPager
接着上一篇博客。上一篇博客是用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的更多相关文章
- 用户向导左右滑动页面实现之ImageSwitcher
当第一次打开一个app时,通常有一个使用向导介绍本APK的基本功能和用法,这个向导是很重要的,方便用户能高速知道和适应该app如何用. 实现此使用向导有非常多种方法,比方用ImageSwitcher, ...
- 用户向导页面实现左右滑动的ViewPager
然后在一个博客,以前的博客ImageSwitcher实现用户向导,现在,随着ViewPager实现同样的功能.直接看代码: 布局文件activity_main.xml <RelativeLayo ...
- Android之怎样实现滑动页面切换【Fragment】
Fragment 页面切换不能滑动 所以对于listview 能够加入的左右滑动事件 .不会有冲突比如(QQ的好友列表的删除) Fragment 和viewpager 的差别 Viewpager ...
- Centos系统创建用户oracle后,用该用户登陆系统,页面加载报错GConf error
Linux 的 GConf error 解决办法 问题: Centos系统创建用户oracle后,用该用户登陆系统,页面加载报错,导致重新进入Centos系统后出现: GConf error:Fail ...
- 利用HTML5判断用户是否正在浏览页面技巧
现在,HTML5里页面可见性接口就提供给了程序员一个方法,让他们使用visibilitychange页面事件来判断当前页面可见性的状态,并针对性的执行某些任务.同时还有新的document.hidde ...
- Spring Security默认的用户登录表单 页面源代码
Spring Security默认的用户登录表单 页面源代码 <html><head><title>Login Page</title></hea ...
- (26)基于cookie的登陆认证(写入cookie、删除cookie、登陆后所有域下的网页都可访问、登陆成功跳转至用户开始访问的页面、使用装饰器完成所有页面的登陆认证)
获取cookie request.COOKIES['key'] request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age ...
- js判断用户是否离开当前页面
简介 VisibilityChange 事件:用于判断用户是否离开当前页面 Code // 页面的 visibility 属性可能返回三种状态 // prerender,visible 和 hidde ...
- 以+scheduledTimerWithTimeInterval...的方式触发的timer,在滑动页面上的列表时,timer会暂定回调,为什么?如何解决?
这里强调一点:在主线程中以+scheduledTimerWithTimeInterval...的方式触发的timer默认是运行在NSDefaultRunLoopMode模式下的,当滑动页面上的列表时, ...
随机推荐
- 347 Top K Frequent Elements 前K个高频元素
给定一个非空的整数数组,返回其中出现频率前 k 高的元素.例如,给定数组 [1,1,1,2,2,3] , 和 k = 2,返回 [1,2].注意: 你可以假设给定的 k 总是合理的,1 ≤ k ...
- 【LeetCode】467. Unique Substrings in Wraparound String
Consider the string s to be the infinite wraparound string of "abcdefghijklmnopqrstuvwxyz" ...
- iOS动画——DynamicAnimate
力学动画 以dynamicAnimate为首的力学动画是苹果在iOS7加入的API,里面包含了很多力学行为,这套API是基于Box2d实现的.其中包含了重力.碰撞.推.甩.和自定义行为. 涉及到的类如 ...
- python 根据数组生成图片
array = np.asarray(allBigPng, dtype=np.uint8)image = Image.fromarray(array, 'RGBA') image.save(outpu ...
- 利用js写全选操作
<script type="text/javascript"> function checkall(qx) { var ck=document.getElementsB ...
- 六时出行 App iOS隐私政策
本应用尊重并保护所有使用服务用户的个人隐私权.为了给您提供更准确.更有个性化的服务,本应用会按照本隐私权政策的规定使用和披露您的个人信息.但本应用将以高度的勤勉.审慎义务对待这些信息.除本隐私权政策另 ...
- 我的liunx开发环境的配置之路
相信有不少人和我一样,虽然是做纯linux开发,但并不排斥windows,并且喜欢在windows下面的使用各种好用的工具来让linux的编程工作变得更加方便.实际上每一个系统都有他的过人支持,win ...
- TCP:三次握手,URG、ACK、PSH、RST、SYN、FIN 含义
http://blog.csdn.net/wudiyi815/article/details/8505726 TCP:SYN ACK FIN RST PSH URG简析 三次握手Three-way ...
- getdlgitemtext
获取控件内信息 set 设置控件内信息 oninitdialog初始化控件时的操作
- CAD绘一个文字自动剧中的标注 (com接口)
主要用到函数说明: _DMxDrawX::DrawDimRotated 绘制一个线型标注.详细说明如下: 参数 说明 DOUBLE dExtLine1PointX 输入第一条界线的起始点X值 DOUB ...