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
- package com.zhy.view;
- import android.content.Context;
- import android.graphics.Bitmap;
- import android.graphics.Bitmap.Config;
- import android.graphics.Canvas;
- import android.graphics.Color;
- import android.graphics.LinearGradient;
- import android.graphics.Matrix;
- import android.graphics.Paint;
- import android.graphics.Paint.Style;
- import android.graphics.Shader.TileMode;
- import android.util.AttributeSet;
- import android.view.View;
- import android.view.ViewGroup;
- public class FoldLayout extends ViewGroup
- private static final int NUM_OF_POINT = 8;
- /**
- * 图片的折叠后的总宽度
- */
- private float mTranslateDis;
- protected float mFactor = 0.6f;
- private int mNumOfFolds = 8;
- private Matrix[] mMatrices = new Matrix[mNumOfFolds];
- private Paint mSolidPaint;
- private Paint mShadowPaint;
- private Matrix mShadowGradientMatrix;
- private LinearGradient mShadowGradientShader;
- private float mFlodWidth;
- private float mTranslateDisPerFlod;
- public FoldLayout(Context context)
- this(context, null);
- public FoldLayout(Context context, AttributeSet attrs)
- super(context, attrs);
- for (int i = 0; i < mNumOfFolds; i++)
- mMatrices[i] = new Matrix();
- mSolidPaint = new Paint();
- mShadowPaint = new Paint();
- mShadowPaint.setStyle(Style.FILL);
- mShadowGradientShader = new LinearGradient(0, 0, 0.5f, 0, Color.BLACK,
- Color.TRANSPARENT, TileMode.CLAMP);
- mShadowPaint.setShader(mShadowGradientShader);
- mShadowGradientMatrix = new Matrix();
- this.setWillNotDraw(false);
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
- View child = getChildAt(0);
- measureChild(child, widthMeasureSpec, heightMeasureSpec);
- setMeasuredDimension(child.getMeasuredWidth(),
- child.getMeasuredHeight());
- @Override
- protected void onLayout(boolean changed, int l, int t, int r, int b)
- View child = getChildAt(0);
- child.layout(0, 0, child.getMeasuredWidth(), child.getMeasuredHeight());
- mBitmap = Bitmap.createBitmap(getMeasuredWidth(), getMeasuredHeight(),
- Config.ARGB_8888);
- mCanvas.setBitmap(mBitmap);
- updateFold();
- private void updateFold()
- int w = getMeasuredWidth();
- int h = getMeasuredHeight();
- mTranslateDis = w * mFactor;
- mFlodWidth = w / mNumOfFolds;
- mTranslateDisPerFlod = mTranslateDis / mNumOfFolds;
- int alpha = (int) (255 * (1 - mFactor));
- Android FoldingLayout 折叠布局 原理及实现
Android FoldingLayout 折叠布局 原理及实现
Android FoldingLayout 折叠布局 原理及实现
鲁大师4月新机性能/流畅榜:vivo霸榜,最流畅折叠屏手机出现