Android FoldingLayout 折叠布局 原理及实现

Posted Coding_the_world

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android FoldingLayout 折叠布局 原理及实现相关的知识,希望对你有一定的参考价值。

转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/44283093 ,本文出自: 【张鸿洋的博客】

1、概述

在上一篇Android FoldingLayout 折叠布局 原理及实现(一)我们实现了下面的1,2,3。

1、Matrix的setPolyToPoly使用

2、在图片上使用渐变和阴影

3、初步的FoldingLayout的实现,完成图片的折叠显示(可控制折叠次数、包含阴影的绘制)

4、引入手势,手指可以可以FoldingLayout的折叠

5、结合DrawerLayout实现折叠式侧滑

6、结合SlidingPaneLayout实现折叠式侧滑

本篇博客将继续完成4,5,6的内容。

上一篇博客中,我们实现了在一个自定义View种绘制我们的折叠图片,使用的是一个固定的图片,当然我们在实际使用中,希望可以折叠某一个布局而不是一张固定的图片。

所以首先我们把上一篇的博客进行修改,改为一个自定义的ViewGroup,我们叫做FoldLayout。

2、FoldLayout的实现


1、实现

我们的想法是这样的,我们的FoldLayout只能有一个直接子元素,当然这个子元素可以是RelativeLayout什么的,可以很复杂。然后只要外层套了我们的FoldLayout,就能实现折叠效果。

那么也就是说,我们的FoldLayout折叠效果展示的是它的子元素的“样子”,那么如何或者这个“样子”呢?

大家都知道,我们的ViewGroup有个方法叫做:dispatchDraw(Canvas)主要用来绘制子元素,我们可以对这个canvas进行设置matrix,以及重复调用dispatchDraw(Canvas)来实现类似上篇博客最后的效果,这样就完成了我们的可行性的分析。

[java]  view plain  copy  
  1. package com.zhy.view;  
  2.   
  3. import android.content.Context;  
  4. import android.graphics.Bitmap;  
  5. import android.graphics.Bitmap.Config;  
  6. import android.graphics.Canvas;  
  7. import android.graphics.Color;  
  8. import android.graphics.LinearGradient;  
  9. import android.graphics.Matrix;  
  10. import android.graphics.Paint;  
  11. import android.graphics.Paint.Style;  
  12. import android.graphics.Shader.TileMode;  
  13. import android.util.AttributeSet;  
  14. import android.view.View;  
  15. import android.view.ViewGroup;  
  16.   
  17. public class FoldLayout extends ViewGroup  
  18.   
  19.   
  20.     private static final int NUM_OF_POINT = 8;  
  21.     /** 
  22.      * 图片的折叠后的总宽度 
  23.      */  
  24.     private float mTranslateDis;  
  25.   
  26.     protected float mFactor = 0.6f;  
  27.   
  28.     private int mNumOfFolds = 8;  
  29.   
  30.     private Matrix[] mMatrices = new Matrix[mNumOfFolds];  
  31.   
  32.     private Paint mSolidPaint;  
  33.   
  34.     private Paint mShadowPaint;  
  35.     private Matrix mShadowGradientMatrix;  
  36.     private LinearGradient mShadowGradientShader;  
  37.   
  38.     private float mFlodWidth;  
  39.     private float mTranslateDisPerFlod;  
  40.   
  41.     public FoldLayout(Context context)  
  42.       
  43.         this(context, null);  
  44.       
  45.   
  46.     public FoldLayout(Context context, AttributeSet attrs)  
  47.       
  48.         super(context, attrs);  
  49.   
  50.         for (int i = 0; i < mNumOfFolds; i++)  
  51.           
  52.             mMatrices[i] = new Matrix();  
  53.           
  54.   
  55.         mSolidPaint = new Paint();  
  56.         mShadowPaint = new Paint();  
  57.         mShadowPaint.setStyle(Style.FILL);  
  58.         mShadowGradientShader = new LinearGradient(000.5f, 0, Color.BLACK,  
  59.                 Color.TRANSPARENT, TileMode.CLAMP);  
  60.         mShadowPaint.setShader(mShadowGradientShader);  
  61.         mShadowGradientMatrix = new Matrix();  
  62.         this.setWillNotDraw(false);  
  63.   
  64.       
  65.   
  66.     @Override  
  67.     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)  
  68.       
  69.         View child = getChildAt(0);  
  70.         measureChild(child, widthMeasureSpec, heightMeasureSpec);  
  71.         setMeasuredDimension(child.getMeasuredWidth(),  
  72.                 child.getMeasuredHeight());  
  73.   
  74.       
  75.   
  76.     @Override  
  77.     protected void onLayout(boolean changed, int l, int t, int r, int b)  
  78.       
  79.         View child = getChildAt(0);  
  80.         child.layout(00, child.getMeasuredWidth(), child.getMeasuredHeight());  
  81.   
  82.         mBitmap = Bitmap.createBitmap(getMeasuredWidth(), getMeasuredHeight(),  
  83.                 Config.ARGB_8888);  
  84.         mCanvas.setBitmap(mBitmap);  
  85.         updateFold();  
  86.   
  87.       
  88.   
  89.     private void updateFold()  
  90.       
  91.         int w = getMeasuredWidth();  
  92.         int h = getMeasuredHeight();  
  93.   
  94.         mTranslateDis = w * mFactor;  
  95.         mFlodWidth = w / mNumOfFolds;  
  96.         mTranslateDisPerFlod = mTranslateDis / mNumOfFolds;  
  97.   
  98.         int alpha = (int) (255 * (1 - mFactor));  
  99. Android FoldingLayout 折叠布局 原理及实现

    Android FoldingLayout 折叠布局 原理及实现

    Android FoldingLayout 折叠布局 原理及实现

    鲁大师4月新机性能/流畅榜:vivo霸榜,最流畅折叠屏手机出现

    又一个展会!思嘉空间布材料迎来德国Paddle expo 展会

    转发布android app到android market的方法