前面通过共享参数已经能够顺利的从广告页跳转到引导页,现在到了引导页,如何对引导页进行布局呢?引导页一般有三张,利用到了一个传统成熟的控件Viewpager,它在v4包里面,v4包可以保证低版本的手机也可以使用这个控价,兼容性更强。 首先来看下布局layout
<?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:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.wj.administrator.layout.activity.LeadActivity"> <android.support.v4.view.ViewPager android:id="@+id/lead" android:layout_width="match_parent" android:layout_height="match_parent"> </android.support.v4.view.ViewPager> </RelativeLayout>
在整个页面中就一个viewpager,高宽充满屏幕。viewpager里面只需要定义好宽高,定义好id,这一类控件不需要添加图,内容,这一类控件是有适配器的控件,它的所有内容都写在适配件里,它的内容用代码设置。比如滑动多少张图。
1.在布局中中代码就这么简单。2.在java中代码也很简单,1.只需要找到这个控件的对象2.设置和适配器绑定。3.在适配的是比较难得,代码都在里边。首先每一个这样的控件都有指定的适配器,其次要有数据的集合,还有就是一般来说加上增加或者移除的代码。这样就是
1.下面看具体过程首先是在activty中找到该控价,并且设置适配器,与适配器绑定,new了一个适配器,同时传了一个参数。集合list
ArrayList<View> list=new ArrayList<View>();
LeadAdapter Adapter=new LeadAdapter(list); vp =(ViewPager)findViewById(R.id.lead); vp.setAdapter(Adapter);
2.第二创建了一个java文件leadadapter继承Pageradapter,里面一共有四个放法,下面依次介绍:
(1)第一个放法getcount()是获取数量。返回值是多少代表它有多少滑页。
(2)第二个方法是一个固定写法isViewFromObject()有两个参数,view==object就可以了,主要就是你传给viewpager是不是view的孩子。这样写就行了
(3)第三个方法是instantiateItem()加载子页内容,条目的意思。就是往viewpager里面添加布局,有两个参数第一个是viewpager容器对象,第二个参数是当前第几页,从0开始。它必须还要添加一个方法addview()。container.addView(list.get(position));就是当前要展示那一页。
(4)第四个方法是destroyItem(),这个方法什么意思那,就是viewpager有一个最大容量(预加载数量),默认是三页,如果超过了就会报错,放不下了,这个时候必须把旧的移除。它的意思是移除当前显示的页面container.removeView(list.get(position));
destroyItem(ViewGroup container, int position, Object object),这个object是做匹配的,是不是要移除那个子条目。
public class LeadAdapter extends PagerAdapter { private ArrayList<View> list; public LeadAdapter(ArrayList<View> list) { this.list=list; } @Override public int getCount() { return list.size(); } @Override public boolean isViewFromObject(View view, Object object) { return view==object; } @Override public Object instantiateItem(ViewGroup container, int position) { container.addView(list.get(position)); return list.get(position); } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView(list.get(position)); } }
3.创造数据源:我们的图片不是在布局里面viewpager里添加的,而是在activty里面自己通过代码动态加载,那么如何创造出来那:就是这样下面这个,先new一个控件,然后在setimageResourse();再添加到集合里面,这样资源就有了
ImageView vi=new ImageView(this);
vi.setImageResource(R.drawable.yindao1);
ArrayList<View> list=new ArrayList<View>(); ImageView vi=new ImageView(this); vi.setImageResource(R.drawable.yindao1); list.add(vi); ImageView v2=new ImageView(this); v2.setImageResource(R.drawable.yindao2); list.add(v2); ImageView v3=new ImageView(this); v3.setImageResource(R.drawable.yindao3); list.add(v3); ImageView v4=new ImageView(this); v4.setImageResource(R.drawable.yindao41); list.add(v4);
4.现在已经可以滑动了,不知道大家看见没有viewpager滑动的时候图片下面有几个小点点,代表滑动到了哪一页,此时我们需要给它设定一个滑动监听addOnPageChangeListenner()这个监听,里面有三个方法。第一个方法是代表当前正在滚动onPageScrolled(),它的滚动坐标。第二个方法就是我们需要在里面设定了点点换色,onPageSelected(),这个方法说明它已经换页了,这个时候就可以换小点点的颜色了,第三个方法onPageScrollStateChanged(),滑动状态改变。在这里我没有换了。
vp.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { state =position; } @Override public void onPageScrollStateChanged(int state) { } });
5.滑到最后一面我要做一个滑动跳转,此时滑到最后一面已经滑不动了,如何滑动可以跳转呢?
此时我们可以给viewpager设计一个手势。setOnTouchListener(),这个监听就可以了,所有view都可以写上触摸。里面就一个方法onTouch(),里面有两个参数,view和MotionEvent,首先采用event获取动作,获取的是一个MotionEvent.ACTION_DOWN,按下的动作,记录下开始x坐标,在获取手抬起来的时候记录下X坐标,两者相减大于屏幕的一半就发生跳转,同时结束引导页。state是第三页这个方法才响应,好了写到这里就基本完成了引导页了。
vp.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if(state==3) { if (event.getAction() == MotionEvent.ACTION_DOWN) { start_x = event.getX(); } else if (event.getAction() == MotionEvent.ACTION_UP) { end_x = event.getX(); } if ((start_x - end_x )>= 0.5 * width()) { Intent in = new Intent(LeadActivity.this, MainActivity.class); startActivity(in); finish(); } } return false; } }); }
//这个activty里面的全部代码。
public class LeadActivity extends BaseActivity implements View.OnClickListener { private ViewPager vp; private float start_x=0; private float end_x=0; private int state; @Override public void setview() { setContentView(R.layout.activity_lead); } public int width() { Resources resources = this.getResources(); DisplayMetrics dm = resources.getDisplayMetrics(); float density = dm.density; int width = dm.widthPixels; return width; } @Override public void initview() { ArrayList<View> list=new ArrayList<View>(); ImageView vi=new ImageView(this); vi.setImageResource(R.drawable.yindao1); list.add(vi); ImageView v2=new ImageView(this); v2.setImageResource(R.drawable.yindao2); list.add(v2); ImageView v3=new ImageView(this); v3.setImageResource(R.drawable.yindao3); list.add(v3); ImageView v4=new ImageView(this); v4.setImageResource(R.drawable.yindao41); list.add(v4); LeadAdapter Adapter=new LeadAdapter(list); vp =(ViewPager)findViewById(R.id.lead); vp.setAdapter(Adapter); vp.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { state =position; } @Override public void onPageScrollStateChanged(int state) { } }); vp.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if(state==3) { if (event.getAction() == MotionEvent.ACTION_DOWN) { start_x = event.getX(); } else if (event.getAction() == MotionEvent.ACTION_UP) { end_x = event.getX(); } if ((start_x - end_x )>= 0.5 * width()) { Intent in = new Intent(LeadActivity.this, MainActivity.class); startActivity(in); finish(); } } return false; } }); } @Override public void onClick(View v) { } }