代码效果图
代码记录 以备后用
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); } }
项目地址