码迷,mamicode.com
首页 > 其他好文 > 详细

ViewPage 大圣归来 原生示例

时间:2016-04-21 22:01:50      阅读:339      评论:0      收藏:0      [点我收藏+]

标签:


VP简介

android-support-v4.jar 是谷歌官方给我们提供的一个兼容低版本安卓设备的软件包,里面包囊了只有在安卓3.0以上可以使用的api。而ViewPage就是其中之一,利用它,我们可以做很多事情,从最简单的导航,到页面菜单等等。

ViewPager类提供了多界面切换的新效果,新效果有如下特征:
  • <1>当前显示一组界面中的其中一个界面;
  • <2>当用户通过左右滑动界面时,当前的屏幕显示当前界面和下一个界面的一部分;
  • <3>滑动结束后,界面自动跳转到当前选择的界面中。
该jar包一般存在于android SDK目录sdk\extras\android\support\v4下面
android.support.v4.view.PagerTitleStrip 用来显示顶部标题

PageAdapter回调方法

PagerAdapter回调方法细节

  • pagerAdapter是默认预加载前后共3张图片的
  • 当显示第一页时,调用两次instantiateItem方法,分别加载第一页,预加载第二页,instantiateItem的参数position的值,先是0然后是1;
  • 当滑动到第二页时,只调用一次instantiateItem方法,是因为本页已经在之前预加载过了,所以会直接从ViewGroup中取出第二页用于显示,同时会预加载第三页,所以这时instantiateItem的参数position的值为2
  • 当滑动到第三页时,由于第三页也已经预加载过了,所以也会直接从ViewGroup中取出第三页用于显示,由于后面没有图片了,所以不会再调用instantiateItem方法
  • 但注意,这时会调用destroyItem方法,销毁ViewGroup中的第一页照片,此时destroyItem的参数position的值为0
注意以下情况: 
  • 若getCount()返回为“0”,则viewpage上不会显示任何照片(也不报错),也不能滑动(其实是没效果)
  • 若getCount()返回为“1”,则viewpage上只显示第一张照片,也不能滑动(等于就是一个item了)
  • 若getCount()返回为“2”,则viewpage上只显示前两张照片(只能在两者间滑动)
  • 正常情况下,滑动到最后一张照片时不能再向前划到第一张,当然第一张图片时也不能向后划到最后一张
而要想首尾可以无限制的前后滑动,需满足三个条件
  • getCount()的返回值要足够大(否则滑动到一定次数后向前就划不动了)
  • 要保证首先加载的position足够大,可使用viewpage.setCurrentItem(3000000)设置
  • 当然也要保证首先加载的是第一张图片,使用position=position % mList.size()替换所有用到的position参数的值
 技术分享  技术分享 

Activity
public class MainActivity extends Activity implements OnTouchListener, OnPageChangeListener, OnClickListener, OnGlobalLayoutListener {
    public static final int MARGIN_BETWEEN_POINTS = 30;
    private ViewPager vp;
    private MyPagerAdapter mAdapter;
    private ArrayList<ItemBean> mList;
    private TextView image_desc;//图片的描述信息
    private Button btn_start;
    //圆点
    private RelativeLayout point;//所有小圆点的父控件
    private LinearLayout ll_point_group;//三个小圆点的父控件
    private View view_red_point;//小红点
    private int mPointWidth;//小圆点间的距离
    //利用消息机制自动滚动
    private Handler mHandler = new Handler() {
        public void handleMessage(Message msg) {
            vp.setCurrentItem(vp.getCurrentItem() + 1);//让viewPager 滑动到下一页
            mHandler.sendEmptyMessageDelayed(0, 3000);//接收到消息后再发一条消息,于是一个死循环诞生了
        };
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);//设置全屏  
        setContentView(R.layout.activity_main);
        vp = (ViewPager) findViewById(R.id.vp);
        point = (RelativeLayout) findViewById(R.id.point);
        ll_point_group = (LinearLayout) findViewById(R.id.ll_point_group);
        view_red_point = findViewById(R.id.view_red_point);
        btn_start = (Button) findViewById(R.id.btn_start);
        image_desc = (TextView) findViewById(R.id.image_desc);
        btn_start.setOnClickListener(this);
        mList = new ArrayList<ItemBean>();
        mList.add(new ItemBean(R.drawable.guide_1"欢迎使用大圣手机卫士""1111111"));
        mList.add(new ItemBean(R.drawable.guide_2"作者:包青天""22222222"));
        mList.add(new ItemBean(R.drawable.guide_3"QQ:909120849""3333333"));
        mList.add(new ItemBean(R.drawable.guide_4"2015-11-19""444444"));
        // 初始化引导页的小圆点
        for (int i = 0; i < mList.size(); i++) {
            View point = new View(this);
            point.setBackgroundResource(R.drawable.shape_point_gray);
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(20, 20);//设置圆点大小
            params.leftMargin = MARGIN_BETWEEN_POINTS;// 为保证居中对齐,同时设置圆点的左右Margin值
            params.rightMargin = MARGIN_BETWEEN_POINTS;
            point.setLayoutParams(params);
            ll_point_group.addView(point);
        }
        mAdapter = new MyPagerAdapter(thismList);
        vp.setAdapter(mAdapter);
        vp.setOnPageChangeListener(this);
        vp.setOnTouchListener(this);
        vp.setCurrentItem(120);//求公倍数:1*2*3*4*5=120
        mHandler.sendEmptyMessageDelayed(0, 3000);//3秒后发送空消息
        //对小圆点父控件layout结束事件进行监听。
        point.getViewTreeObserver().addOnGlobalLayoutListener(this);
    }
    //**************************************************************************************************************************
    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        //参数为:当前条目位置,当前条目移动的百分比(每次都是0-100%),移动距离(每次都是0-item的width)
        position = position % mList.size();
        //小红点动态移动的距离
        int leftMargin;
        //最后一个条目时,不再继续向后移动
        if (position == mList.size() - 1) {
            leftMargin = position * mPointWidth + MARGIN_BETWEEN_POINTS;
        } else {
            leftMargin = (int) (mPointWidth * positionOffset) + position * mPointWidth + MARGIN_BETWEEN_POINTS;
        }
        RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) view_red_point.getLayoutParams();
        params.leftMargin = leftMargin;
        view_red_point.setLayoutParams(params);
    }
    @Override
    public void onPageSelected(int position) {
        position = position % mList.size();
        image_desc.setText(mList.get(position).desscription);
        if (position == mList.size() - 1) btn_start.setVisibility(View.VISIBLE);
        else btn_start.setVisibility(View.GONE);
    }
    @Override
    public void onPageScrollStateChanged(int state) {
    }
    @Override
    // 当按下条目时停止切换
    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN://按下
            mHandler.removeCallbacksAndMessages(null);// 删除Handler中的所有消息
            break;
        case MotionEvent.ACTION_UP://抬起
            mHandler.sendEmptyMessageDelayed(0, 3000);
            break;
        case MotionEvent.ACTION_CANCEL://事件取消,即按下后手指移到了其他地方才松开
            mHandler.sendEmptyMessageDelayed(0, 3000);
            break;
        default:
            break;
        }
        return false;//代表事件没被消耗掉了,可以被其他控件继续获取到,一定要返回false,否则会导致ViewPager的滑动切换功能失效
    }
    @Override
    public void onClick(View v) {
        Toast.makeText(MainActivity.this"欢迎使用大圣手机卫士", Toast.LENGTH_SHORT).show();
    }
    @Override
    public void onGlobalLayout() {
        //使用完必须撤销监听(只测量一次),否则,会一直不停的不定时的测量(一秒七八次左右),这比较耗性能
        point.getViewTreeObserver().removeOnGlobalLayoutListener(this);//removeGlobalOnLayoutListener(this);废弃了
        //获取小圆点间的距离,即小红点每次移动的距离
        mPointWidth = ll_point_group.getChildAt(1).getLeft() - ll_point_group.getChildAt(0).getLeft();
    }
}

Adapter
public class MyPagerAdapter extends PagerAdapter {
    private Context mContext;
    private ArrayList<ItemBean> mList;;
    public MyPagerAdapter(Context mContext, ArrayList<ItemBean> mList) {
        this.mContext = mContext;
        this.mList = mList;
    }
    //设置当前页面的标题
    public CharSequence getPageTitle(int position) {
        position = position % mList.size();
        return mList.get(position).titleString;
    }
    public int getCount() {
        return Integer.MAX_VALUE;
    }
    // 判断是否是同一条目
    public boolean isViewFromObject(View view, Object object) {
        return view == object;
    }
    // 初始化要显示的条目
    public Object instantiateItem(ViewGroup container, int position) {
        position = position % mList.size();
        ImageView imageView = new ImageView(mContext);
        imageView.setImageResource(mList.get(position).imgId);
        container.addView(imageView);//一定将要显示的条目加入到ViewGroup的缓存容器中才可以显示
        return imageView;//然后作为返回值返回
    }
    //将要销毁的条目从ViewGroup的缓存容器中移除
    public void destroyItem(ViewGroup container, int position, Object object) {
        position = position % mList.size();
        container.removeView((View) object);
    }
}

布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    <android.support.v4.view.ViewPager
        android:id="@+id/vp"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
        <android.support.v4.view.PagerTitleStrip
            android:id="@+id/pt_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </android.support.v4.view.ViewPager>
    <TextView
        android:id="@+id/image_desc"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerInParent="true"
        android:background="#30f0"
        android:gravity="center"
        android:text="我是描述信息"
        android:textColor="#f00"
        android:textSize="20sp" />
    <Button
        android:id="@+id/btn_start"
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="100dp"
        android:background="@drawable/btn_bg_selector"
        android:text="  开 始 体 验  "
        android:textSize="13sp"
        android:visibility="gone" />
    <RelativeLayout
        android:id="@+id/point"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="20dp" >
        <LinearLayout
            android:id="@+id/ll_point_group"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal" />
        <View
            android:id="@+id/view_red_point"
            android:layout_width="20px"
            android:layout_height="20px"
            android:background="@drawable/shape_point_red" />
    </RelativeLayout>
</RelativeLayout>





附件列表

     

    ViewPage 大圣归来 原生示例

    标签:

    原文地址:http://www.cnblogs.com/baiqiantao/p/5418729.html

    (0)
    (0)
       
    举报
    评论 一句话评论(0
    登录后才能评论!
    © 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
    迷上了代码!