Android自定义View——自定义ViewPager

来源:互联网 发布:怎么清除dnf异常数据 编辑:程序博客网 时间:2024/06/05 01:02

本篇内容:

第一部分:自定义ViewGroup的使用手势识别器和Scroller滑动

第二部分:处理滑动监听,处理滑动冲突,增加ViewPager的指示器

基础概念:

常见的滑动冲突外部滑动方向和内部滑动方向不一致、外部滑动方向和内部滑动方向一致。

我们自定义的ViewPager如果在其中一页中存在ListView,那么就需要解决滑动冲突的问题。

由于系统自带ViewPager中,自己已经解决了滑动冲突。


第一部分:自定义ViewGroup的使用手势识别器和Scroller滑动

步骤一:创建一个类,继承ViewGroup,由于ViewPager里面包含多个子View,所以继承这个类,实现onLayout方法

onLayout:这个方法是对我们该View的一个位置摆放,这里可以看到onLayout这(int l,int t,int r,int b)这四个参数,分别代表着这个ViewPager的左上右下的位置,由于你引用ViewPager是match_parent,所以l和t为0,r和b为宽和高的距离

[java] view plain copy
  1. public class MyViewPager extends ViewGroup{  
  2.     public MyViewPager(Context context) {  
  3.         super(context);  
  4.     }  
  5.   
  6.     public MyViewPager(Context context, AttributeSet attrs) {  
  7.         super(context, attrs);  
  8.     }  
  9.   
  10.     public MyViewPager(Context context, AttributeSet attrs, int defStyleAttr) {  
  11.         super(context, attrs, defStyleAttr);  
  12.     }  
  13.   
  14.     @Override  
  15.     protected void onLayout(boolean changed, int l, int t, int r, int b) {  
  16.   
  17.     }  
  18. }  
步骤二:我们在自己的Activity中引用自定义的这个组件

[java] view plain copy
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     android:layout_width="match_parent"  
  3.     android:layout_height="match_parent">  
  4.     <com.handsome.app2.View.Custom.MyViewPager  
  5.         android:layout_width="match_parent"  
  6.         android:id="@+id/vp_my"  
  7.         android:layout_height="match_parent"/>  
  8. </RelativeLayout>  
步骤三:复制几张图片作为演示,并为他们创建Id数组
[java] view plain copy
  1. private int[] image_id = {R.drawable.guide_map1,R.drawable.guide_map2,R.drawable.guide_map3,R.drawable.guide_map4};  
步骤四:接着我们需要对图片进行初始化,并加入到ViewPager中,我们写个初始化方法,并将他们放在构造方法中

[java] view plain copy
  1. public MyViewPager(Context context) {  
  2.     super(context);  
  3.     initView();  
  4. }  
  5.   
  6. public MyViewPager(Context context, AttributeSet attrs) {  
  7.     super(context, attrs);  
  8.     initView();  
  9. }  
  10.   
  11. public MyViewPager(Context context, AttributeSet attrs, int defStyleAttr) {  
  12.     super(context, attrs, defStyleAttr);  
  13.     initView();  
  14. }  
  15.   
  16. private void initView(){  
  17.     for (int i=0;i<image_id.length;i++){  
  18.         ImageView iv = new ImageView(getContext());  
  19.         iv.setBackgroundResource(image_id[i]);  
  20.         this.addView(iv);  
  21.     }  
  22. }  
步骤五:这个时候,启动程序,你是看不到有图片出现的,因为你还没有对这几张图片进行位置的摆放,所以需要在onLayout中进行位置处理
[java] view plain copy
  1. @Override  
  2. protected void onLayout(boolean changed, int l, int t, int r, int b) {  
  3.     for (int i = 0; i < image_id.length; i++) {  
  4.         this.getChildAt(i).layout(i * getWidth(), t, (i + 1) * getWidth(), b);  
  5.     }  
  6. }  
这样处理的好处就是将图片一字排开


步骤六:现在已经排好了图片,接着我们就来处理滑动事件了,我们通过一个手势识别器自动帮我们识别滑动事件

[java] view plain copy
  1. private GestureDetector mDetector ;  
[java] view plain copy
  1. mDetector = new GestureDetector(new SimpleOnGestureListener(){  
  2.     @Override  
  3.     public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {  
  4.         //scrollBy:相对滑动,相对我们当前的控件多少距离,就滑动多少距离  
  5.         //distanceX是我们手滑动的距离,即我们的手相对控件滑动了多少,所以X轴滑动这个距离,Y轴滑动0  
  6.         scrollBy((int)distanceX,0);  
  7.         return super.onScroll(e1, e2, distanceX, distanceY);  
  8.     }  
  9. });  

通过onTouchEvent委托给手势识别器,并且返回true,让这个控件消耗这个事件






宁波整形美容医院http:// www.iyestar.com/

原创粉丝点击