一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Android 实现局部图片滑动指引效果

时间:2017-03-05 编辑:简简单单 来源:一聚教程网

Android 实现局部图片滑动指引效果

而ViewPager的事件监听器代码如下:

 代码如下复制代码

// 滑动页面更改事件监听器

privateclassImagePageChangeListenerimplementsOnPageChangeListener {

  @Override

  publicvoidonPageScrollStateChanged(intarg0) {

    // TODO Auto-generated method stub

 

  }

 

  @Override

  publicvoidonPageScrolled(intarg0,floatarg1,intarg2) {

    // TODO Auto-generated method stub

 

  }

 

  @Override

  publicvoidonPageSelected(intindex) {

    pageIndex = index;

    slideLayout.setPageIndex(index);

    tvSlideTitle.setText(parser.getSlideTitles()[index]);

     

    for(inti =0; i < imageCircleViews.length; i++) {

      imageCircleViews[index].setBackgroundResource(R.drawable.dot_selected);

       

      if(index != i) {

        imageCircleViews[i].setBackgroundResource(R.drawable.dot_none);

      }

    }

  }

}

事件监听器中主要在回调函数onPageSelected(int index)中变换标题和圆点图片。 

由于滑动区域下方的内容是不变的,也就是不滑动的,正如在我在上面提到的,内容可能会超出屏幕的范围,所以我们需要使用ScrollView以便内容过多的时候显示滚动条。可能一部分朋友会想到,要显示滚动条我也知道使用ScrollView。我想在这里说的是,这里即有ViewPager控件,也有ScrollView,如果两个View单独使用不会有什么问题。然而不幸的是,两个一结合使用就出现了问题。什么问题呢?就是在滑动图片时出现反弹的现象,就是在滑动时很难滑动,我滑动时感觉很吃力,而且图片就是滑动不过去,这个就是两个View之间的冲突,因为两个View都是滑动的View,都会计算相应的位置和判断相应的距离。 

我们如何来解决这个冲突呢?这里我们需要重写ScrollView的onInterceptTouchEvent()回调函数。需要在程序里新加一个ScrollViewExtend类并继承自ScrollView,下面是其代码:

 代码如下复制代码

packagecom.image.indicator.control;

 

importandroid.content.Context;

importandroid.util.AttributeSet;

importandroid.view.MotionEvent;

importandroid.widget.ScrollView;

 

/**

 * 能够兼容ViewPager的ScrollView

 * @Description: 解决了ViewPager在ScrollView中的滑动反弹问题

 

 * @File: ViewPagerCompatScrollView.java

 

 * @Package com.image.indicator.control

 

 * @Author Hanyonglu

 

 * @Date 2012-6-18 下午01:34:50

 

 * @Version V1.0

 */

publicclassScrollViewExtendextendsScrollView {

  // 滑动距离及坐标

  privatefloatxDistance, yDistance, xLast, yLast;

 

  publicScrollViewExtend(Context context, AttributeSet attrs) {

    super(context, attrs);

  }

 

  @Override

  publicbooleanonInterceptTouchEvent(MotionEvent ev) {

    switch(ev.getAction()) {

      caseMotionEvent.ACTION_DOWN:

        xDistance = yDistance = 0f;

        xLast = ev.getX();

        yLast = ev.getY();

        break;

      caseMotionEvent.ACTION_MOVE:

        finalfloatcurX = ev.getX();

        finalfloatcurY = ev.getY();

         

        xDistance += Math.abs(curX - xLast);

        yDistance += Math.abs(curY - yLast);

        xLast = curX;

        yLast = curY;

         

        if(xDistance > yDistance){

          returnfalse;

        }

    }

 

    returnsuper.onInterceptTouchEvent(ev);

  }

}

热门栏目