被产品经理虐的android要给所有activity加上ios11大标题加滚动滑动变成小标题。
ios说很简单,我特么估计就一个属性吧。
这么多界面,很多底部权重界面都需要单独处理的,我虽然也是用代码控制继承,但是还是有点反感变态的需求
我虽然写的很好,不是重写所有xml布局,而是通过继承 ,实现了快速解决所有问题。 全是通过java代码控制。
所以这次变态的需求果然我还是可以应付的。
我是如何封装的
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;
}
}
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;
}
}
<?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>
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);
}
那么接下来要如何改?实际上很简单了,因为我已经通过基类控制了。
某个用户界面是最复杂的 但是这个界面我也是不想改了的,而且这个界面基本上不需要改吧。我觉得。
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);
}
最后,我打算封装成一个库,可以解决底部固定问题又可以扩展控制随时可以砍掉这个功能,或者恢复这个功能
在附上我又调整过的
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 qssq666@foxmail.com
* 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;
}
}
}