Android自定义View——自定义ViewPager

  • Post author:
  • Post category:其他




本篇内容:




第一部分:自定义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为宽和高的距离






  1. public




    class


    MyViewPager


    extends


    ViewGroup{



  2. public


    MyViewPager(Context context) {



  3. super


    (context);


  4. }



  5. public


    MyViewPager(Context context, AttributeSet attrs) {



  6. super


    (context, attrs);


  7. }



  8. public


    MyViewPager(Context context, AttributeSet attrs,


    int


    defStyleAttr) {



  9. super


    (context, attrs, defStyleAttr);


  10. }



  11. @Override





  12. protected




    void


    onLayout(


    boolean


    changed,


    int


    l,


    int


    t,


    int


    r,


    int


    b) {



  13. }

  14. }


步骤二:我们在自己的Activity中


引用


自定义的这个组件





  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数组




  1. private




    int


    [] image_id = {R.drawable.guide_map1,R.drawable.guide_map2,R.drawable.guide_map3,R.drawable.guide_map4};


步骤四:接着我们需要对图片进行


初始化


,并加入到ViewPager中,我们写个初始化方法,并将他们放在构造方法中





  1. public


    MyViewPager(Context context) {



  2. super


    (context);


  3. initView();

  4. }



  5. public


    MyViewPager(Context context, AttributeSet attrs) {



  6. super


    (context, attrs);


  7. initView();

  8. }



  9. public


    MyViewPager(Context context, AttributeSet attrs,


    int


    defStyleAttr) {



  10. super


    (context, attrs, defStyleAttr);


  11. initView();

  12. }



  13. private




    void


    initView(){



  14. for


    (


    int


    i=


    0


    ;i<image_id.length;i++){


  15. ImageView iv =

    new


    ImageView(getContext());


  16. iv.setBackgroundResource(image_id[i]);


  17. this


    .addView(iv);


  18. }

  19. }


步骤五:这个时候,启动程序,


你是看不到有图片出现的


,因为你还没有对这几张图片进行位置的摆放,所以需要在onLayout中进行位置处理



  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. }


这样处理的好处就是将图片


一字排开











步骤六:现在已经排好了图片,接着我们就来处理


滑动事件


了,我们通过一个


手势识别器


自动帮我们识别滑动事件



  1. private


    GestureDetector mDetector ;



  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/



版权声明:本文为mmp591原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。