package com.example.administrator.searchpicturetool.widght.fitsystemwindowlayout; import android.content.Context; import android.content.res.Configuration; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Rect; import android.os.Build; import android.util.AttributeSet; import android.util.TypedValue; import android.view.View; import android.view.ViewGroup; import android.view.WindowInsets; import android.widget.LinearLayout; import com.example.administrator.searchpicturetool.R; import com.jude.utils.JUtils; /** * Created by zhuchenxi on 15/11/7. */ public class FitSystemWindowsLinearLayout extends LinearLayout{ private static int STATUSBAR_HEIGHT; private static int NAVIGATIONBAR_HEIGHT; private int mScreenOrientation = VERTICAL; private boolean mPaddingStatusBar; private boolean mPaddingNavigationBar; private int mStatusBarColor = 0; private int mStatusBarHeight = 0; private int mNavigationBarHeight = 0; private Paint mStatusBarPaint; public FitSystemWindowsLinearLayout(Context context) { super(context); init(); } public FitSystemWindowsLinearLayout(Context context, AttributeSet attrs) { super(context, attrs); initAttrs(attrs); init(); } public FitSystemWindowsLinearLayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initAttrs(attrs); init(); } protected void initAttrs(AttributeSet attrs) { TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.fit_system_windows); try { int colorAttr; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { colorAttr = android.R.attr.colorPrimaryDark; } else { colorAttr = getContext().getResources().getIdentifier("colorPrimaryDark", "attr", getContext().getPackageName()); } TypedValue outValue = new TypedValue(); getContext().getTheme().resolveAttribute(colorAttr, outValue, true); if (outValue.resourceId!=0)mStatusBarColor = getResources().getColor(outValue.resourceId); mStatusBarColor = a.getColor(R.styleable.fit_system_windows_status_color,mStatusBarColor); mPaddingStatusBar = a.getBoolean(R.styleable.fit_system_windows_padding_status, true); mPaddingNavigationBar = a.getBoolean(R.styleable.fit_system_windows_padding_navigation, false); JUtils.Log(" mStatusBarColor"+mStatusBarColor+" mPaddingStatusBar:"+mPaddingStatusBar+" mPaddingStatusBar:"+mPaddingStatusBar); } finally { a.recycle(); } } private void init(){ int statusBarHeight = 0; int navigationBarHeight = 0; setWillNotDraw(false); setFitsSystemWindows(true); mScreenOrientation = (getResources().getConfiguration().orientation== Configuration.ORIENTATION_PORTRAIT)?VERTICAL:HORIZONTAL; STATUSBAR_HEIGHT = Utils.getStatusBarHeight(getContext()); NAVIGATIONBAR_HEIGHT = Utils.getNavigationBarHeight(getContext()); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT ){ if (mPaddingStatusBar) statusBarHeight = STATUSBAR_HEIGHT; if (mPaddingNavigationBar&& Utils.hasSoftKeys(getContext())) navigationBarHeight = NAVIGATIONBAR_HEIGHT; } mStatusBarHeight = statusBarHeight; mNavigationBarHeight = navigationBarHeight; mStatusBarPaint = new Paint(); mStatusBarPaint.setColor(mStatusBarColor); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (mPaddingStatusBar){ canvas.drawRect(0,0,getRight(),mStatusBarHeight,mStatusBarPaint); } } public void setStatusBarColor(int color){ mStatusBarColor = color; mStatusBarPaint.setColor(mStatusBarColor); invalidate(); } @Override protected boolean fitSystemWindows(Rect insets) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { Utils.log("fitSystemWindows" +" Left:"+insets.left +" Top:"+insets.top +" Right:"+insets.right +" Bottom:"+insets.bottom); int bottom = insets.bottom; int right = insets.right; if(insets.bottom == NAVIGATIONBAR_HEIGHT)bottom = mNavigationBarHeight; if(insets.right == NAVIGATIONBAR_HEIGHT)right = mNavigationBarHeight;//横屏时才有padding_right insets.set(0, mStatusBarHeight, right, bottom); } return super.fitSystemWindows(insets); } @Override public final WindowInsets onApplyWindowInsets(WindowInsets insets) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { Utils.log("onApplyWindowInsets" +" Left:"+insets.getSystemWindowInsetLeft() +" Top:"+insets.getSystemWindowInsetTop() +" Right:"+insets.getSystemWindowInsetRight() +" Bottom:"+insets.getSystemWindowInsetBottom()); int bottom = insets.getSystemWindowInsetBottom(); int right = insets.getSystemWindowInsetRight(); if(insets.getSystemWindowInsetBottom() == NAVIGATIONBAR_HEIGHT)bottom = mNavigationBarHeight; if(insets.getSystemWindowInsetRight() == NAVIGATIONBAR_HEIGHT)right = mNavigationBarHeight;//横屏时才有padding_right return super.onApplyWindowInsets(insets.replaceSystemWindowInsets(0, mStatusBarHeight, right, bottom));//还得靠爸爸来应用padding } else { return insets; } } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); for (int i = 0; i < getChildCount(); i++) { View child = getChildAt(i); LayoutParams lp = (LayoutParams) child.getLayoutParams(); if (mScreenOrientation == VERTICAL&&lp.isPaddingNavigation()) Utils.paddingToNavigationBar(child); } } @Override public LayoutParams generateLayoutParams(AttributeSet attrs) { return new LayoutParams(getContext(), attrs); } @Override protected LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) { if (p instanceof LayoutParams) { return new LayoutParams((LayoutParams) p); } else if (p instanceof MarginLayoutParams) { return new LayoutParams((MarginLayoutParams) p); } return new LayoutParams(p); } @Override protected LinearLayout.LayoutParams generateDefaultLayoutParams() { return new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); } public static class LayoutParams extends LinearLayout.LayoutParams { private boolean mPaddingNavigation = false; public LayoutParams(Context context, AttributeSet attrs) { super(context, attrs); final TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.fit_system_windows); this.mPaddingNavigation = a.getBoolean( R.styleable.fit_system_windows_padding_navigation, false); a.recycle(); } public LayoutParams(int width, int height) { super(width, height); } public LayoutParams(int width, int height, float weight) { super(width, height, weight); } public LayoutParams(ViewGroup.LayoutParams p) { super(p); } public LayoutParams(MarginLayoutParams source) { super(source); } public boolean isPaddingNavigation() { return mPaddingNavigation; } public void setPaddingNavigation(boolean mPaddingNavigation) { this.mPaddingNavigation = mPaddingNavigation; } } }