最外层是relatativelayout
<LinearLayout android:id="@+id/lin1" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <LinearLayout android:id="@+id/top" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:background="#666666" android:alpha="0"> </LinearLayout> <LinearLayout android:id="@+id/sousuokuang" android:layout_width="match_parent" android:layout_height="wrap_content"> <LinearLayout android:id="@+id/ll_head" android:layout_alignParentTop="true" android:gravity="center_vertical" android:layout_width="match_parent" android:layout_height="50dp"> <LinearLayout android:padding="5dp" android:id="@+id/ll_sao" android:gravity="center" android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="50dp"> <ImageView android:layout_marginTop="2dp" android:id="@+id/iv_sao" android:layout_width="wrap_content" android:layout_height="15dp" android:src="@drawable/sys" /> <TextView android:id="@+id/tv_sao" android:paddingTop="3dp" android:textSize="8dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="扫啊扫" /> </LinearLayout> <LinearLayout android:id="@+id/search" android:padding="5dp" android:background="@drawable/search_bg" android:layout_weight="1" android:layout_width="0dp" android:gravity="center_vertical" android:layout_height="30dp"> <ImageView android:layout_marginLeft="5dp" android:layout_width="15dp" android:layout_height="15dp" android:src="@drawable/search_icon2" /> <TextView android:layout_weight="1" android:padding="2dp" android:layout_width="0dp" android:textSize="12sp" android:layout_height="wrap_content" android:text="都市丽人领劵满399减200" /> <ImageView android:layout_gravity="right" android:layout_width="20dp" android:layout_height="20dp" android:src="@drawable/root" android:layout_marginRight="5dp"/> </LinearLayout> <LinearLayout android:padding="5dp" android:id="@+id/ll_msg" android:gravity="center" android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="50dp"> <ImageView android:id="@+id/iv_msg" android:layout_width="wrap_content" android:layout_height="20dp" android:src="@drawable/xx" /> <TextView android:id="@+id/tv_msg" android:textSize="8dp" android:paddingTop="3dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="消息" /> </LinearLayout> </LinearLayout> </LinearLayout> </LinearLayout>
尽管是相对布局,要将这个整体放在前面显示
sousuokuang = v.findViewById(R.id.sousuokuang); top = v.findViewById(R.id.top); search = v.findViewById(R.id.search); lin1 = v.findViewById(R.id.lin1); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, MeasureUtil.getStatusBarHeight(getActivity())); top.setLayoutParams(params); lin1.bringToFront();
PullToRefreshRecyclerView 滑动事件监听。。。不同的距离设置不同的透明度
xr.setOnScrollChangeListener(new View.OnScrollChangeListener() { @Override public void onScrollChange(View view, int i, int i1, int i2, int i3) { //测量滑动距离 int scrolledDistance = MeasureUtil.getScrolledDistance(xr); if(scrolledDistance > 0){ //状态栏显示 ,并且变为白色,搜索框渐变,搜索框变为灰色 sousuokuang.setBackgroundColor(Color.WHITE); if(scrolledDistance <= 800){ if(scrolledDistance > 0 && scrolledDistance <= 80){ sousuokuang.setAlpha((float) 0); }else if(scrolledDistance > 80 && scrolledDistance <= 160){ sousuokuang.setAlpha((float) 0.1); }else if(scrolledDistance > 160 && scrolledDistance <= 240){ sousuokuang.setAlpha((float) 0.2); }else if(scrolledDistance > 240 && scrolledDistance <= 320){ sousuokuang.setAlpha((float) 0.3); }else if(scrolledDistance > 320 && scrolledDistance <= 400){ sousuokuang.setAlpha((float) 0.4); }else if(scrolledDistance > 400 && scrolledDistance <= 480){ sousuokuang.setAlpha((float) 0.5); }else if(scrolledDistance > 480 && scrolledDistance <= 560){ sousuokuang.setAlpha((float) 0.6); }else if(scrolledDistance > 560 && scrolledDistance <= 640){ sousuokuang.setAlpha((float) 0.7); }else if(scrolledDistance > 640 && scrolledDistance <= 720){ sousuokuang.setAlpha((float) 0.8); }else if(scrolledDistance > 720 && scrolledDistance <= 800){ sousuokuang.setAlpha((float) 0.9); } }else{ sousuokuang.setAlpha(1); } Log.i("滑动:","-----"+scrolledDistance); search.setBackground(getResources().getDrawable(R.drawable.search_bg1)); top.setAlpha(1); }else{ Log.i("未滑动----:","-----"); //否则为状态栏不显示,搜索框变为白色 sousuokuang.setBackgroundColor(0); search.setBackground(getResources().getDrawable(R.drawable.search_bg)); top.setAlpha(0); } } });
测量的工具类
public class MeasureUtil { public static int getScrolledDistance(PullToRefreshRecyclerView pullToRefreshRecyclerView){ LinearLayoutManager layoutManager = (LinearLayoutManager) pullToRefreshRecyclerView.getLayoutManager(); View childAt = pullToRefreshRecyclerView.getChildAt(0); int firstVisibleItemPosition = layoutManager.findFirstVisibleItemPosition(); int height = childAt.getHeight(); int decoratedBottom = layoutManager.getDecoratedBottom(childAt); return (firstVisibleItemPosition+1)* height - decoratedBottom; } public static int getStatusBarHeight(Context context){ Class<?> c = null; Object obj = null; Field field = null; int x = 0, statusBarHeight = 0; try { c = Class.forName("com.android.internal.R$dimen"); obj = c.newInstance(); field = c.getField("status_bar_height"); x = Integer.parseInt(field.get(obj).toString()); statusBarHeight = context.getResources().getDimensionPixelSize(x); } catch (Exception e1) { e1.printStackTrace(); } return statusBarHeight; } public static void setListViewHeightBasedOnChildren(ListView listView) { if(listView == null) return; ListAdapter listAdapter = listView.getAdapter(); if (listAdapter == null) { // pre-condition return; } int totalHeight = 0; for (int i = 0; i < listAdapter.getCount(); i++) { View listItem = listAdapter.getView(i, null, listView); listItem.measure(0, 0); totalHeight += listItem.getMeasuredHeight(); } ViewGroup.LayoutParams params = listView.getLayoutParams(); params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1)); listView.setLayoutParams(params); } public static void reMesureGridViewHeight(GridView gridView) { // 获取GridView对应的Adapter ListAdapter listAdapter = gridView.getAdapter(); if (listAdapter == null) { return; } int rows; int columns = 0; int horizontalBorderHeight = 0; Class<?> clazz = gridView.getClass(); try { // 利用反射,取得每行显示的个数 Field column = clazz.getDeclaredField("mRequestedNumColumns"); column.setAccessible(true); columns = (Integer) column.get(gridView); // columns = gridView.getNumColumns();//Call requires API level 11 // 利用反射,取得横向分割线高度 Field horizontalSpacing = clazz.getDeclaredField("mRequestedHorizontalSpacing"); horizontalSpacing.setAccessible(true); horizontalBorderHeight = (Integer) horizontalSpacing.get(gridView); // horizontalBorderHeight = gridView.getHorizontalSpacing();//Call requires API level 16 } catch (Exception e) { e.printStackTrace(); } // 判断数据总数除以每行个数是否整除。不能整除代表有多余,需要加一行 if (listAdapter.getCount() % columns > 0) { rows = listAdapter.getCount() / columns + 1; } else { rows = listAdapter.getCount() / columns; } int totalHeight = 0; for (int i = 0; i < rows; i++) { // 只计算每项高度*行数 View listItem = listAdapter.getView(i, null, gridView); listItem.measure(0, 0); // 计算子项View 的宽高 totalHeight += listItem.getMeasuredHeight(); // 统计所有子项的总高度 } ViewGroup.LayoutParams params = gridView.getLayoutParams(); params.height = totalHeight + horizontalBorderHeight * (rows - 1);// 最后加上分割线总高度 gridView.setLayoutParams(params); }}