首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > 移动开发 >

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

2012-09-10 
【整理】通过ViewPager实现Launcher中的屏幕切换效果整理自:http://www.cnmsdn.com/html/201109/1316004424I

【整理】通过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”可以下载,具体操作过程:
    启动 SDK and AVD Manager.如果你使用的是Eclipse,可以通过菜单?Window?>?Android SDK and AVD Manager;??如果你使用的是Windows操作系统,可以通过sdk目录中的 “SDK Manager.exe"来启动; 如果你使用的是linux系统 可以通过<sdk>/tools 目录中的android脚本来启动. 选择左边的”Available packages”,然后展开右边的” Android Repository”, 然后选择最下面的”Android Compatibility package?” 然后点击右下方的”?Install selected”按钮. 等待安装完成后的提示信息.
使用下载工具(例如 迅雷)自己下载安装:?? ? ?由于一些众所周知的原因,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包一样,直接添加到项目引用的类库中就可以了:

    在您的andorid项目跟目录中创建一个名称为”libs"的目录 复制您要使用版本的兼容开发包到?libs/?目录.支持API Level 4 (Android 1.6)的jar包位于:?<sdk>/extras/android/compatibility/v4/android-support-v4.jar. 把该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;@Overrideprotected 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() {@Overridepublic 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控件的值");}@Overridepublic void onPageScrolled(int arg0, float arg1, int arg2) {Log.d("k", "onPageScrolled - " + arg0);//从1到2滑动,在1滑动前调用}@Overridepublic 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{@Overridepublic void destroyItem(View arg0, int arg1, Object arg2) {Log.d("k", "destroyItem");((ViewPager) arg0).removeView(mListViews.get(arg1));}@Overridepublic void finishUpdate(View arg0) {Log.d("k", "finishUpdate");}@Overridepublic int getCount() {Log.d("k", "getCount");return mListViews.size();}@Overridepublic Object instantiateItem(View arg0, int arg1) {Log.d("k", "instantiateItem");((ViewPager) arg0).addView(mListViews.get(arg1),0);return mListViews.get(arg1);}@Overridepublic boolean isViewFromObject(View arg0, Object arg1) {Log.d("k", "isViewFromObject");return arg0==(arg1);}@Overridepublic void restoreState(Parcelable arg0, ClassLoader arg1) {Log.d("k", "restoreState");}@Overridepublic Parcelable saveState() {Log.d("k", "saveState");return null;}@Overridepublic void startUpdate(View arg0) {Log.d("k", "startUpdate");}        }}
?在实机上测试后,非常流畅,这也就是说官方版的左右滑屏控件已经实现目前,关于viewpager的文章非常少,本文是通过阅读viewpager源代码分析出的写法当然此文章仅是抛砖引玉,而且属于框架式程序,目的就是让读者了解API的基本用法希望这篇原创文章对大家有帮助欢迎感兴趣的朋友一起讨论共同学习,共同进步

热点排行