简书链接:被产品经理虐的android要给所有activity加上ios11大标题加滚动滑动然后一个月之后又要取消是什么体验?那么我之前是如何处理的? 文章字数:802,阅读全文大约需要3分钟 被产品经理虐的android要给所有activity加上ios11大标题加滚动滑动变成小标题。 ios说很简单,我特么估计就一个属性吧。
这么多界面,很多底部权重界面 都需要单独处理的,我虽然也是用代码控制继承,但是还是有点反感变态的需求 我虽然写的很好,不是重写所有xml布局,而是通过继承 ,实现了快速解决所有问题。 全是通过java代码控制。 所以这次变态的需求果然我还是可以应付的。
我是如何封装的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 public class IOSHeaderHeper { private static final String TAG = "IOSHeaderHeper"; private boolean mShowIing; public ViewGroup iosLayoutRootView; public ViewGroup myContentView; public AppBarLayout appbarLayout; public TextView toolBar; public ViewGroup headViewWrapFix; public CollapsingToolbarLayout collapsingToolbarlayout; public ViewGroup buttomContainer; public TextView tvTitleBig; private View headView; public View viewIosHeader; public ViewGroup keepShowArea; public CoordinatorLayout coordinatorLayout; public void setHeaderTitle(String str) { toolBar.setText(str); collapsingToolbarlayout.setTitle(str); if(tvTitleBig!=null){ tvTitleBig.setText(str); } } protected void switchLightMode() { collapsingToolbarlayout.setCollapsedTitleTextColor(AppContext.getInstance().getResources().getColor(R.color.colorThemeBlack)); toolBar.setTextColor(AppContext.getInstance().getResources().getColor(R.color.colorThemeBlack)); if (tvTitleBig == null) { Log.e(TAG, "无法设置头部"); } else { tvTitleBig.setTextColor(AppContext.getInstance().getResources().getColor(R.color.colorThemeBlack)); } toolBar.setBackgroundColor(Color.WHITE); collapsingToolbarlayout.setBackgroundColor(AppContext.getInstance().getResources().getColor(R.color.colorWhite)); } protected void switchNightMode() { collapsingToolbarlayout.setCollapsedTitleTextColor(AppContext.getInstance().getResources().getColor(R.color.colorWhite)); toolBar.setTextColor(AppContext.getInstance().getResources().getColor(R.color.colorWhite)); if (tvTitleBig == null) { Log.e(TAG, "无法设置头部"); } else { tvTitleBig.setTextColor(AppContext.getInstance().getResources().getColor(R.color.colorWhite)); } toolBar.setBackgroundColor(AppContext.getInstance().getResources().getColor(R.color.colorThemeBlack)); collapsingToolbarlayout.setBackgroundColor(AppContext.getInstance().getResources().getColor(R.color.colorThemeBlack)); } protected void onCreateViewFixFinish(View view) { ViewGroup parent = (ViewGroup) view.getParent(); int index = parent.indexOfChild(view); parent.removeViewAt(index); // binding = DataBindingUtil.inflate(LayoutInflater.from(this), R.layout.ios11layout_wrap, parent, false); iosLayoutRootView = (ViewGroup) LayoutInflater.from(view.getContext()).inflate(getIos11Layout(), parent, false); myContentView = (ViewGroup) iosLayoutRootView.findViewById(R.id.my_content_view); coordinatorLayout = (CoordinatorLayout) iosLayoutRootView.findViewById(R.id.coordinator); appbarLayout = (AppBarLayout) iosLayoutRootView.findViewById(R.id.appbar); toolBar = (TextView) iosLayoutRootView.findViewById(R.id.toolbar); keepShowArea = (ViewGroup) iosLayoutRootView.findViewById(R.id.view_keep_show_area); buttomContainer = (ViewGroup) iosLayoutRootView.findViewById(R.id.buttom_container); collapsingToolbarlayout = (CollapsingToolbarLayout) iosLayoutRootView.findViewById(R.id.collapsing_toolbarlayout); headViewWrapFix = (ViewGroup) iosLayoutRootView.findViewById(R.id.head_view_wrap_fix); myContentView.addView(view); parent.addView(iosLayoutRootView); // LayoutTransition transition = new LayoutTransition(); // transition.setAnimator(LayoutTransition.CHANGE_APPEARING, null); // ((ViewGroup) binding.toolbar.getParent()).setLayoutTransition(transition); appbarLayout.addOnOffsetChangedListener(new OnAppBarStateChangedListener() { @Override public void onStateChanged(AppBarLayout appBarLayout, State state) { if (state == State.EXPANDED) { toolBar.setVisibility(View.GONE); Prt.w(TAG, "展开中"); } else if (state == State.COLLAPSED) { toolBar.setVisibility(View.VISIBLE); Prt.w(TAG, "收缩中"); } else { } } @Override public void onScrolling(AppBarLayout appBarLayout, State state) { } }); } /** * 把view移除然后添加到底部 * * @param view */ public void moveViewToBottomContainer(View view) { ViewGroup viewGroup = ((ViewGroup) view.getParent()); if (viewGroup != null) { viewGroup.removeView(view); } FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.CENTER); buttomContainer.addView(view, params); } /** * 头部插入 * * @param * @return */ public ViewGroup addHeadView() { return addHeadView(getHeadViewDefaultResouce()); } public ViewGroup addHeadView(int headViewResource) { headView = LayoutInflater.from(headViewWrapFix.getContext()).inflate(headViewResource, headViewWrapFix, false); tvTitleBig = (TextView) headView.findViewById(R.id.view_head_center); viewIosHeader = headView.findViewById(R.id.view_head); headViewWrapFix.addView(headView); return headViewWrapFix; } public ViewGroup addHeadView(View view) { headView = view; tvTitleBig = (TextView) headView.findViewById(R.id.view_head_center); viewIosHeader = headView.findViewById(R.id.view_head); headViewWrapFix.addView(headView); return headViewWrapFix; } protected boolean isNeedHead() { return true; } protected int getIos11Layout() { return R.layout.ios11layout_wrap; } public int getHeadViewDefaultResouce() { return R.layout.view_head_ios11; } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 public abstract class IOSHeaderActivity extends BaseActionBarActivity { private IOSHeaderHeper headerHeper; @Override protected void onCreateBefore(Bundle savedInstanceState) { headerHeper = new IOSHeaderHeper(); } @Override protected View onCreateViewFix() { return super.onCreateViewFix(); } @Override protected void onCreateViewFixFinish(View view) { headerHeper.onCreateViewFixFinish(view); } @Override protected int getHeadViewResouce() { return headerHeper.getHeadViewDefaultResouce(); } protected void switchLightMode() { headerHeper.switchLightMode(); } protected void switchNightMode() { headerHeper.switchNightMode(); ; } public void moveViewToBottomContainer(View view) { headerHeper.moveViewToBottomContainer(view); } @Override protected boolean isNeedHead() { return true; } protected int getIos11Layout() { return headerHeper.getIos11Layout(); } @Override protected ViewGroup addHeadView(ViewGroup view) { return headerHeper.addHeadView(); } @Override public void setHeaderTitle(String str) { headerHeper.setHeaderTitle(str); } protected ViewGroup getheadViewWrapFix() { return headerHeper.headViewWrapFix; } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 <?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <data></data> <LinearLayout android:id="@+id/root_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <android.support.design.widget.CoordinatorLayout android:id="@+id/coordinator" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1"> <android.support.design.widget.AppBarLayout android:id="@+id/appbar" android:layout_width="match_parent" android:layout_height="wrap_content"> <android.support.design.widget.CollapsingToolbarLayout android:id="@+id/collapsing_toolbarlayout" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/colorThemeColor" app:collapsedTitleGravity="center" app:contentInsetLeft="0dp" app:contentInsetStart="0dp" app:contentScrim="@color/transparent" app:expandedTitleGravity="left|center_vertical" app:layout_scrollFlags="scroll|enterAlwaysCollapsed" app:scrimAnimationDuration="100" app:scrimVisibleHeightTrigger="0dp" app:titleEnabled="false"> <FrameLayout android:id="@+id/head_view_wrap_fix" android:layout_width="match_parent" android:layout_height="wrap_content" app:layout_collapseMode="pin"> </FrameLayout> <!--app:layout_scrollFlags="exitUntilCollapsed"--> <!--上滑保留标题栏 app:layout_collapseMode--> </android.support.design.widget.CollapsingToolbarLayout> <TextView android:id="@+id/toolbar" style="@style/style_ios_small_title" android:text="@string/app_name" app:layout_scrollFlags="exitUntilCollapsed" /> <FrameLayout android:id="@+id/view_keep_show_area" android:layout_width="match_parent" android:layout_height="wrap_content" app:layout_scrollFlags="exitUntilCollapsed"> </FrameLayout> </android.support.design.widget.AppBarLayout> <FrameLayout android:id="@+id/my_content_view" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="android.support.design.widget.AppBarLayout$ScrollingViewBehavior"> </FrameLayout> </android.support.design.widget.CoordinatorLayout> <FrameLayout android:id="@+id/buttom_container" android:layout_width="match_parent" android:layout_height="wrap_content"> </FrameLayout> </LinearLayout> </layout>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 public abstract class WanNengIOSHeaderActivity extends BaseActionBarActivity { public IOSHeaderHeper getHeaderHeper() { return headerHeper; } private IOSHeaderHeper headerHeper; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override protected void onCreateBefore(Bundle savedInstanceState) { headerHeper = new IOSHeaderHeper(false); } @Override protected View onCreateViewFix() { return super.onCreateViewFix(); } @Override protected void onCreateViewFixFinish(View view) { headerHeper.onCreateViewFixFinish(view); } @Override protected int getHeadViewResouce() { return headerHeper.getHeadViewDefaultResouce(); } protected void switchLightMode() { headerHeper.switchLightMode(); } protected void switchNightMode() { headerHeper.switchNightMode(); ; } public void moveViewToBottomContainer(View view) { headerHeper.moveViewToBottomContainer(view); } @Override protected boolean isNeedHead() { return true; } protected int getIos11Layout() { return headerHeper.getIos11Layout(); } @Override protected ViewGroup onAddHeadView(ViewGroup view) { return headerHeper.addHeadView(); } @Override public void setHeaderTitle(String str) { headerHeper.setHeaderTitle(str); }
那么接下来要如何改?实际上很简单了,因为我已经通过基类控制了。
某个用户界面是最复杂的 但是这个界面我也是不想改了的,而且这个界面基本上不需要改吧。我觉得。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 private void layoutView() { //把头部切换器移动到 固定头部固定keepShowArea区域。 ViewGroup parent = (ViewGroup) headerBinding.radioGroup.getParent(); parent.removeView(headerBinding.radioGroup); getHeaderHeper().keepShowArea.addView(headerBinding.radioGroup); //视频区域滑动不流畅不是这个smartlayout导致的 //smartlayout移动到根部============ ((ViewGroup) binding.smartLayout.getParent()).removeView(binding.smartLayout);//把刷新布局添加到根部 getHeaderHeper().iosLayoutRootView.addView(binding.smartLayout); //把coordlayout移动到 smartlayout下面 getHeaderHeper().iosLayoutRootView.removeView(getHeaderHeper().coordinatorLayout);//把原来coordinatorLayout根部的移动到smartlayout下面 binding.smartLayout.addView(getHeaderHeper().coordinatorLayout); //把底部buttomycontainer移动出去移动到线性布局下面 称之为修复权重让 底部按钮始终底部 binding.smartLayout.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT, 1));//设置权重,因为添加到了线性布局了 ViewGroup parentButtonContainer = (ViewGroup) getHeaderHeper().buttomContainer.getParent(); parentButtonContainer.removeView(getHeaderHeper().buttomContainer); getHeaderHeper().iosLayoutRootView.addView(getHeaderHeper().buttomContainer); //添加发送消息按钮到底部固定 LayoutInflater inflater = LayoutInflater.from(this); viewSendMsg = inflater.inflate(R.layout.view_item_young_send_msg, getHeaderHeper().buttomContainer, false); viewSendMsg.findViewById(R.id.btn_send_msg).setOnClickListener(this); getHeaderHeper().moveViewToBottomContainer(viewSendMsg); }
最后,我打算封装成一个库,可以解决底部固定问题又可以扩展控制随时可以砍掉这个功能,或者恢复这个功能
在附上我又调整过的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 package com.buyao.tv.activity.base; import android.graphics.Color; import android.support.design.widget.AppBarLayout; import android.support.design.widget.CollapsingToolbarLayout; import android.support.design.widget.CoordinatorLayout; import android.util.Log; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; import android.widget.TextView; import com.buyao.tv.R; import com.buyao.tv.global.AppContext; import com.buyao.tv.ui.materialdesign.OnAppBarStateChangedListener; import com.buyao.tv.util.Prt; /** * Created by qssq on 2018/1/30 [email protected] * 2个产品经理,一个产品经理说要高仿ios 给每一个页面加大标题,滑动缩放成小标题,给我的感觉他是跪舔ios的,觉得ios什么都很美,出的设计图基本上是高仿ios界面。 * 之后他被辞职了,这次来一个另外一个产品经理又要砍掉大标题。 */ public class IOSHeaderHeper { private View saveRootView; public IOSHeaderHeper(boolean needIosHeader) { this.needIosHeader = needIosHeader; } public IOSHeaderHeper() { } private static final String TAG = "IOSHeaderHeper"; private boolean mShowIing; public ViewGroup iosLayoutRootView; public ViewGroup myContentView; public AppBarLayout appbarLayout; public TextView toolBar; public ViewGroup headViewWrapFix; public CollapsingToolbarLayout collapsingToolbarlayout; public ViewGroup buttomContainer; public TextView tvTitleBig; private View headView; public View viewIosHeader; public ViewGroup keepShowArea; public CoordinatorLayout coordinatorLayout; public boolean isNeedIosHeader() { return needIosHeader; } public void setNeedIosHeader(boolean needIosHeader) { this.needIosHeader = needIosHeader; } boolean needIosHeader = true; public void setHeaderTitle(String str) { if (!needIosHeader) { return; } toolBar.setText(str); collapsingToolbarlayout.setTitle(str); if (tvTitleBig != null) { tvTitleBig.setText(str); } } protected void switchLightMode() { if (!needIosHeader) { return; } collapsingToolbarlayout.setCollapsedTitleTextColor(AppContext.getInstance().getResources().getColor(R.color.colorThemeBlack)); toolBar.setTextColor(AppContext.getInstance().getResources().getColor(R.color.colorThemeBlack)); if (tvTitleBig == null) { Log.e(TAG, "无法设置头部"); } else { tvTitleBig.setTextColor(AppContext.getInstance().getResources().getColor(R.color.colorThemeBlack)); } toolBar.setBackgroundColor(Color.WHITE); collapsingToolbarlayout.setBackgroundColor(AppContext.getInstance().getResources().getColor(R.color.colorWhite)); } protected void switchNightMode() { if (!needIosHeader) { return; } collapsingToolbarlayout.setCollapsedTitleTextColor(AppContext.getInstance().getResources().getColor(R.color.colorWhite)); toolBar.setTextColor(AppContext.getInstance().getResources().getColor(R.color.colorWhite)); if (tvTitleBig == null) { Log.e(TAG, "无法设置头部"); } else { tvTitleBig.setTextColor(AppContext.getInstance().getResources().getColor(R.color.colorWhite)); } toolBar.setBackgroundColor(AppContext.getInstance().getResources().getColor(R.color.colorThemeBlack)); collapsingToolbarlayout.setBackgroundColor(AppContext.getInstance().getResources().getColor(R.color.colorThemeBlack)); } protected void onCreateViewFixFinish(View view) { if (!needIosHeader) { saveRootView = view; return; } ViewGroup parent = (ViewGroup) view.getParent(); int index = parent.indexOfChild(view); parent.removeViewAt(index); // binding = DataBindingUtil.inflate(LayoutInflater.from(this), R.layout.ios11layout_wrap, parent, false); iosLayoutRootView = (ViewGroup) LayoutInflater.from(view.getContext()).inflate(getIos11Layout(), parent, false); myContentView = (ViewGroup) iosLayoutRootView.findViewById(R.id.my_content_view); coordinatorLayout = (CoordinatorLayout) iosLayoutRootView.findViewById(R.id.coordinator); appbarLayout = (AppBarLayout) iosLayoutRootView.findViewById(R.id.appbar); toolBar = (TextView) iosLayoutRootView.findViewById(R.id.toolbar); keepShowArea = (ViewGroup) iosLayoutRootView.findViewById(R.id.view_keep_show_area); buttomContainer = (ViewGroup) iosLayoutRootView.findViewById(R.id.buttom_container); collapsingToolbarlayout = (CollapsingToolbarLayout) iosLayoutRootView.findViewById(R.id.collapsing_toolbarlayout); headViewWrapFix = (ViewGroup) iosLayoutRootView.findViewById(R.id.head_view_wrap_fix); myContentView.addView(view); parent.addView(iosLayoutRootView); // LayoutTransition transition = new LayoutTransition(); // transition.setAnimator(LayoutTransition.CHANGE_APPEARING, null); // ((ViewGroup) binding.toolbar.getParent()).setLayoutTransition(transition); appbarLayout.addOnOffsetChangedListener(new OnAppBarStateChangedListener() { @Override public void onStateChanged(AppBarLayout appBarLayout, State state) { if (state == State.EXPANDED) { toolBar.setVisibility(View.GONE); Prt.w(TAG, "展开中"); } else if (state == State.COLLAPSED) { toolBar.setVisibility(View.VISIBLE); Prt.w(TAG, "收缩中"); } else { } } @Override public void onScrolling(AppBarLayout appBarLayout, State state) { } }); } /** * 把view移除然后添加到底部 * * @param view */ public void moveViewToBottomContainer(View view) { if (!needIosHeader) { return; } ViewGroup viewGroup = ((ViewGroup) view.getParent()); if (viewGroup != null) { viewGroup.removeView(view); } FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.CENTER); buttomContainer.addView(view, params); } /** * 头部插入 * * @param * @return */ public ViewGroup addHeadView() { if (!needIosHeader) { if (saveRootView == null) { throw new RuntimeException("抱歉,由于产品经理又要让所有界面取消大标题,于是乎我修改了很多界面,如果您看到本信息,说此界面程序员忘记修改了"); } return addHeadView(saveRootView, getHeadViewDefaultResouce()); } return addHeadView(getHeadViewDefaultResouce()); } public ViewGroup addHeadView(int headViewResource) { if (!needIosHeader) { if (saveRootView == null) { throw new RuntimeException("抱歉,由于产品经理又要让所有界面取消大标题,于是乎我修改了很多界面,如果您看到本信息,说此界面程序员忘记修改了"); } return addHeadView(saveRootView, headViewResource); } headView = LayoutInflater.from(headViewWrapFix.getContext()).inflate(headViewResource, headViewWrapFix, false); tvTitleBig = (TextView) headView.findViewById(R.id.view_head_center); viewIosHeader = headView.findViewById(R.id.view_head); headViewWrapFix.addView(headView); return headViewWrapFix; } public ViewGroup addHeadView(View view) { return addHeadView(view, getHeadViewDefaultResouce()); } public ViewGroup addHeadView(View view, int headResource) { if (!needIosHeader) { view = LayoutInflater.from(view.getContext()).inflate(headResource, headViewWrapFix, false); } headView = view; tvTitleBig = (TextView) headView.findViewById(R.id.view_head_center); viewIosHeader = headView.findViewById(R.id.view_head); headViewWrapFix.addView(headView); return headViewWrapFix; } protected boolean isNeedHead() { return true; } protected int getIos11Layout() { return R.layout.ios11layout_wrap; } public int getHeadViewDefaultResouce() { if(isNeedIosHeader()){ return R.layout.view_head_ios11; }else{ return R.layout.view_head_back; } } }