代码效果图
代码记录 以备后用
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.example.actionbar.utils.DisplayUtils;
import java.util.ArrayList;
public class ActionBarView extends LinearLayout {
private ImageView mBackBtn;
private OnClickListener mBackBtnClickListener;
private ImageView mCloseBtn;
private OnClickListener mCloseBtnClickListener;
private Context mContext;
private int mCurrentIndex = -1;
private OnClickListener mMenuClickListener;
private LinearLayout mMenuContainer;
private ViewGroup mTabBarContainer;
private OnClickListener mTabClickLisetener;
private LinearLayout mTabContainer;
private ImageView mTabSelectedMask;
private ArrayList<ZTab> mTabs;
private TextView mTitleView;
private BackButtonClickListener mUserSetBackBtnClickListener;
private CloseButtonClickListener mUserSetCloseBtnClickListener;
private TopMenuClickListener mUserSetMenuClickListener;
private TabClickListener mUserSetTabClickListener;
private int widthReducedValue;
public ActionBarView(Context context) {
super(context);
mContext = context;
}
public ActionBarView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
mContext = context;
}
public ActionBarView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
mContext = context;
}
private void initViews() {
mBackBtnClickListener = new OnClickListener() {
public void onClick(View v) {
if (mUserSetBackBtnClickListener != null) {
mUserSetBackBtnClickListener.onBackBtnClicked(v);
}
}
};
mCloseBtnClickListener = new OnClickListener() {
public void onClick(View v) {
if (mUserSetCloseBtnClickListener != null) {
mUserSetCloseBtnClickListener.onCloseBtnClicked(v);
}
}
};
mMenuClickListener = new OnClickListener() {
public void onClick(View v) {
TopMenu menu = (TopMenu) v.getTag();
if (mUserSetMenuClickListener != null) {
mUserSetMenuClickListener.onTopMenuClicked(menu);
}
}
};
mTabClickLisetener = new OnClickListener() {
public void onClick(View v) {
ZTab tag = (ZTab) v.getTag();
setSelectedTab(tag.getIndex());
if (mUserSetTabClickListener != null) {
mUserSetTabClickListener.onTabClicked(tag, tag.getIndex());
}
}
};
mBackBtn = ((ImageView) findViewById(R.id.title_bar_back_btn));
mBackBtn.setOnClickListener(mBackBtnClickListener);
mCloseBtn = ((ImageView) findViewById(R.id.title_bar_close_btn));
mCloseBtn.setOnClickListener(mCloseBtnClickListener);
mTitleView = ((TextView) findViewById(R.id.title_bar_title_center));
mMenuContainer = ((LinearLayout) findViewById(R.id.title_bar_menu_container));
mTabBarContainer = ((ViewGroup) findViewById(R.id.tab_bar_container));
mTabContainer = ((LinearLayout) findViewById(R.id.tab_bar_tabs_container));
mTabSelectedMask = ((ImageView) findViewById(R.id.tab_bar_selected_mask));
return;
}
public int addTab(ZTab tab) {
if (tab == null) {
return -1;
}
if (mTabs == null) {
mTabs = new ArrayList();
}
if (!mTabs.contains(tab)) {
mTabBarContainer.setVisibility(VISIBLE);
mTabs.add(tab);
int i = mTabs.size() - 1;
tab.setIndex(i);
TextView localTextView = new TextView(getContext());
localTextView.setText(tab.mTitle);
localTextView.setGravity(17);
localTextView.setTextSize(0, getResources().getDimension(R.dimen.tab_bar_tab_text_size));
localTextView.setTextColor(getResources().getColor(R.color.text_main_title));
localTextView.setOnClickListener(mTabClickLisetener);
localTextView.setTag(tab);
LayoutParams params = new LayoutParams(0, ViewGroup.LayoutParams.MATCH_PARENT);
params.weight = 1.0F;
mTabContainer.addView(localTextView, params);
requestLayout();
return i;
}
return -1;
}
public void addTopMenu(TopMenu menu) {
if (menu != null) {
ImageView imageView = new ImageView(getContext());
LayoutParams layoutParams = new LayoutParams(-2, -2);
imageView.setLayoutParams(layoutParams);
imageView.setImageDrawable(menu.mIcon);
imageView.setScaleType(ScaleType.CENTER);
imageView.setOnClickListener(mMenuClickListener);
imageView.setTag(menu);
mMenuContainer.addView(imageView, layoutParams);
}
}
public void addTopMenu(TopMenu menu, OnClickListener onClickListener) {
if (menu != null) {
ImageView imageView = new ImageView(getContext());
LayoutParams layoutParams = new LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
imageView.setLayoutParams(layoutParams);
imageView.setImageDrawable(menu.mIcon);
imageView.setScaleType(ScaleType.CENTER);
imageView.setOnClickListener(onClickListener);
imageView.setTag(menu);
mMenuContainer.addView(imageView, layoutParams);
}
}
public void animateMask(int position, float positionOffset) {
int i = mTabContainer.getWidth() / mTabs.size();
mTabSelectedMask.setTranslationX(i * (position + positionOffset) + this.widthReducedValue / 2);
}
public void disableBackBtn() {
mBackBtn.setVisibility(VISIBLE);
}
public void enableCloseBtn() {
mCloseBtn.setVisibility(GONE);
}
public void hideAllTabs() {
mTabBarContainer.setVisibility(VISIBLE);
}
public void hideAllTopMenus() {
mMenuContainer.setVisibility(VISIBLE);
}
public void hideTopMenu(int paramInt) {
if (paramInt != 0) {
for (int i = 0; i < mMenuContainer.getChildCount(); i++) {
View localView = mMenuContainer.getChildAt(i);
if (((TopMenu) localView.getTag()).getId() == paramInt) {
localView.setVisibility(GONE);
}
}
}
}
public void hideTopMenu(TopMenu paramTopMenu) {
if (paramTopMenu != null) {
for (int i = 0; i < mMenuContainer.getChildCount(); i++) {
View localView = mMenuContainer.getChildAt(i);
if ((TopMenu) localView.getTag() == paramTopMenu) {
localView.setVisibility(GONE);
}
}
}
}
protected void onFinishInflate() {
super.onFinishInflate();
initViews();
post(new Runnable() {
@Override
public void run() {
requestLayout();
}
});
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
Log.e("AAA-->" + "wlj", "onLayout: " + mCurrentIndex);
if (mTabs != null && mTabs.size() > 0 && mCurrentIndex != -1) {
int containerWidth = mTabContainer.getMeasuredWidth();
int tabSize = mTabs.size();
widthReducedValue = DisplayUtils.dp2px(getContext(), 120 / tabSize);
int width = containerWidth / tabSize - widthReducedValue;
Log.e("AAA-->" + "wlj", "onLayout: " + width + "--" + mTabSelectedMask.getWidth());
if (mTabSelectedMask.getWidth() != width) {
ViewGroup.LayoutParams layoutParams = mTabSelectedMask.getLayoutParams();
layoutParams.width = width;
int translationX = mCurrentIndex * (widthReducedValue + width) + widthReducedValue / 2;
if (mTabSelectedMask.getTranslationX() != translationX) {
mTabSelectedMask.setTranslationX(translationX);
}
mTabSelectedMask.setLayoutParams(layoutParams);
}
}
super.onLayout(changed, l, t, r, b);
}
public void setOnBackButtonClickListener(BackButtonClickListener backButtonClickListener) {
mUserSetBackBtnClickListener = backButtonClickListener;
}
public void setOnCloseButtonClickListener(CloseButtonClickListener paramCloseButtonClickListener) {
mUserSetCloseBtnClickListener = paramCloseButtonClickListener;
}
public void setOnTabClickListener(TabClickListener paramTabClickListener) {
mUserSetTabClickListener = paramTabClickListener;
}
public void setOnTopMenuClickListener(TopMenuClickListener paramTopMenuClickListener) {
mUserSetMenuClickListener = paramTopMenuClickListener;
}
public boolean setSelectedTab(int position) {
if ((mTabs.size() <= position) || (position < 0)) {
return false;
}
if (mCurrentIndex != position) {
int i = mCurrentIndex;
mCurrentIndex = position;
((TextView) mTabContainer.getChildAt(position)).setTextColor(getResources().getColor(R.color.text_main_title_high_light));
if ((i != -1) && (i >= 0) && (i < mTabs.size())) {
((TextView) mTabContainer.getChildAt(i)).setTextColor(getResources().getColor(R.color.text_main_title));
}
}
return true;
}
public void setTitle(int ids) {
setTitle(getResources().getString(ids));
}
public void setTitle(String paramString) {
if (mTitleView != null) {
mTitleView.setText(paramString);
}
}
public void setTitleGravityLeft(String title) {
if (mTitleView != null) {
mTitleView.setText(title);
float f = getResources().getDisplayMetrics().density;
mTitleView.setPadding((int) (148.0F * f / 3.0F), 0, (int) (444.0F * f / 3.0F), 0);
}
}
public void showAllTabs() {
mTabBarContainer.setVisibility(VISIBLE);
}
public void showAllTopMenus() {
mMenuContainer.setVisibility(VISIBLE);
}
public void showTopMenu(int paramInt) {
if (paramInt != 0) {
int count = mMenuContainer.getChildCount();
for (int i = 0; i < count; i++) {
View localView = mMenuContainer.getChildAt(i);
if (((TopMenu) localView.getTag()).getId() == paramInt) {
localView.setVisibility(GONE);
}
}
}
}
public void showTopMenu(TopMenu paramTopMenu) {
if (paramTopMenu != null) {
int childCount = mMenuContainer.getChildCount();
for (int i = 0; i < childCount; i++) {
View localView = mMenuContainer.getChildAt(i);
if ((TopMenu) localView.getTag() == paramTopMenu) {
localView.setVisibility(GONE);
}
}
}
}
public void updateTopMenu(int paramInt, TopMenu paramTopMenu, OnClickListener paramOnClickListener) {
mMenuContainer.removeAllViews();
if (paramTopMenu != null) {
ImageView iv = new ImageView(getContext());
LayoutParams params = new LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT
);
iv.setLayoutParams(params);
iv.setImageDrawable(paramTopMenu.mIcon);
iv.setScaleType(ScaleType.CENTER);
iv.setOnClickListener(paramOnClickListener);
iv.setTag(paramTopMenu);
mMenuContainer.addView(iv, paramInt, params);
}
}
public interface BackButtonClickListener {
void onBackBtnClicked(View paramView);
}
public interface CloseButtonClickListener {
void onCloseBtnClicked(View paramView);
}
public interface TabClickListener {
void onTabClicked(ZTab tab, int position);
}
public interface TopMenuClickListener {
void onTopMenuClicked(TopMenu menu);
}
public static class TopMenu {
private Drawable mIcon;
private int mId;
private Object mTag;
public TopMenu(Drawable drawable) {
mIcon = drawable;
}
public int getId() {
return mId;
}
public void setId(int id) {
mId = id;
}
public Object getTag() {
return mTag;
}
public void setTag(Object tag) {
mTag = tag;
}
}
public static class ZTab {
private int mIndex;
private Object mTag;
private String mTitle;
public ZTab(String title) {
mTitle = title;
}
public int getIndex() {
return mIndex;
}
private void setIndex(int index) {
mIndex = index;
}
public Object getTag() {
return mTag;
}
public void setTag(Object tag) {
mTag = tag;
}
}
}
使用方法
public class MainActivity extends AppCompatActivity {
private ActionBarView actionBar;
private ViewPager pager;
private String[] titles = new String[]{"第一个", "第二个", "第三个"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initListener();
}
private void initListener() {
pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
actionBar.animateMask(position, positionOffset);
}
@Override
public void onPageSelected(int position) {
actionBar.setSelectedTab(position);
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
}
@Override
protected void onResume() {
super.onResume();
actionBar.requestLayout();
Log.e("AAA-->" + "wlj", "onResume: ");
}
@Override
protected void onPause() {
super.onPause();
}
private void initView() {
actionBar = ((ActionBarView) findViewById(R.id.ts_action_bar));
pager = ((ViewPager) findViewById(R.id.main_viewpager));
for (int i = 0; i < titles.length; i++) {
actionBar.addTab(new ActionBarView.ZTab(titles[i]));
}
ActionBarView.TopMenu menu = null;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
menu = new ActionBarView.TopMenu(getDrawable(R.drawable.actionbar_download));
}
actionBar.addTopMenu(menu, new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "下载", Toast.LENGTH_SHORT).show();
}
});
actionBar.setOnTabClickListener(new ActionBarView.TabClickListener() {
@Override
public void onTabClicked(ActionBarView.ZTab tab, int position) {
pager.setCurrentItem(position);
}
});
actionBar.setTitle("标题");
actionBar.setSelectedTab(0);
actionBar.setOnBackButtonClickListener(new ActionBarView.BackButtonClickListener() {
@Override
public void onBackBtnClicked(View paramView) {
Toast.makeText(MainActivity.this, "返回", Toast.LENGTH_SHORT).show();
}
});
pager.setAdapter(new ThemePagerAdapter());
}
public class ThemePagerAdapter extends PagerAdapter {
@Override
public int getCount() {
return titles.length;
}
@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
return view == object;
}
@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
ImageView iv = new ImageView(MainActivity.this);
iv.setLayoutParams(new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT)
);
iv.setImageResource(R.drawable.ic_launcher_background);
container.addView(iv);
return iv;
}
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
container.removeView((View) object);
}
}
项目地址