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


    一、我们能够使用ViewPager做什么:

    1、ViewPager制作APP第一次使用时出现的导航介绍,外加底部圆点的效果,比方微信等非常多导航。

    2、页卡滑动,加上菜单的效果,一般这些都支持手势也支持底部图标点击

    3、ViewPager+Fragment能够做出多页面滑动效果,让我们的应用程序界面操作起来更加灵活。

    先看看几个效果图:

    1、使用导航,外加底部圆点的效果,比方新浪。


        

    2、页卡滑动,加上菜单的效果。


    3、ViewPager+Fragment能够做出多页面滑动效果。



    二、我们如今主要讲讲另外一种方式:页卡滑动,加上菜单的效果。

    ViewPager。它是google SDk中自带的一个附加包的一个类,能够用来实现屏幕间的切换。

    这个附加包是android-support-v4.jar,这是谷歌官方给我们提供的一个兼容低版本号安卓设备的软件包,里面包囊了仅仅有在安卓3.0以上能够使用的api。而viewpager就是当中之中的一个利用它,我们能够做非常多事情,从最简单的导航,到页面菜单等等。那怎样使用它呢,与LisstView类似,我们也须要一个适配器,他就是PagerAdapter。

    ViewPager的功能就是能够使视图滑动,就像Lanucher左右滑动那样。

    1、我们先做界面,

    界面设计非常easy,第一行三个头标,第二行动绘图片,第三行页卡内容展示。

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:umadsdk="http://schemas.android.com/apk/res/com.LoveBus"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >
    
        <LinearLayout
            android:id="@+id/linearLayout1"
            android:layout_width="fill_parent"
            android:layout_height="100.0dip"
            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="页卡1"
                android:textColor="#000000"
                android:textSize="22.0dip" />
    
            <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="页卡2"
                android:textColor="#000000"
                android:textSize="22.0dip" />
    
            <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="页卡3"
                android:textColor="#000000"
                android:textSize="22.0dip" />
        </LinearLayout>
    
        <ImageView
            android:id="@+id/cursor"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:scaleType="matrix"
            android:src="@drawable/a" />
    
        <android.support.v4.view.ViewPager
            android:id="@+id/vPager"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_weight="1.0"
            android:background="#000000"
            android:flipInterval="30"
            android:persistentDrawingCache="animation" />
    
    </LinearLayout>

    我们要展示三个页卡,所以还须要三个页卡内容的界面设计,这里我们仅仅设置了背景颜色,能起到差别作用就可以。

    <?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:background="#158684" >
    </LinearLayout>

    2、代码实现部分

    (1) 先来变量的定义

    private ViewPager mPager;//页卡内容
        private List<View> listViews; // Tab页面列表
        private ImageView cursor;// 动绘图片
        private TextView t1, t2, t3;// 页卡头标
        private int offset = 0;// 动绘图片偏移量
        private int currIndex = 0;// 当前页卡编号
        private int bmpW;// 动绘图片宽度

    (2) 初始化头标

    /**
         * 初始化头标
    */
        private void InitTextView() {
            t1 = (TextView) findViewById(R.id.text1);
            t2 = (TextView) findViewById(R.id.text2);
            t3 = (TextView) findViewById(R.id.text3);
    
            t1.setOnClickListener(new MyOnClickListener(0));
            t2.setOnClickListener(new MyOnClickListener(1));
            t3.setOnClickListener(new MyOnClickListener(2));
        }


    /**
         * 头标点击监听
    */
        public class MyOnClickListener implements View.OnClickListener {
            private int index = 0;
    
            public MyOnClickListener(int i) {
                index = i;
            }
    
            @Override
            public void onClick(View v) {
                mPager.setCurrentItem(index);
            }
        };

    (3) 初始化页卡内容区
    /**
         * 初始化ViewPager
    */
        private void InitViewPager() {
            mPager = (ViewPager) findViewById(R.id.vPager);
            listViews = new ArrayList<View>();
            LayoutInflater mInflater = getLayoutInflater();
            listViews.add(mInflater.inflate(R.layout.lay1, null));
            listViews.add(mInflater.inflate(R.layout.lay2, null));
            listViews.add(mInflater.inflate(R.layout.lay3, null));
            mPager.setAdapter(new MyPagerAdapter(listViews));
            mPager.setCurrentItem(0);
            mPager.setOnPageChangeListener(new MyOnPageChangeListener());
        }

    我们将三个页卡界面装入当中,默认显示第一个页卡。这里我们还须要实现一个适配器,这里我们实现了各页卡的装入和卸载

    /**
         * ViewPager适配器
    */
        public class MyPagerAdapter extends PagerAdapter {
            public List<View> mListViews;
    
            public MyPagerAdapter(List<View> mListViews) {
                this.mListViews = mListViews;
            }
    
            @Override
            public void destroyItem(View arg0, int arg1, Object arg2) {
                ((ViewPager) arg0).removeView(mListViews.get(arg1));
            }
    
            @Override
            public void finishUpdate(View arg0) {
            }
    
            @Override
            public int getCount() {
                return mListViews.size();
            }
    
            @Override
            public Object instantiateItem(View arg0, int arg1) {
                ((ViewPager) arg0).addView(mListViews.get(arg1), 0);
                return mListViews.get(arg1);
            }
    
            @Override
            public boolean isViewFromObject(View arg0, Object arg1) {
                return arg0 == (arg1);
            }
    
            @Override
            public void restoreState(Parcelable arg0, ClassLoader arg1) {
            }
    
            @Override
            public Parcelable saveState() {
                return null;
            }
    
            @Override
            public void startUpdate(View arg0) {
            }
        }


    (3) 初始化动画

    /**
         * 初始化动画
    */
        private void InitImageView() {
            cursor = (ImageView) findViewById(R.id.cursor);
            bmpW = BitmapFactory.decodeResource(getResources(), R.drawable.a)
                    .getWidth();// 获取图片宽度
            DisplayMetrics dm = new DisplayMetrics();
            getWindowManager().getDefaultDisplay().getMetrics(dm);
            int screenW = dm.widthPixels;// 获取分辨率宽度
            offset = (screenW / 3 - bmpW) / 2;// 计算偏移量
            Matrix matrix = new Matrix();
            matrix.postTranslate(offset, 0);
            cursor.setImageMatrix(matrix);// 设置动画初始位置
        }

    实现页卡切换监听

    /**
         * 页卡切换监听
    */
        public class MyOnPageChangeListener implements OnPageChangeListener {
    
            int one = offset * 2 + bmpW;// 页卡1 -> 页卡2 偏移量
            int two = one * 2;// 页卡1 -> 页卡3 偏移量
    
            @Override
            public void onPageSelected(int arg0) {
                Animation animation = null;
                switch (arg0) {
                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 = arg0;
                animation.setFillAfter(true);// True:图片停在动画结束位置
                animation.setDuration(300);
                cursor.startAnimation(animation);
            }
    
            @Override
            public void onPageScrolled(int arg0, float arg1, int arg2) {
            }
    
            @Override
            public void onPageScrollStateChanged(int arg0) {
            }
        }


  • 相关阅读:
    输出1-100 , 奇数偶数分别添加标识(for循环语句嵌套if-else语句)
    输出 1-100 内的奇数和偶数,并对其分别求和(while嵌套if-else循环)
    1至100累加求和问题
    淡旺季机票的价格问题(switch语句与if-else语句嵌套)
    (折扣计算)需求说明:普通顾客购物满100元打9折;会员购物打8折;会员购物满200元打7.5折(判断语句if-else和switch语句的嵌套结
    随机产生1-12的整数 , 根据产生整数输出一下该月份的季节信息(Math.random()和if语句的应用)
    在Hibernate单向一对多关联关系中的org.hibernate.StaleStateException 异常。
    关于Hibernate的报错org.hibernate.MappingException: Unknown entity
    Hibernate多对一关联关系
    关于映射异常org.hibernate.MappingException: An association from the table DUTY_INFO refers to an unmapped class: com.pms.entities.other.Department的原因。
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/3788563.html
Copyright © 2020-2023  润新知