`
que2010
  • 浏览: 73856 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

【整理】通过ViewPager实现Launcher中的屏幕切换效果

阅读更多

整理自:http://www.cnmsdn.com/html/201109/1316004424ID10075.html

            http://my.oschina.net/kzhou/blog/29157

 

Launcher的屏幕切换效果是Android操作系统的特色之一,具有很好的用户体验。

以前,实现这种效果需要参考Launcher的源代码来实现,既费时也费力。

在2011年3月份的时候,Android发布了一个被称为“compatibility package”的兼容开发包。该兼容开发包主要包含了Android最新平台上的最酷的特性,这样的话,当你在为旧版本的Android设备开发程序的时候,就可以使用这个兼容开发包来使用最新的Android特性,而不用自己重新开发,从而减轻了开发者的开发任务。通过其中的ViewPager类实现Launcher的屏幕切换效果就显得得心应手了。

 

首先,需要下载该兼容开发包。

通过”Android SDK and AVD Manager”可以下载,具体操作过程:
  1. 启动 SDK and AVD Manager.如果你使用的是Eclipse,可以通过菜单 Window > Android SDK and AVD Manager;  如果你使用的是Windows操作系统,可以通过sdk目录中的 “SDK Manager.exe"来启动; 如果你使用的是linux系统 可以通过<sdk>/tools 目录中的android脚本来启动.
  2. 选择左边的”Available packages”,然后展开右边的” Android Repository”, 然后选择最下面的”Android Compatibility package ” 然后点击右下方的” Install selected”按钮.
  3. 等待安装完成后的提示信息.
使用下载工具(例如 迅雷)自己下载安装:
      由于一些众所周知的原因,Google的服务在国*内时不时的不能正常使用, 在下载Andorid开发工具的时候也是如此, 有时候下载了80%了 结果提示下载失败! 如果您经常遇到这种情况或者下载速度很慢, 可以通过其他方式下载.
     最新版本的兼容开发包的下载地址是: https://dl-ssl.google.com/android/repository/compatibility_r03.zip 大小是541696字节, 效验码(sha1)是”49e32c0aca8e52c2e9a398912a68c036583b917f” 下载完后把compatibility_r03.zip 这个文件解压到 <sdk>/extras/android/ 目录下即可. 解压后可以得到一个compatibility目录, 该目录下有各个版本的兼容开发包目录,上面下载的开发包包含2个版本 一个是v4;一个是v13. 每个目录下面分别包含示例代码和开发包的源代码.

如何使用兼容开发包

使用兼容开发包和使用第三方jar包一样,直接添加到项目引用的类库中就可以了:

  1. 在您的andorid项目跟目录中创建一个名称为”libs"的目录
  2. 复制您要使用版本的兼容开发包到 libs/ 目录.支持API Level 4 (Android 1.6)的jar包位于: <sdk>/extras/android/compatibility/v4/android-support-v4.jar.
  3. 把该jar包添加到类路径中.如果您使用Eclipse,只需要在Package Explorer中选中”libs”目录下的”android-support-v4.jar” 然后点击右键, 选中 Build Path > Add to Build Path. 添加成功后您会发现该jar包出现到了一个名称为”Referenced Libraries”的节点中.

现在您的app就可以使用兼容开发包了,所有支持的特性都在 android.support 包中 (例如, android.support.v4).

 

 

 

至此准备环境已经ok
下边还是通过代码进行说话吧

准备布局文件
viewpager_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" android:orientation="vertical">
<!-- 此处需要给出全路径 -->
<android.support.v4.view.ViewPager
    android:id="@+id/viewpagerLayout" android:layout_height="fill_parent" android:layout_width="fill_parent"/>
</LinearLayout>
 
layout1.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" android:orientation="vertical">
    <TextView android:textAppearance="?android:attr/textAppearanceLarge" android:layout_height="wrap_content" android:id="@+id/textView1" android:layout_width="fill_parent" android:text="第一页"></TextView>
    <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/editText1">
        <requestFocus></requestFocus>
    </EditText>
</LinearLayout>
 
layout2.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" android:orientation="vertical">
    <TextView android:textAppearance="?android:attr/textAppearanceLarge" android:layout_height="wrap_content" android:id="@+id/textView1" android:layout_width="fill_parent" android:text="第二页"></TextView>
    <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/editText1">
        <requestFocus></requestFocus>
    </EditText>
</LinearLayout>
 
layout3.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" android:orientation="vertical">
    <TextView android:textAppearance="?android:attr/textAppearanceLarge" android:layout_height="wrap_content" android:id="@+id/textView1" android:layout_width="fill_parent" android:text="第三页"></TextView>
    <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/editText1">
        <requestFocus></requestFocus>
    </EditText>
</LinearLayout>
 
主程序
package a.b;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.os.Parcelable;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.EditText;

public class TestViewPager extends Activity {
	private ViewPager myViewPager;

	private MyPagerAdapter myAdapter;
	
	private LayoutInflater mInflater;
	private List<View> mListViews;
	private View layout1 = null;
	private View layout2 = null;
	private View layout3 = null;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.viewpager_layout);
		myAdapter = new MyPagerAdapter();
		myViewPager = (ViewPager) findViewById(R.id.viewpagerLayout);
		myViewPager.setAdapter(myAdapter);
        
        mListViews = new ArrayList<View>();
        mInflater = getLayoutInflater();
        layout1 = mInflater.inflate(R.layout.layout1, null);
        layout2 = mInflater.inflate(R.layout.layout2, null);
        layout3 = mInflater.inflate(R.layout.layout3, null);
       
        mListViews.add(layout1);
        mListViews.add(layout2);
        mListViews.add(layout3);
        
        //初始化当前显示的view
        myViewPager.setCurrentItem(1);
        
        //初始化第二个view的信息
        EditText v2EditText = (EditText)layout2.findViewById(R.id.editText1);
        v2EditText.setText("动态设置第二个view的值");
        
        myViewPager.setOnPageChangeListener(new OnPageChangeListener() {
			
			@Override
			public void onPageSelected(int arg0) {
				Log.d("k", "onPageSelected - " + arg0);
				//activity从1到2滑动,2被加载后掉用此方法
				View v = mListViews.get(arg0);
				EditText editText = (EditText)v.findViewById(R.id.editText1);
				editText.setText("动态设置#"+arg0+"edittext控件的值");
			}
			
			@Override
			public void onPageScrolled(int arg0, float arg1, int arg2) {
				Log.d("k", "onPageScrolled - " + arg0);
				//从1到2滑动,在1滑动前调用
			}
			
			@Override
			public void onPageScrollStateChanged(int arg0) {
				Log.d("k", "onPageScrollStateChanged - " + arg0);
				//状态有三个0空闲,1是增在滑行中,2目标加载完毕
				/**
			     * Indicates that the pager is in an idle, settled state. The current page
			     * is fully in view and no animation is in progress.
			     */
			    //public static final int SCROLL_STATE_IDLE = 0;
			    /**
			     * Indicates that the pager is currently being dragged by the user.
			     */
			    //public static final int SCROLL_STATE_DRAGGING = 1;
			    /**
			     * Indicates that the pager is in the process of settling to a final position.
			     */
			    //public static final int SCROLL_STATE_SETTLING = 2;

			}
		});
        
	}
	
    private class MyPagerAdapter extends PagerAdapter{

		@Override
		public void destroyItem(View arg0, int arg1, Object arg2) {
			Log.d("k", "destroyItem");
			((ViewPager) arg0).removeView(mListViews.get(arg1));
		}

		@Override
		public void finishUpdate(View arg0) {
			Log.d("k", "finishUpdate");
		}

		@Override
		public int getCount() {
			Log.d("k", "getCount");
			return mListViews.size();
		}

		@Override
		public Object instantiateItem(View arg0, int arg1) {
			Log.d("k", "instantiateItem");
			((ViewPager) arg0).addView(mListViews.get(arg1),0);
			return mListViews.get(arg1);
		}

		@Override
		public boolean isViewFromObject(View arg0, Object arg1) {
			Log.d("k", "isViewFromObject");
			return arg0==(arg1);
		}

		@Override
		public void restoreState(Parcelable arg0, ClassLoader arg1) {
			Log.d("k", "restoreState");
		}

		@Override
		public Parcelable saveState() {
			Log.d("k", "saveState");
			return null;
		}

		@Override
		public void startUpdate(View arg0) {
			Log.d("k", "startUpdate");
		}
    	
    }
	
}
 
在实机上测试后,非常流畅,这也就是说官方版的左右滑屏控件已经实现
目前,关于viewpager的文章非常少,本文是通过阅读viewpager源代码分析出的写法
当然此文章仅是抛砖引玉,而且属于框架式程序,目的就是让读者了解API的基本用法
希望这篇原创文章对大家有帮助
欢迎感兴趣的朋友一起讨论
共同学习,共同进步
分享到:
评论

相关推荐

    安卓Launcher桌面相关-使用ViewPager实现高仿launcher拖动效果.rar

    在实现Launcher桌面的滑动效果时,我们可以将每个主屏幕看作ViewPager的一个页面,通过滑动来切换不同的主屏幕。 1. **ViewPager的基本使用** - 首先,我们需要在布局文件中添加ViewPager,并为其指定适配器。...

    使用ViewPager实现高仿launcher左右拖动效果

    ViewPager主要用于在屏幕上左右滑动切换不同页面,常用于实现启动器(Launcher)、相册、指南页等多种场景下的界面切换。它能够提供平滑的页面切换动画,增强用户体验。 2. ViewPager的基本用法: 要使用ViewPager,...

    Android中如何使用ViewPager实现类似laucher左右拖动效果源码

    在Android开发中,ViewPager是一个非常重要的组件,常用于创建滑动页面的效果,比如在应用启动器(Launcher)中常见的左右滑动切换应用页签。本教程将深入探讨如何利用ViewPager来实现类似启动器的左右拖动效果,并...

    ViewPager实现屏幕滑动效果源码

    `ViewPager`是Android SDK中的一个强大且常用的组件,主要用于实现屏幕间的滑动切换效果,它在许多应用中被用于创建类似书籍翻页或卡片滑动的界面交互。在这个实例中,我们将深入理解`ViewPager`的工作原理,以及...

    Android 自定义 ViewPager 打造千变万化的图片切换效果

    在Android开发中,ViewPager是一个非常常用的组件,它用于展示可滑动的页面,常用于实现图片轮播、页面切换等效果。但是,Android自带的ViewPager功能相对基础,无法满足一些复杂的需求,比如炫酷的过渡动画。这时,...

    Android应用中使用ViewPager实现类似QQ的界面切换效果

    在Android应用开发中,ViewPager是一种常用的控件,用于实现页面滑动切换的效果,常用于创建类似QQ、微信等社交应用的界面。通过ViewPager,用户可以通过手势左右滑动来浏览不同的页面,提供了一种平滑且直观的用户...

    使用ViewPager实现高仿launcher拖动效果.rar

    "使用ViewPager实现高仿launcher拖动效果" 这个标题指出我们要讨论的是如何使用Android的ViewPager组件来创建一个类似手机启动器(launcher)的滑动界面。在Android开发中,ViewPager通常用于在多个页面之间进行平滑...

    viewPager实现activity的滑动切换或者禁止滑动切换

    但是,如果你确实需要在ViewPager中切换Activity,可以通过Intent启动新的Activity,并在每个Activity中设置相应的布局,实现类似滑动的效果。 要禁止滑动切换,我们可以有两种方式: 1. 修改ViewPager的滑动行为:...

    自定义ViewPager (禁止滑动和去除切换效果)

    自定义ViewPager (禁止滑动和去除切换效果) viewPager.setNoScroll(true);//禁止手动滑动

    android viewpager实现微信tab切换

    在Android开发中,`ViewPager` 是一个非常常用的组件,它允许用户通过左右滑动来浏览多个页面,这种交互方式在很多应用中都有所应用,比如微信的底部标签切换。本篇将详细介绍如何使用`ViewPager` 实现类似微信的Tab...

    ViewPager实现五页面滑动切换

    在Android开发中,ViewPager是一个非常重要的组件,常用于实现页面间的滑动切换效果,比如在应用的引导页、Tab切换等场景。本教程将详细讲解如何利用ViewPager实现五页面的滑动切换,让读者深入了解这一功能的实现...

    viewpager 实现一屏幕多页循环滚动

    在Android开发中,ViewPager是一个非常重要的组件,常用于展示可滑动的页面集合。标题"viewpager 实现一...通过对这些代码的学习和研究,开发者可以深入理解如何在实际项目中实现ViewPager的一屏幕多页循环滚动效果。

    android源码-ViewPager实现微信页面切换效果

    在Android开发中,ViewPager是一个非常重要的组件,常用于实现页面滑动切换的效果,例如在许多应用的引导页、设置页或者像微信这样的社交应用中。本文将深入探讨如何利用ViewPager来实现类似微信的页面切换体验。 ...

    Android的ViewPager多页面切换动画(仿Launcher)效果

    在Android开发中,ViewPager是一个非常重要的组件,常用于实现多页面滑动切换的效果,比如在应用的主界面、设置界面等场景。本教程将详细讲解如何利用ViewPager实现类似Android Launcher和QQ多标签页的页面切换动画...

    Android ViewPager多页面滑动切换以及动画效果

    Android ViewPager实现仿QQ多页面滑动切换以及动画效果

    ViewPager实现3D画廊效果

    在Android开发中,ViewPager是一个非常常用的组件,它用于在多个视图之间进行平滑的滑动切换,常用于实现类似相册、页面切换等效果。本教程将详细讲解如何使用ViewPager来实现3D画廊效果,同时涵盖ViewPager的加载...

    tubatu-viewpager-高仿土巴兔选择装修风格的效果,这里通过自定义ViewPager来实现,为什么通过ViewPager来实现呢,一是ViewPager很容易实现切换动画效果,二是选.zip

    高仿土巴兔选择装修风格的效果,这里通过自定义ViewPager来实现,为什么通过ViewPager来实现呢,一是ViewPager很容易实现切换动画效果,二是选择的那一项自动居中。项目地址:...

    ViewPager实现的切换动画

    在这个“ViewPager实现的切换动画”项目中,我们将会探讨如何利用ViewPager来实现丰富的页面切换动画,包括但不限于引导动画。 首先,ViewPager的核心功能是显示和切换多个Fragment或View,它可以自动处理用户的...

    通过ViewPager实现微信标题栏滑动效果

    在Android开发中,微信标题栏滑动效果是一种常见的交互设计,它允许用户通过左右滑动标题栏来切换不同的页面。这种效果通常是通过ViewPager组件来实现的。ViewPager是Android支持库中的一个视图容器,它可以展示多个...

    viewpager实现图片切换

    在Android开发中,ViewPager是一种非常常用的组件,它允许用户通过左右滑动来浏览多个页面,通常用于实现轮播图、页面切换等效果。本教程将详细介绍如何使用ViewPager实现图片切换的功能。 首先,我们需要理解...

Global site tag (gtag.js) - Google Analytics