zoukankan      html  css  js  c++  java
  • Android开发——View滑动的三种实现方式

    0. 前言  

    Android开发中,我们常常需要View滑动实现一些绚丽的效果来优化用户体验。一般View的滑动可以用三种方式实现。

    转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/52473373


    1.   ScrollTo/ScrollBy

    View提供了ScrollTo/ScrollBy专门用于View滑动,前者作用是将View的左上角坐标置为设定值,后者看下面源码可以看出,实现的是基于当前位置的相对滑动。源码展示如下:

     public void scrollTo(int x, int y) {//滑动目标点坐标  
          if (mScrollX != x || mScrollY != y) {  
              int oldX = mScrollX;
              int oldY = mScrollY; 
              mScrollX = x;  
              mScrollY = y;  
             invalidateParentCaches();  
              onScrollChanged(mScrollX, mScrollY, oldX, oldY);  
              if (!awakenScrollBars()) {  
                   postInvalidateOnAnimation();  
               }  
          }  
      }  
    
     public void scrollTo(int x, int y){
        scrollTo(mScrollX + x, mScrollY + y);
    }
    


    这里需要注意的是,View的两个属性mScrollXmScrollY,分别可通过getScrollX和getScrollX方法获得。

    考虑一种情境,我们需要滑动一副充满屏幕的图片,如果手指向左滑,图片已经滑出左侧屏幕,左上角横坐标已经为负了,但是我们在处理滑动的onScroll()中,其参数distanceX是正的,同时mScrollX值也是正的,这和我们平时知道的屏幕坐标系是相反的。Y轴也一样是反的 。

     

    那么我们使用onScroll和scrollBy来实现手指滑动图片的效果:

    @Override  
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {  
          scrollBy((int) distanceX, 0);  
          return true;  
    }  
    


    总结:

    (1)简单方便,不会影响元素单击事件

    (2)scrollTo()和scrollBy()移动的只是View的内容,并不能移动View本身,背景当然也是不移动的。

     

    2.    动画

    动画可以实现非常复杂的动画效果,当然也可以实现View滑动的效果,原理是改变translationXtranslationY的值。使用属性动画实例如下,View动画的例子略:

    //使用属性动画,将View在1秒内向右平移50个像素
    ObjectAnimator.ofFloat(mView, ""translationX", 0 , 50).setDuration(1000).start();
    

    需要注意的是,View动画有一个显著的缺点,那就是只对View的影像做操作,不会真正改变View的位置参数,因此可能对滑动后的新位置Button的点击事件失去响应。在系统眼里,这个Button没有发生任何改变。

    但是Android3.0以后属性动画解决了这个问题,3.0以下的可以通过设置两个按钮,并在恰当的时刻通过view.setVisibility间接解决该问题。

    在动画的进行过程中,我们还可以设置监听器监听动画完成每一帧时,动画完成的比例。这样我们就可以完成更多的业务逻辑。

    animator.addUpdateListener(new AnimatorUpdateListener(){
        //动画完成一帧即回调
        @override
        public void onAnimationUpdate(ValueAnimator animator){
        //获取动画完成比例
        float faction = animator.getAnimatedFraction();
        //完成其他效果
      }
    });

    3.    改变布局参数

    改变布局参数的方式,使用起来比较麻烦,因为需要具体情况具体实现。但是它是一种非常灵活的方法。具体理解起来也不难,原理就是改变控件的LayoutParams

    使用举例:

    //将按钮右移100像素的例子
    MarginLayoutParams params = (MarginLayoutParams)mButton.getLayoutParams();
    params.leftMargin += 100;
    mButton.setLayoutParams(params);
    


    至此对于如何实现View滑动的三种方式整理完毕

    转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/52473373


  • 相关阅读:
    在网页中实现flash全屏的几种方法
    flashdevelop生成的swf如何支持能打开本地文件
    getPreferredSize()、setPreferredSize()、getSize()、setSize()、revalidate()、pack()
    Flash字体嵌入方法
    NOPI 基本读写
    调整图片的透明度,以及把透明背景改为其他颜色的方法
    查看表空间大小
    浅谈电子商务b2c商城中的用户体验
    使用方法的返回值进行注入
    有关nginx upstream的五种分配方式
  • 原文地址:https://www.cnblogs.com/qitian1/p/6461517.html
Copyright © 2011-2022 走看看