首页 > 其他 > 详细

实现Viewpager切换界面导航栏水波纹动画效果

时间:2015-03-27 20:04:35      阅读:437      评论:0      收藏:0      [点我收藏+]

       实现效果:

      技术分享

该控件防百度阅读的导向栏进行研究,具体细节尚有不足,希望大家多多指点点击打开链接


     Viewpager的滑动,引起标题栏的渐变。主要渐变过程要先画线,再画点。

     画线过程:

        利用path和PathMeasure类,画出一条曲线,moveto方法画起始点,quadTo方法画中间控制点和终点,由于现在是水平移动,中间控制点的坐标一般选图片最上端和

    最下端。画出曲线。利用PathMeasure的getPosTan方法,获取在这个线上长度为传入第一个参数的长度的点的坐标,从而接着画图片上的点。

       画线具体代码:

      

 @Override
    public void buildPaths(float endX, float endY) {
        if (mBmpWidth <= 0 || mBmpHeight <= 0) {
            throw new IllegalArgumentException(
                    "Bitmap size must be > 0, did you call setBitmapSize(int, int) method?");
        }
        mFirstPathMeasure.setPath(mFirstPath, false);
        mSecondPathMeasure.setPath(mSecondPath, false);

        float w = mBmpWidth;
        float h = mBmpHeight;

        mFirstPath.reset();
        mSecondPath.reset();
        mFirstPath.moveTo(0, h/2-10);
        mSecondPath.moveTo(0, h/2+10);
        
//        Log.i("yunli", "endX = " + endX + ",endY = " + endY +",w = " + w + ",h = " + h);
        mFirstPath.quadTo((endX ) / 4, 10, endX/2, 10);
        mSecondPath.quadTo((endX ) / 4, h-10, endX/2, h-10);

        mFirstPath.quadTo((3*endX ) / 4, 10, endX, endY-4);
        mSecondPath.quadTo((3*endX ) / 4,h-10, endX, endY+4);
    }
画图片:

      按照画出的曲线进行画图,也就是填充点,主要利用贝塞尔曲线绘画和PathMeasure的getPosTan方法获取指定长度点的坐标:

     代码如下:

 

 @Override
    public void buildMeshes(int timeIndex) {
//    	long temp = System.currentTimeMillis();
        if (mBmpWidth <= 0 || mBmpHeight <= 0) {
            throw new IllegalArgumentException(
                    "Bitmap size must be > 0, did you call setBitmapSize(int, int) method?");
        }
        mFirstPathMeasure.setPath(mFirstPath, false);
        mSecondPathMeasure.setPath(mSecondPath, false);

        int index = 0;
        float[] pos1 = {0.0f, 0.0f};
        float[] pos2 = {0.0f, 0.0f};
        float firstLen = mFirstPathMeasure.getLength();
        float secondLen = mSecondPathMeasure.getLength();
        float len1 = firstLen / mHorizontalSplit;
        float len2 = secondLen / mHorizontalSplit;

        float firstPointDist = timeIndex * len1;
        float secondPointDist = timeIndex * len2;

        for (int x = 0; x <= mHorizontalSplit; x++) {
            mFirstPathMeasure.getPosTan(x * len1 + firstPointDist, pos1, null);
            mSecondPathMeasure.getPosTan(x * len2  + secondPointDist , pos2, null);
            
            float fx1 = pos1[0];
            float fx2 = pos2[0];
            float fy1 = pos1[1];
            float fy2 = pos2[1];

            float dy = fy2 - fy1;
            float dx = fx2 - fx1;

            for (int y = 0; y <= mVerticalSplit; y++) {
                float fx = dx * y / mVerticalSplit;
                float fy = dy * y / mVerticalSplit;
                mVertices[index * 2 + 0] = fx + fx1;
                mVertices[index * 2 + 1] = fy + fy1;
                index += 1;
            }
        }
    }
  由于双向动画,需定义左右两个Mesh,利用View的OnDraw方法绘画,canvas的drawBitmapMesh方法填充
<span style="font-size:18px;"><span style="white-space:pre">	</span>mVertices<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">所有的点</span></span>

最后附上资源下载链接。

     http://download.csdn.net/detail/ahjxly/8539677

    

实现Viewpager切换界面导航栏水波纹动画效果

原文:http://blog.csdn.net/ahjxly/article/details/44679353

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!