`

ViewPager与PagerAdapter实现页面滑动效果

 
阅读更多

 样例:

 
      
 

1  主要的Activity 实现 

 

/**
 * ViewPager 的使用
 */
public class ViewPagerActivity extends Activity {
	
	    private ViewPager mPager;  
	    private List<View> listViews;   
	    private ImageView cursor;  
	    private TextView t1, t2, t3;  
	    private int offset = 0;//移动条图片的偏移量  
	    private int currIndex = 0;//当前页面的编号  
	    private int bmpWidth;// 移动条图片的长度  
	      
	      
	    @Override  
	    protected void onCreate(Bundle savedInstanceState) {  
	        super.onCreate(savedInstanceState);  
	        setContentView(R.layout.activity_view_pager);  
	        initCursorPos();  
	        initView();       
	    }  
	      
	    //完成View组件的初始化,并将三个view动态地添加到Adapter对象中  
	    //然后调用setAdapter将view集合与ViewPager绑定,设置进去的页面  
	    //指向第一个页面setCurrentItem(0),最后设置onclick和onPageChange监听器  
	    public void initView()  
	    {  
	        mPager = (ViewPager) findViewById(R.id.vPager);  
	        t1 = (TextView) findViewById(R.id.text1);  
	        t2 = (TextView) findViewById(R.id.text2);  
	        t3 = (TextView) findViewById(R.id.text3);     
	          
	        listViews = new ArrayList<View>();  
	        LayoutInflater mInflater = getLayoutInflater();  
	        listViews.add(mInflater.inflate(R.layout.activity_view_pager2, null));  
	        listViews.add(mInflater.inflate(R.layout.activity_view_pager3, null));  
	        listViews.add(mInflater.inflate(R.layout.activity_view_pager4, null));  
	        
	        mPager.setAdapter(new MyPageAdapter(listViews));  
	        mPager.setCurrentItem(0);  
	          
	          
	        t1.setOnClickListener(new MyClickListener(0));  
	        t2.setOnClickListener(new MyClickListener(1));  
	        t3.setOnClickListener(new MyClickListener(2));  
	        mPager.setOnPageChangeListener(new MyOnPageChangeListener());  
	    }  
	      
	    //初始化指示器的位置,就是下面那个移动条一开始放的地方  
	    public void initCursorPos() {   
	        cursor = (ImageView) findViewById(R.id.cursor);  
	        bmpWidth = BitmapFactory.decodeResource(getResources(), R.drawable.gdt)  
	                .getWidth();// 获取图片宽度  
	        DisplayMetrics dm = new DisplayMetrics();  
	        getWindowManager().getDefaultDisplay().getMetrics(dm);  
	        int screenW = dm.widthPixels;// 获取分辨率宽度  
	        offset = (screenW / 3 - bmpWidth) / 2;// 计算偏移量  
	        Matrix matrix = new Matrix();  
	        matrix.postTranslate(offset, 0);  
	        cursor.setImageMatrix(matrix);// 设置动画初始位置  
	    }    
	      
	    //设置点击事件,点击上面文字切换页面的  
	    public class MyClickListener implements OnClickListener  
	    {  
	        private int index = 0;  
	        public MyClickListener(int i)  
	        {  
	            index = i;  
	        }  
	          
	        @Override  
	        public void onClick(View arg0) {  
	            mPager.setCurrentItem(index);             
	        }  
	          
	    }  
	      
	      
	    //监听页面切换时间,主要做的是动画处理,就是移动条的移动  
	    public class MyOnPageChangeListener implements OnPageChangeListener {  
	        int one = offset * 2 + bmpWidth;// 移动一页的偏移量,比如1->2,或者2->3  (这个数值等于一个导航条的宽度)
	        int two = one * 2;// 移动两页的偏移量,比如1直接跳3  
	  
	        @Override  
	        public void onPageSelected(int index) {  
	            Animation animation = null;  
	            //index为当前选择的是哪个页面  
	            switch (index) {  
	            case 0:  
	                if (currIndex == 1) {  
	                    animation = new TranslateAnimation(one, 0, 0, 0);  
	                } else if (currIndex == 2) {  
	                    animation = new TranslateAnimation(two, 0, 0, 0);  
	                }  
	                break;  
	            case 1:  
	                if (currIndex == 0) {  
	                    animation = new TranslateAnimation(offset, one, 0, 0);  
	                } else if (currIndex == 2) {  
	                    animation = new TranslateAnimation(two, one, 0, 0);  
	                }  
	                break;  
	            case 2:  
	                if (currIndex == 0) {  
	                    animation = new TranslateAnimation(offset, two, 0, 0);  
	                } else if (currIndex == 1) {  
	                    animation = new TranslateAnimation(one, two, 0, 0);  
	                }  
	                break;  
	            }  
	            currIndex = index;  
	            animation.setFillAfter(true);// true表示图片停在动画结束位置  
	            animation.setDuration(300); //设置动画时间为300毫秒  
	            cursor.startAnimation(animation);//开始动画  
	        }  
	  
	        @Override  
	        public void onPageScrollStateChanged(int arg0) {}  
	  
	        @Override  
	        public void onPageScrolled(int arg0, float arg1, int arg2) {}  
	      
	    } 
}

 

2  PagerAdapter 类

public class MyPageAdapter extends PagerAdapter {  
  
    private List<View> viewLists;      
  
    public MyPageAdapter() {}     
    public MyPageAdapter(List<View> viewLists)  
    {  
        super();  
        this.viewLists = viewLists;  
    }  
      
     //获得viewpager中有多少个view
    @Override  
    public int getCount() {       
        return viewLists.size();  
    }  
    
    /**
     * 通常这么写就可以了
     */
    @Override  
    public boolean isViewFromObject(View view, Object object) {  
        return view == object;  
    }  
     
    /**
     *     ①将给定位置的view添加到ViewGroup(容器)中,创建并显示出来
     *     ②返回一个代表新增页面的Object(key),通常都是直接返回view本身就可以了,
     */
    @Override  
    public Object instantiateItem(ViewGroup container, int position) {  
        container.addView(viewLists.get(position));  
        return viewLists.get(position);  
    }  
  
    //移除一个给定位置的页面。
    @Override  
    public void destroyItem(ViewGroup container, int position, Object object) {  
        container.removeView(viewLists.get(position));  
    }  
}

 3 xml 

   

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    xmlns:tools="http://schemas.android.com/tools"  
    android:id="@+id/LinearLayout1"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent"  
    android:orientation="vertical" >  
  
    <LinearLayout  
        android:id="@+id/linearLayout1"  
        android:layout_width="fill_parent"  
        android:layout_height="60dp"  
        android:background="#FFFFFF" >  
  
        <TextView  
            android:id="@+id/text1"  
            android:layout_width="fill_parent"  
            android:layout_height="fill_parent"  
            android:layout_weight="1.0"  
            android:gravity="center"  
            android:text="红色" />  
  
        <TextView  
            android:id="@+id/text2"  
            android:layout_width="fill_parent"  
            android:layout_height="fill_parent"  
            android:layout_weight="1.0"  
            android:gravity="center"  
            android:text="蓝色"/>  
  
        <TextView  
            android:id="@+id/text3"  
            android:layout_width="fill_parent"  
            android:layout_height="fill_parent"  
            android:layout_weight="1.0"  
            android:gravity="center"  
            android:text="黄色" />  
    </LinearLayout>  
  
    <ImageView  
        android:id="@+id/cursor"  
        android:layout_width="fill_parent"  
        android:layout_height="wrap_content"  
        android:scaleType="matrix"  
        android:src="@drawable/gdt" />  
  
    <android.support.v4.view.ViewPager  
        android:id="@+id/vPager"  
        android:layout_width="wrap_content"  
        android:layout_height="0dp"  
        android:layout_gravity="center"  
        android:layout_weight="1.0"  
        android:flipInterval="30"  
        android:persistentDrawingCache="animation" />  
  
</LinearLayout> 

 4 每一个pager中的4个xml都差不多一样,只贴一个

  

<?xml version="1.0" encoding="utf-8"?>  
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent"  
    android:orientation="vertical"  
    android:gravity="center"   
    android:background="#FF6666">      
    <TextView   
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:text="第一个Page"      
    />  
</LinearLayout> 

 

 

 

 

  • 大小: 2.7 KB
分享到:
评论

相关推荐

    viewpager + PagerAdapter刷新数据

    - 可以使用`setCurrentItem(int item)`方法来切换到特定的页面,或者`addOnPageChangeListener()`来监听页面滑动事件。 4. **优化性能** - 为了提高性能,ViewPager会预加载相邻的页面。可以通过`...

    ViewPager嵌套GridView实现横向滑动效果

    通过以上步骤,你就可以在Android应用中实现`ViewPager`嵌套`GridView`的横向滑动效果了。`QyDemo`这个项目文件很可能是包含此示例代码的压缩包,你可以下载并参考其源码学习具体的实现细节。记住,实践是最好的老师...

    TabLayout+ViewPager+Fragment实现分页滑动效果Demo

    `ViewPager`通常与`PagerAdapter`或`FragmentPagerAdapter`一起使用,以便加载和管理页面内容。 `Fragment`是Android应用中的一个可重用的UI组件,它可以嵌入到Activity中,有自己的生命周期和UI布局。在分页滑动的...

    ViewPager实现屏幕滑动效果源码

    在这个实例中,我们将深入理解`ViewPager`的工作原理,以及如何在Android项目中使用它来实现屏幕滑动效果。 `ViewPager`是`PagerAdapter`接口的一个实现,这个接口是专门为`ViewPager`设计的,允许开发者自定义数据...

    ViewPager无限循环左右滑动效果

    本教程将详细讲解如何实现ViewPager的无限循环左右滑动效果。 首先,我们需要了解ViewPager的基本用法。ViewPager是Android Support Library中的一个控件,它允许用户通过水平滑动手势在多个页面之间切换。每个页面...

    Android ViewPager实现圆点导航左右滑动和Fragment页面切换

    这是`ViewPager`的一个接口,用于监听页面滑动的事件。我们可以实现`onPageScrolled()`, `onPageSelected()`, `onPageScrollStateChanged()`这三个方法,分别在页面滚动、选择页面和页面滚动状态改变时触发。在我们...

    RadioButton和ViewPager实现页面滑动效果

    通过以上步骤,我们可以实现一个功能完备的基于RadioButton和ViewPager的页面滑动效果。这种方式不仅提供了清晰的页面切换指示,还使得用户可以通过点击或滑动两种方式自由切换页面,增强了交互性和可用性。同时,...

    Android ViewPager和Fragment 实现滑动切换页面

    在Android应用开发中,`ViewPager`和`Fragment`是两个重要的组件,它们常被结合使用以实现用户界面的滑动切换效果。`ViewPager`提供了一个可以左右滑动查看多个页面的容器,而`Fragment`则作为Activity的部分内容,...

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

    总的来说,通过ViewPager和自定义的PageTransformer、PagerAdapter以及布局设计,我们可以实现一个具有微信标题栏滑动效果的应用。同时,通过适配器和事件监听,可以动态显示带有消息提示的红色实心圆,提供更好的...

    ViewPager和Fragment结合实现页面滑动,以及欢迎页

    总结,通过结合使用ViewPager和Fragment,开发者可以构建出功能丰富的、动态的页面滑动效果,同时实现如欢迎页这样的特殊需求。在实际开发中,需要注意性能优化,如合理使用FragmentStatePagerAdapter以处理Fragment...

    viewpager一屏多个滑动效果

    3. 至于"电影3d"标签可能意味着这种3D效果与电影海报展示或者电影预告片播放相关,可以创建一个包含多个ImageView或者自定义View的PagerAdapter,每个页面显示一张电影海报,并结合3D滑动效果,让用户在浏览时有...

    使用ViewPager+Fragment实现页面点击切换和手势滑动

    它主要用于实现水平方向上的页面滑动,非常适合用于创建类似Tab布局或展示一系列相关的屏幕内容。在使用ViewPager时,我们需要为它提供一个适配器,通常是继承自`PagerAdapter`或`FragmentPagerAdapter`,以便在不同...

    ViewPager实现自定义左右滑动效果

    在Android开发中,ViewPager是一个非常重要的组件,常用于创建滑动页面效果,它可以承载多个页面并且用户可以通过左右滑动来切换。在这个实例中,我们将会探讨如何使用ViewPager来实现一个Activity加载多个自定义...

    使用ViewPager和Fragment实现底部导航滑动重构版

    总之,"使用ViewPager和Fragment实现底部导航滑动重构版"是一个关于如何在Android应用中创建底部导航滑动效果的实践教程。通过结合`ViewPager`的平滑滑动和`Fragment`的灵活性,我们可以构建出高效且用户友好的多...

    ViewPager手动滑动和自动滑动无限循环滑动加载.zip

    在Android开发中,ViewPager是一个非常重要的组件,常用于实现页面滑动效果,比如在应用的引导页、轮播图或内容切换场景。本资源“ViewPager手动滑动和自动滑动无限循环滑动加载.zip”提供了如何使ViewPager实现手动...

    viewpager+fragment实现界面滑动,里面附带说明和截图

    总结,通过`ViewPager`和`Fragment`的结合使用,我们可以轻松创建出具有多页面滑动效果的应用界面。这不仅提高了应用的用户体验,还简化了开发者的工作。同时,结合具体的示例代码和截图,学习和实施这一技术将变得...

    android_viewPager左右滑动_实现光标动态滑动效果

    总结起来,实现"android_viewPager左右滑动_实现光标动态滑动效果"的关键在于理解ViewPager的工作原理,创建自定义光标View,并在页面滑动时准确更新光标的位置。通过这样的实践,开发者可以创建出更加交互友好、...

    android viewpager滑动效果

    ViewPager的滑动效果通常通过PageTransformer来实现,这是一个接口,定义了方法`transformPage(View page, float position)`,用于在页面滑动时应用变换效果。`page`参数代表当前正在滑动的页面,`position`参数表示...

    Viewpager与tab之间的滑动

    本项目中,开发者创建了一个自定义的`HorizontalScrollView`控件,并将其与`ViewPager`结合,模拟了Tab的左右滑动效果,同时对`ViewPager`的滑动行为进行了定制,以达到特定的需求。 首先,`ViewPager`是Android ...

    Android ViewPager和Fragment实现仿微信导航界面及滑动效果

    在Android应用开发中,创建一个类似微信的导航界面和滑动效果是常见的需求,这涉及到对ViewPager和Fragment的深入理解与应用。`ViewPager`是Android SDK中的一个组件,主要用于展示可滑动的页面集合,而`Fragment`则...

Global site tag (gtag.js) - Google Analytics