package com.team.zhuoke.ui.refreshview.utils; import android.app.Activity; import android.content.Context; import android.content.res.Configuration; import android.graphics.Point; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.StaggeredGridLayoutManager; import android.util.DisplayMetrics; import android.view.Display; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.view.WindowManager; import com.team.zhuoke.ui.refreshview.recyclerview.BaseRecyclerAdapter; import java.lang.reflect.Method; public class Utils { /** * 格式化字符串 * * @param format * @param args */ public static String format(String format, int args) { return String.format(format, args); } public static Point getScreenSize(Context context) { WindowManager wm = (WindowManager) context .getSystemService(Context.WINDOW_SERVICE); Point point = new Point(wm.getDefaultDisplay().getWidth(), wm.getDefaultDisplay().getHeight()); return point; } public static void setFullSpan(StaggeredGridLayoutManager.LayoutParams layoutParams) { if (layoutParams != null && !layoutParams.isFullSpan()) { layoutParams.setFullSpan(true); } } public static void removeViewFromParent(View view) { if (view == null) { return; } ViewGroup parent = (ViewGroup) view.getParent(); if (parent != null) { parent.removeView(view); } } public static boolean isRecyclerViewFullscreen(RecyclerView viewGroup) { if (viewGroup.getAdapter() instanceof BaseRecyclerAdapter) { // int count = viewGroup.getChildCount(); // // View lastchild = viewGroup.getChildAt(count - 1); // if (lastchild instanceof IFooterCallBack) { // lastchild = viewGroup.getChildAt(count - 2); // } // if (lastchild == null) { // return false; // } // RecyclerView.LayoutParams lastLp = (RecyclerView.LayoutParams) lastchild.getLayoutParams(); // int lastBottomMargin = lastLp.bottomMargin; // int[] position = new int[2]; // lastchild.getLocationOnScreen(position); // LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) viewGroup.getLayoutParams(); // int bottomMargin = layoutParams.bottomMargin; // int padding = viewGroup.getPaddingBottom(); // int height = getScreenHeight(viewGroup.getContext()); boolean atTop = findFirstCompletelyVisibleItemPosition(viewGroup) > 0; return /*(position[1] + lastchild.getHeight() + lastBottomMargin + bottomMargin + padding) >= height || */atTop; } return false; } public static int findFirstCompletelyVisibleItemPosition(RecyclerView recyclerView) { RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager(); int firstPosition; if (layoutManager instanceof LinearLayoutManager) { firstPosition = ((LinearLayoutManager) layoutManager).findFirstCompletelyVisibleItemPosition(); } else if (layoutManager instanceof GridLayoutManager) { firstPosition = ((LinearLayoutManager) layoutManager).findFirstCompletelyVisibleItemPosition(); } else if (layoutManager instanceof StaggeredGridLayoutManager) { StaggeredGridLayoutManager staggeredGridLayoutManager = (StaggeredGridLayoutManager) layoutManager; int[] lastPositions = new int[staggeredGridLayoutManager.getSpanCount()]; staggeredGridLayoutManager.findFirstCompletelyVisibleItemPositions(lastPositions); firstPosition = findMin(lastPositions); } else { throw new RuntimeException( "Unsupported LayoutManager used. Valid ones are LinearLayoutManager, GridLayoutManager and StaggeredGridLayoutManager"); } return firstPosition; } private static int findMin(int[] lastPositions) { int min = Integer.MAX_VALUE; for (int value : lastPositions) { if (value != RecyclerView.NO_POSITION && value < min) min = value; } return min; } public static int computeScrollDuration(int dx, int dy, int height) { int vx = 0; int vy = 0; final int absDx = Math.abs(dx); final int absDy = Math.abs(dy); final boolean horizontal = absDx > absDy; final int velocity = (int) Math.sqrt(vx * vx + vy * vy); final int delta = (int) Math.sqrt(dx * dx + dy * dy); final int containerSize = height; final int halfContainerSize = containerSize / 2; final float distanceRatio = Math.min(1.f, 1.f * delta / containerSize); final float distance = halfContainerSize + halfContainerSize * distanceInfluenceForSnapDuration(distanceRatio); final int duration; if (velocity > 0) { duration = 4 * Math.round(1000 * Math.abs(distance / velocity)); } else { float absDelta = (float) (horizontal ? absDx : absDy); duration = (int) (((absDelta / containerSize) + 1) * 300); } return Math.min(duration, 2000); } public static int computeScrollVerticalDuration(int dy, int height) { final int duration; float absDelta = (float) Math.abs(dy); duration = (int) (((absDelta / height) + 1) * 200); return dy == 0 ? 0 : Math.min(duration, 500); } private static float distanceInfluenceForSnapDuration(float f) { f -= 0.5f; // center the values about 0. f *= 0.3f * Math.PI / 2.0f; return (float) Math.sin(f); } public static boolean isScreenOriatationPortrait(Context context) { return context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT; } public static int getDpi(Context context) { int dpi = 0; WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); Display display = windowManager.getDefaultDisplay(); DisplayMetrics displayMetrics = new DisplayMetrics(); @SuppressWarnings("rawtypes") Class c; try { c = Class.forName("android.view.Display"); @SuppressWarnings("unchecked") Method method = c.getMethod("getRealMetrics", DisplayMetrics.class); method.invoke(display, displayMetrics); dpi = displayMetrics.heightPixels; } catch (Exception e) { e.printStackTrace(); } return dpi; } /** * 获取 虚拟按键的高度 * * @param context * @return */ public static int getBottomStatusHeight(Context context) { int totalHeight = getDpi(context); int contentHeight = getScreenHeight(context); return totalHeight - contentHeight; } /** * 标题栏高度 * * @return */ public static int getTitleHeight(Activity activity) { return activity.getWindow().findViewById(Window.ID_ANDROID_CONTENT).getTop(); } /** * 获得状态栏的高度 * * @param context * @return */ public static int getStatusHeight(Context context) { int statusHeight = -1; try { Class<?> clazz = Class.forName("com.android.internal.R$dimen"); Object object = clazz.newInstance(); int height = Integer.parseInt(clazz.getField("status_bar_height") .get(object).toString()); statusHeight = context.getResources().getDimensionPixelSize(height); } catch (Exception e) { e.printStackTrace(); } return statusHeight; } /** * 获得屏幕高度 * * @param context * @return */ public static int getScreenHeight(Context context) { WindowManager wm = (WindowManager) context .getSystemService(Context.WINDOW_SERVICE); DisplayMetrics outMetrics = new DisplayMetrics(); wm.getDefaultDisplay().getMetrics(outMetrics); return outMetrics.heightPixels; } /** * 获得屏幕宽度 * * @param context * @return */ public static int getScreenWidth(Context context) { WindowManager wm = (WindowManager) context .getSystemService(Context.WINDOW_SERVICE); DisplayMetrics outMetrics = new DisplayMetrics(); wm.getDefaultDisplay().getMetrics(outMetrics); return outMetrics.widthPixels; } }