zoukankan      html  css  js  c++  java
  • Android之ViewPager 第一课

        想要了解Android新版本的的新特性,从头开始吧,这是Android3.0新加入的widget,以前也接触过,但是没有好好的研究过,今天写了一个小程序,研究一下ViewPager。

        这个程序是支持左右滑动的View,核心是ViewPager。讲解都在注释中进行。

       代码如下:

       MainActivity.java:

    package com.android3;
    
    
    import android.annotation.SuppressLint;
    import android.content.Intent;
    import android.graphics.BitmapFactory;
    import android.graphics.Matrix;
    import android.os.Bundle;
    import android.support.v4.view.ViewPager;
    import android.support.v7.app.AppCompatActivity;
    import android.support.v7.widget.Toolbar;
    import android.util.DisplayMetrics;
    import android.view.Gravity;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.animation.Animation;
    import android.view.animation.TranslateAnimation;
    import android.widget.Button;
    import android.widget.ImageView;
    import android.widget.LinearLayout;
    import android.widget.TextView;
    
    import java.util.ArrayList;
    import java.util.List;
    
    
    
    
    public class MainActivity extends AppCompatActivity implements View.OnClickListener, ViewPager.OnPageChangeListener {
        private ViewPager viewPager;
        private ArrayList<View> viewList;
        private List<String> titleList;
        private MyPagerAdapter adapter;
        private ImageView cursor;
        private LinearLayout titleBar;
        private float cursorW= 0;
        private float offset = 0;
        private float currentIndex = 0;
        private float screenW = 0;
        private float currentX = 0;
        private float fScreenW;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            initToolbar();
            initViewPager();
        }
    
        /**
         * ViewPager 保证 缓存中存在三个视图,即 左边 右边 和中间 隔一个的灰被destroy,
         */
        @SuppressLint("InflateParams")
        private void initViewPager() {
            viewPager = (ViewPager) findViewById(R.id.viewpager);
            titleBar = (LinearLayout) findViewById(R.id.titleBar);
            LayoutInflater inflater = getLayoutInflater();
            //创建四个View
            View view1 = inflater.inflate(R.layout.viewpage_01, null);
            View view2 = inflater.inflate(R.layout.viewpage_02, null);
            View view3 = inflater.inflate(R.layout.viewpage_03, null);
            View view4 = inflater.inflate(R.layout.viewpage_04, null);
    
            viewList = new ArrayList<>();// 将要分页显示的View装入数组中
            viewList.add(view1);
            viewList.add(view2);
            viewList.add(view3);
            viewList.add(view4);
            adapter = new MyPagerAdapter(viewList);
            titleList = new ArrayList<>();
            titleList.add("第一页面");
            titleList.add("第二页面");
            titleList.add("第三页面");
            titleList.add("第四页面");
            for (int i = 0; i < titleList.size(); i++) {
                TextView textView = new TextView(this);
                LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
                params.weight = 1;
                params.setMargins(5, 3, 5, 3);
                textView.setLayoutParams(params);
                textView.setText(titleList.get(i));
                textView.setTextSize(15);
                textView.setGravity(Gravity.CENTER);
                titleBar.addView(textView);
            }
    
            initCursorPos();   //初始化指示器位置
    
            viewPager.setAdapter(adapter);//绑定适配器
            viewPager.addOnPageChangeListener(this); //注 : setOnPageChangeListener 过时
        }
    
        /**
         *  单位px
         */
        public void initCursorPos() {
            // 初始化动画
            cursor = (ImageView) findViewById(R.id.cursor);
            cursorW= BitmapFactory.decodeResource(getResources(), R.mipmap.cursor).getWidth();// 获取图片宽度
            DisplayMetrics dm = new DisplayMetrics();
            getWindowManager().getDefaultDisplay().getMetrics(dm);
            screenW = dm.widthPixels;// 获取分辨率宽度
            fScreenW=screenW / viewList.size();
            offset = (fScreenW - cursorW) / 2;// 计算偏移量
            Matrix matrix = new Matrix();
            matrix.postTranslate(offset, 0);
            cursor.setImageMatrix(matrix);// 设置动画初始位置   ###原始位置
            currentX = offset;
        }
    
        private void initToolbar() {
            Toolbar mToolbar = (Toolbar) findViewById(R.id.toolbar);
            Button btnRight = (Button) mToolbar.findViewById(R.id.btnRight);
            mToolbar.setTitle("");
            mToolbar.setNavigationIcon(R.mipmap.back);
            setSupportActionBar(mToolbar);
            mToolbar.setNavigationOnClickListener(this);
            btnRight.setOnClickListener(this);
        }
    
    
        @Override
        public void onClick(View view) {
            switch (view.getId()) {
                case -1:
                    finish();
                    break;
                case R.id.btnRight:
                    Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                    startActivity(intent);
                    break;
            }
        }
    
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        }
    
      
        @Override
        public void onPageSelected(int position) {
            float X=fScreenW*position; //在此页面中,滑块位置和原始位置的距离
            //currentX 当前位置和原始位置的距离
            TranslateAnimation animation = new TranslateAnimation(currentX, X, 0, 0);
            /**
             *  public TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta) {
             *  throw new RuntimeException("Stub!");
             * }
             * 在X轴方向:
             * fromXDelta  动画从原始位置+fromXDelta开始
             * 
             * toXDelta   动画从原始位置+toXDelta结束
             * 
             *  在Y轴方向:
             * fromYDelta  动画从原始位置+fromYDelta开始
             *
             * toYDelta   动画从原始位置+toYDelta结束
             * 
             * 
             */
            currentX=fScreenW*position;//更新当前位置
            currentIndex = position;//保存上一个View编号
            animation.setFillAfter(true);//保存动画
            animation.setDuration(300);//动画持续时间
            cursor.startAnimation(animation);//开始
        }
    
        @Override
        public void onPageScrollStateChanged(int state) {
    
        }
    }

     MyPagerAdapter.java

    package com.android3;
    
    import android.support.v4.view.PagerAdapter;
    import android.view.View;
    import android.view.ViewGroup;
    
    import java.util.List;
    
    /**
     *
     * Created by Administrator on 2016/10/25.
     */
    
    public class MyPagerAdapter extends PagerAdapter {
       private List<View> list=null;
        //通过构造函数将装有View的集合传入适配器
        MyPagerAdapter(List<View> list){
            this.list=list;
        }
    
        /**
         *
         * @return 将要显示的View的总个数
         */
        @Override
        public int getCount() {
            return list.size();
        }
    
        /**
         *
         * 该方法  判断Key与View是否是正确的映射关系
         *
         * 而且在同一个容器中不能有相同的key传入,否则行为会错乱
         * @param view
         * @param object
         * @return
         */
        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view==object;
        }
    
        /**
         * 因为ViewPager 容器中只保存当前位置的View和相邻的View,当在容器中的View的编号位置距离当前位置超过1,
         * 就对该View进行移除
         * @param container 容器
         * @param position  即将失去的View位置
         * @param object
         */
        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            container.removeView(list.get(position));
        }
    
        /**
         *
         * 首先判断当前位置的左右view是否在容器中,如果不在,则调用instantiateItem方法将相邻的view(之前不在容器中)加入容器中;
         * 返回此View,作为映射的Key
         *
         * @param container 容器
         * @param position  位置 从0开始
         * @return  view对应的Key
         */
        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            container.addView(list.get(position));
            return list.get(position);
        }
    }

      

      activity_main.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/activity_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="com.android3.MainActivity">
    
        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary">
    
            <TextView
                android:id="@+id/tv_toolbar"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:text="@string/title"
                android:textColor="#ffffff"
                android:textSize="14sp"
                android:textStyle="bold" />
    
            <Button
                android:id="@+id/btnRight"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="end"
                android:layout_marginRight="10dp"
                android:text="@string/submit"
                android:textColor="#ffffff"
                android:textSize="12sp"
                android:textStyle="bold" />
        </android.support.v7.widget.Toolbar>
    
        <LinearLayout
            android:id="@+id/content"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_below="@id/toolbar"
            android:orientation="vertical">
    
            <LinearLayout
                android:id="@+id/titleBar"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@color/colorAccent"
                android:orientation="horizontal" />
    
            <ImageView
                android:id="@+id/cursor"
                android:layout_width="match_parent"
                android:layout_height="5dp"
                android:scaleType="matrix"
                android:src="@mipmap/cursor" />
    
            <android.support.v4.view.ViewPager
                android:id="@+id/viewpager"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center"/>
        </LinearLayout>
    
    </RelativeLayout>

      viewPager_01.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:background="#ffffff"
        android:orientation="vertical">
    </LinearLayout>
    

      viewpager_02.xml,viewpager_03.xml,viewpager_04.xml  (略)只是背景颜色不同.

    代码下载http://download.csdn.net/detail/qq_25059501/9664066

         

    作者: 小淘气儿

    出处: http://www.cnblogs.com/xiaotaoqi/p/5996742.html/>

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出.

  • 相关阅读:
    数据库事务隔离级别-- 脏读、幻读、不可重复读
    【洛谷7518】[省选联考 2021 A/B 卷] 宝石(树上倍增+并查集)
    【CF666D】Chain Reaction(暴搜+细节讨论)
    【洛谷5064】[Ynoi2014] 等这场战争结束之后(操作树+值域分块)
    【洛谷7437】既见君子(状压+矩阵树定理)
    【洛谷5046】[Ynoi2019 模拟赛] Yuno loves sqrt technology I(分块)
    【LOJ2462】「2018 集训队互测 Day 1」完美的集合(树上连通块问题+扩展卢卡斯)
    【洛谷4339】[ZJOI2018] 迷宫(神仙题)
    【CF639E】Bear and Paradox(贪心+二分)
    【洛谷5444】[APIO2019] 奇怪装置(数论)
  • 原文地址:https://www.cnblogs.com/xiaotaoqi/p/5996742.html
Copyright © 2011-2022 走看看