关于安卓android开发,屏幕做出滑动效果

最近花了好多时间纠结在安卓实现界面滑动效果的制作,因为我只要求部分layout跟随触屏动作做出滑动效果而不是整个Activity,所以找相关代码是煞费苦心啊……

最终,在CSDN你某位先人提供的资源中找到相关代码。

附上地址:http://download.csdn.net/detail/thirteenmonth/3730756

下载了该资源导入之后,如果稍微有学习过一点安卓的知识的话应该很快就会知道该代码的大概机制。当然,关于其中ScrollLayout没有注释的问题可能会对该文件代码的理解造成很大的困难。我也是花费了整整一个晚上去查SDK才大概了解了各个函数的作用和实现该效果的具体步骤。

关于滑动的代码内容,下了代码看看基本就能知道怎么用。无非就是修改一下XML,复制scrollLayout文件,就应该能实现对应的滑动效果。在这里我想讲的是我花费了又一个晚上整理出来的对这个滑动代码的改进。

首先,运行了该代码之后会发现,在这个小程序中,供使用者滑动的界面板块数是和你XML文件里面所添加在滑动块里面的layout块的个数是一样(这个程序默认是有5个可以改变的页面)。当到最左端或者最右端的时候,就会出现滑出边界的黑幕。这样的界面显然是不友好的。那么如何改进呢?由于我的初衷就是利用这个效果的代码做一个只有三个界面,但是用户无论怎么滑都不会到达边界的效果。于是乎,我在scrollLayout里面想找到一处地方进行修改。花了我一个晚上,终于发现所有的滑动效果实现都会进过一个函数——snapToScreen(int whichScreen);(在这个函数中的调试才让我知道原来手机屏幕的横向大小是320px(像素吧?))。下面主要就是解说这个函数的内容了!

这是修改前的代码。

public void snapToScreen(int whichScreen) {   
        // get the valid layout page   
        whichScreen = Math.max(0, Math.min(whichScreen, getChildCount()-1));   
        if (getScrollX() != (whichScreen*getWidth())) {   
            final int delta = whichScreen*getWidth()-getScrollX();   
            mScroller.startScroll(getScrollX(), 0,    
                    delta, 0, Math.abs(delta)*2);   
            mCurScreen = whichScreen;   
            invalidate();       // Redraw the layout   
        }   
    }

whichScreen变量是用来记录当前应该现实第几个页面才合适的数字(0、1、2……)后面的赋值语句看似复杂,其实就是判断这个数值是不是最大值(个数-1)或者最小值(0),如果不是则不修改,否则赋值边界值(0或最大值)给whichScreen。接着是判断语句,当当前滚动条的位置坐标不是确切适合显示的子视图坐标的时候就执行。(一般都不可能达到准确的合适的坐标……)判断执行块里面的内容是,产生一个delta的变量储存当前子视图偏离需要显示的视图的左边距的坐标是多少,然后通过Scroller的starScroll函数进行视图滑动特效。该函数有五个参数,第一、二个是视图滑动起始的横坐标和纵坐标,第三、第四个则是滑动的距离(可以是负数),最后一个参数是完成这个滑动过程需要的时间。这个函数的详解可以查询SDK翻译得知。该函数是实现整个屏幕滑动效果最重要的函数!

接下来是变量赋值mCurScreen是记录当前屏幕所显示的是第几个子视图,这个在下一个视图判断的时候需要调用判断。

最后就是重画了。

按照上面这个函数的操作和该文件中的其他代码的配合,最终就只能实现一个有限屏的滑动效果。下面是我自己针对这个函数的修改,做成的一个模拟循环屏滑动的代码。

public void snapToScreen(int whichScreen)  
   {   
       // get the valid layout page   
       whichScreen = Math.max(0, Math.min(whichScreen, getChildCount()-1));  //计算当前应该显示的是第几个子窗体(0、1、2……) 
       if (getScrollX() != (whichScreen*getWidth()))//判断当前子窗体是否停在准确位置,不准确则运行  
       {   
           int Pwidth=320; 
           if(whichScreen==2)X=getScrollX()-Pwidth; 
           if(whichScreen==0)X=getScrollX()+Pwidth;      
           final int delta = getWidth()-X;//记录当前距离标准位置坐标的距离 
           mScroller.startScroll(X, 0,    
                   delta, 0, Math.abs(delta)*2);  //设置子窗体滑动的横向起点、纵向起点、横向位移、纵向位移、移动时间(微秒)       
           mCurScreen = 1; 
           Log.e(TAG, "moving to screen "+mCurScreen); 
           invalidate();       // Redraw the layout 
           System.out.println("重画结束"); 
       }   
   }

函数中的320是屏幕的宽度,单位是px吧,这个数值可以通过调用getWidth()函数获得,我所实现的是一个3屏循环滑动的效果,所以在执行滑动之前我需要判断经过其他函数判断之后希望显示的是第一屏还是第三屏,然后对滑动条starScroll函数的起始坐标进行相应的修改,由于只有三个屏,所以我只需要让每次滑动的起始坐标偏移一个屏的距离就行了。比如:当用户向左滑动想跳转到第三屏的时候,那么就让其实坐标跳到第一屏的相应位置然后实现向左滑屏,结果依旧显示的是第二屏,但是对于用户看来就是滑动了一个屏,当然,在实现滑动之前要把各屏的内容向左刷新一遍,即第一屏的内容变成原来第二屏的内容,第二屏的内容变成原来第三屏的内容,这样才不会让用户发现这个技巧……

如果屏比较多的话,则考虑将Pwidth的值变为320*k来实现

到这里,利用滚动条实现循环滑屏的介绍就结束了。因为我是新手,我所能做的就是利用我能最快找到的函数实现我所需要的功能,所以在代码上可能完全无质量可谈,这点还望高手指点。

下面附上我自己查SDK之后注释的scrollLayout.java文档,免分的,谢谢!

地址:http://download.csdn.net/detail/w542525174/4087623