ViewPage 大圣归来 原生示例

编程入门 行业动态 更新时间:2024-10-26 16:35:27

ViewPage <a href=https://www.elefans.com/category/jswz/34/999301.html style=大圣归来 原生示例"/>

ViewPage 大圣归来 原生示例


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 用来显示顶部标题 PagerAdapter的官方文档地址: .html 
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(this, mList);           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=""       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>     


来自为知笔记(Wiz)

附件列表

 

更多推荐

ViewPage 大圣归来 原生示例

本文发布于:2024-03-13 10:49:42,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1733820.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:大圣   示例   ViewPage

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!