/* * Copyright (C) 2012 www.amsoft.cn * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.ab.view.titlebar; import android.app.Activity; import android.content.Context; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.text.TextPaint; import android.util.AttributeSet; import android.util.TypedValue; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.PopupWindow; import com.ab.util.AbStrUtil; import com.ab.util.AbViewUtil; // TODO: Auto-generated Javadoc /** * © 2012 amsoft.cn * 名称:AbBottomBar.java * 描述:标题栏实现. * * @author 还如一梦中 * @version v1.0 * @date:2013-04-24 下午3:46:47 */ public class AbTitleBar extends LinearLayout { /** The m context. */ private Activity activity; /** 标题布局. */ protected LinearLayout titleTextLayout = null; /** 显示标题文字的View. */ protected Button titleTextBtn = null; /** 显示标题文字的小View. */ protected Button titleSmallTextBtn = null; /** 左侧的Logo图标View. */ protected ImageView logoView = null; /** 左侧的Logo图标View. */ protected ImageView logoView2 = null; /** 左侧的Logo图标右边的分割线View. */ protected ImageView logoLineView = null; /** 标题文本的对齐参数. */ private LinearLayout.LayoutParams titleTextLayoutParams = null; /** 右边布局的的对齐参数. */ private LinearLayout.LayoutParams rightViewLayoutParams = null; /** 右边的View,可以自定义显示什么. */ protected LinearLayout rightLayout = null; /** 标题栏布局ID. */ public int mAbTitleBarID = 1; /** 全局的LayoutInflater对象,已经完成初始化. */ public LayoutInflater mInflater; /** * LinearLayout.LayoutParams,已经初始化为FILL_PARENT, FILL_PARENT */ public LinearLayout.LayoutParams layoutParamsFF = null; /** * LinearLayout.LayoutParams,已经初始化为FILL_PARENT, WRAP_CONTENT */ public LinearLayout.LayoutParams layoutParamsFW = null; /** * LinearLayout.LayoutParams,已经初始化为WRAP_CONTENT, FILL_PARENT */ public LinearLayout.LayoutParams layoutParamsWF = null; /** * LinearLayout.LayoutParams,已经初始化为WRAP_CONTENT, WRAP_CONTENT */ public LinearLayout.LayoutParams layoutParamsWW = null; /** 下拉选择. */ private PopupWindow popupWindow; /** * Instantiates a new ab title bar. * * @param context the context * @param attrs the attrs */ public AbTitleBar(Context context, AttributeSet attrs) { super(context, attrs); ininTitleBar(context); } /** * Instantiates a new ab title bar. * * @param context the context */ public AbTitleBar(Context context) { super(context); ininTitleBar(context); } /** * Inin title bar. * * @param context the context */ public void ininTitleBar(Context context){ activity = (Activity)context; //水平排列 this.setOrientation(LinearLayout.HORIZONTAL); this.setId(mAbTitleBarID); mInflater = LayoutInflater.from(context); layoutParamsFF = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); layoutParamsFW = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); layoutParamsWF = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT); layoutParamsWW = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); layoutParamsWW.gravity = Gravity.CENTER_VERTICAL; titleTextLayoutParams = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT,1); titleTextLayoutParams.gravity = Gravity.CENTER_VERTICAL; rightViewLayoutParams = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); rightViewLayoutParams.gravity = Gravity.CENTER_VERTICAL; titleTextLayout = new LinearLayout(context); titleTextLayout.setOrientation(LinearLayout.VERTICAL); titleTextLayout.setGravity(Gravity.CENTER_VERTICAL); titleTextLayout.setPadding(0, 0, 0, 0); titleTextBtn = new Button(context); titleTextBtn.setTextColor(Color.rgb(255, 255, 255)); AbViewUtil.setTextSize(titleTextBtn,35); titleTextBtn.setPadding(5, 0, 5, 0); titleTextBtn.setGravity(Gravity.CENTER_VERTICAL); titleTextBtn.setBackgroundDrawable(null); titleTextBtn.setSingleLine(); titleTextLayout.addView(titleTextBtn,new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT,1)); titleSmallTextBtn = new Button(context); titleSmallTextBtn.setTextColor(Color.rgb(255, 255, 255)); AbViewUtil.setTextSize(titleSmallTextBtn,30); titleSmallTextBtn.setPadding(6, 0, 5, 0); titleSmallTextBtn.setGravity(Gravity.CENTER_VERTICAL); titleSmallTextBtn.setBackgroundDrawable(null); titleSmallTextBtn.setSingleLine(); titleTextLayout.addView(titleSmallTextBtn,new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,0)); logoView = new ImageView(context); logoView.setVisibility(View.GONE); logoLineView = new ImageView(context); logoLineView.setVisibility(View.GONE); logoView2 = new ImageView(context); logoView2.setVisibility(View.GONE); this.addView(logoView,layoutParamsWW); this.addView(logoLineView,layoutParamsWW); this.addView(logoView2,layoutParamsWW); this.addView(titleTextLayout,titleTextLayoutParams); // 加右边的布局 rightLayout = new LinearLayout(context); rightLayout.setOrientation(LinearLayout.HORIZONTAL); rightLayout.setGravity(Gravity.RIGHT); rightLayout.setPadding(0, 0, 0, 0); rightLayout.setHorizontalGravity(Gravity.RIGHT); rightLayout.setGravity(Gravity.CENTER_VERTICAL); rightLayout.setVisibility(View.GONE); this.addView(rightLayout,rightViewLayoutParams); logoView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { activity.finish(); } }); } /** * 描述:标题栏的背景图. * @param res 背景图资源ID */ public void setTitleBarBackground(int res) { this.setBackgroundResource(res); } /** * 描述:设置标题背景. * @param d 背景图 */ public void setTitleBarBackgroundDrawable(Drawable d) { this.setBackgroundDrawable(d); } /** * 描述:标题栏的背景图. * @param color 背景颜色值 */ public void setTitleBarBackgroundColor(int color) { this.setBackgroundColor(color); } /** * 描述:标题文字的对齐,需要在setTitleBarGravity之后设置才生效. * @param left the left * @param top the top * @param right the right * @param bottom the bottom */ public void setTitleTextMargin(int left,int top,int right,int bottom) { titleTextLayoutParams.setMargins(left, top, right, bottom); } /** * 描述:标题文字字号. * @param titleTextSize 文字字号 */ public void setTitleTextSize(int titleTextSize) { this.titleTextBtn.setTextSize(TypedValue.COMPLEX_UNIT_PX,AbViewUtil.scaleTextValue(activity, titleTextSize)); } /** * 描述:小标题文字字号. * @param titleSmallTextSize 文字字号 */ public void setTitleSmallTextSize(int titleSmallTextSize) { this.titleSmallTextBtn.setTextSize(TypedValue.COMPLEX_UNIT_PX,AbViewUtil.scaleTextValue(activity, titleSmallTextSize)); } /** * 描述:设置标题文字对齐方式 * 根据右边的具体情况判定方向: * (1)标题在中间 Gravity.CENTER,Gravity.CENTER * (2)左边居左 右边居右Gravity.LEFT,Gravity.RIGHT * (3)左边居中,右边居右Gravity.CENTER,Gravity.RIGHT * (4)左边居右,右边居右Gravity.RIGHT,Gravity.RIGHT * 必须在addRightView(view)方法后设置 * @param gravity1 标题对齐方式 * @param gravity2 右边布局对齐方式 */ public void setTitleBarGravity(int gravity1,int gravity2) { AbViewUtil.measureView(this.logoView); AbViewUtil.measureView(this.rightLayout); int leftWidth = this.logoView.getMeasuredWidth(); int rightWidth = this.rightLayout.getMeasuredWidth(); //if(D)Log.d(TAG, "测量布局的宽度:"+leftWidth+","+rightWidth); this.titleTextLayoutParams.rightMargin = 0; this.titleTextLayoutParams.leftMargin = 0; //全部中间靠 if((gravity1 == Gravity.CENTER_HORIZONTAL || gravity1 == Gravity.CENTER) ){ this.titleTextLayout.setGravity(Gravity.CENTER_HORIZONTAL); this.titleTextBtn.setGravity(Gravity.CENTER); if(gravity2 == Gravity.RIGHT){ this.rightLayout.setHorizontalGravity(Gravity.RIGHT); }else if(gravity2 == Gravity.LEFT){ this.rightLayout.setHorizontalGravity(Gravity.LEFT); }else if(gravity2 == Gravity.CENTER){ this.rightLayout.setHorizontalGravity(Gravity.CENTER); } int offset = leftWidth-rightWidth; this.titleTextLayoutParams.leftMargin = -offset; //左右 }else if(gravity1 == Gravity.LEFT && gravity2 == Gravity.RIGHT){ this.titleTextLayout.setGravity(Gravity.LEFT); this.rightLayout.setHorizontalGravity(Gravity.RIGHT); //全部右靠 }else if(gravity1 == Gravity.RIGHT && gravity2 == Gravity.RIGHT){ this.titleTextLayout.setGravity(Gravity.RIGHT); this.rightLayout.setHorizontalGravity(Gravity.RIGHT); }else if(gravity1 == Gravity.LEFT && gravity2 == Gravity.LEFT){ this.titleTextLayout.setGravity(Gravity.LEFT); this.rightLayout.setHorizontalGravity(Gravity.LEFT); } } /** * 描述:获取标题文本的Button. * @return the title Button view */ public Button getTitleTextButton() { return titleTextBtn; } /** * 描述:获取小标题文本的Button. * @return the title Button view */ public Button getTitleSmallTextButton() { return titleSmallTextBtn; } /** * 描述:获取标题Logo的View. * @return the logo view */ public ImageView getLogoView() { return logoView; } /** * 描述:获取标题Logo的View. * @return the logo view */ public ImageView getLogoView2() { return logoView2; } /** * 描述:设置标题字体粗体. * * @param bold the new title text bold */ public void setTitleTextBold(boolean bold){ TextPaint paint = titleTextBtn.getPaint(); if(bold){ //粗体 paint.setFakeBoldText(true); }else{ paint.setFakeBoldText(false); } } /** * 描述:设置标题背景. * * @param resId the new title text background resource */ public void setTitleTextBackgroundResource(int resId){ titleTextBtn.setBackgroundResource(resId); } /** * 描述:设置标题背景. * * @param drawable the new title text background drawable */ public void setTitleTextBackgroundDrawable(Drawable drawable){ titleTextBtn.setBackgroundDrawable(drawable); } /** * 描述:设置标题文本. * @param text 文本 */ public void setTitleText(String text) { titleTextBtn.setText(text); } /** * 描述:设置标题文本. * @param resId 文本的资源ID */ public void setTitleText(int resId) { titleTextBtn.setText(resId); } /** * 描述:设置小标题文本. * @param text 文本 */ public void setTitleSmallText(String text) { if(AbStrUtil.isEmpty(text)){ LinearLayout.LayoutParams titleSmallTextViewLayoutParams = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, 0); titleSmallTextBtn.setLayoutParams(titleSmallTextViewLayoutParams); titleSmallTextBtn.setText(""); }else{ LinearLayout.LayoutParams titleSmallTextViewLayoutParams = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); titleSmallTextBtn.setLayoutParams(titleSmallTextViewLayoutParams); titleSmallTextBtn.setText(text); } } /** * 描述:设置标题文本. * @param resId 文本的资源ID */ public void setTitleSmallText(int resId) { LinearLayout.LayoutParams titleSmallTextViewLayoutParams = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); titleSmallTextBtn.setLayoutParams(titleSmallTextViewLayoutParams); titleSmallTextBtn.setText(resId); } /** * 描述:设置Logo的背景图. * @param drawable Logo资源Drawable */ public void setLogo(Drawable drawable) { logoView.setVisibility(View.VISIBLE); logoView.setBackgroundDrawable(drawable); } /** * 描述:设置Logo的背景资源. * @param resId Logo资源ID */ public void setLogo(int resId) { logoView.setVisibility(View.VISIBLE); logoView.setBackgroundResource(resId); } /** * 描述:设置Logo的背景图. * @param drawable Logo资源Drawable */ public void setLogo2(Drawable drawable) { logoView2.setVisibility(View.VISIBLE); logoView2.setBackgroundDrawable(drawable); } /** * 描述:设置Logo的背景资源. * @param resId Logo资源ID */ public void setLogo2(int resId) { logoView2.setVisibility(View.VISIBLE); logoView2.setBackgroundResource(resId); } /** * 描述:设置Logo分隔线的背景资源. * @param resId Logo资源ID */ public void setLogoLine(int resId) { logoLineView.setVisibility(View.VISIBLE); logoLineView.setBackgroundResource(resId); } /** * 描述:设置Logo分隔线的背景图. * @param drawable Logo资源Drawable */ public void setLogoLine(Drawable drawable) { logoLineView.setVisibility(View.VISIBLE); logoLineView.setBackgroundDrawable(drawable); } /** * 描述:把指定的View填加到标题栏右边. * @param rightView 指定的View */ public void addRightView(View rightView) { rightLayout.setVisibility(View.VISIBLE); AbViewUtil.scaleContentView((ViewGroup)rightView); rightLayout.addView(rightView,layoutParamsFF); } /** * 描述:把指定资源ID表示的View填加到标题栏右边. * @param resId 指定的View的资源ID */ public void addRightView(int resId) { rightLayout.setVisibility(View.VISIBLE); ViewGroup view = (ViewGroup)mInflater.inflate(resId, null); AbViewUtil.scaleContentView(view); rightLayout.addView(view,layoutParamsFF); } /** * 描述:清除标题栏右边的View. */ public void clearRightView() { rightLayout.removeAllViews(); } /** * 获取这个右边的布局,可用来设置位置. * * @return the right layout */ public LinearLayout getRightLayout() { return rightLayout; } /** * 描述:设置Logo按钮的点击事件. * @param mOnClickListener 指定的返回事件 */ public void setLogoOnClickListener(View.OnClickListener mOnClickListener) { logoView.setOnClickListener(mOnClickListener); } /** * 描述:设置Logo按钮的点击事件. * @param mOnClickListener 指定的返回事件 */ public void setLogo2OnClickListener(View.OnClickListener mOnClickListener) { logoView2.setOnClickListener(mOnClickListener); } /** * 描述:设置标题的点击事件. * @param mOnClickListener 指定的返回事件 */ public void setTitleTextOnClickListener(View.OnClickListener mOnClickListener) { titleTextBtn.setOnClickListener(mOnClickListener); } /** * 描述:下拉菜单的的实现方法. * * @param parent the parent * @param view 要显示的View * @param offsetMode 不填满的模式 */ public void showWindow(View parent,View view,boolean offsetMode) { AbViewUtil.measureView(view); int popWidth = parent.getMeasuredWidth(); int popMargin = (this.getMeasuredHeight()-parent.getMeasuredHeight())/2; if(view.getMeasuredWidth()>parent.getMeasuredWidth()){ popWidth = view.getMeasuredWidth(); } if(offsetMode){ popupWindow = new PopupWindow(view, popWidth+10, LayoutParams.WRAP_CONTENT, true); }else{ popupWindow = new PopupWindow(view, LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT, true); } // 使其聚集 popupWindow.setFocusable(true); // 设置允许在外点击消失 popupWindow.setOutsideTouchable(true); // 这个是为了点击“返回Back”也能使其消失,并且并不会影响你的背景 popupWindow.setBackgroundDrawable(new ColorDrawable(android.R.color.transparent)); popupWindow.showAsDropDown(parent,0, popMargin+2); } /** * 描述:隐藏Window. */ public void hideWindow() { if (popupWindow != null) { popupWindow.dismiss(); } } /** * 描述:设置标题下拉的View. * * @param view the new title text drop down */ public void setTitleTextDropDown(final View view){ if(view == null){ return; } setTitleTextOnClickListener(new OnClickListener() { @Override public void onClick(View v) { showWindow(titleTextBtn,view,true); } }); } /** * 获取标题的全体布局. * * @return the title text layout */ public LinearLayout getTitleTextLayout() { return titleTextLayout; } /** * 获取子布局显示宽度比例 * 默认为标题填充,右边靠右. * * @param left the new child view fill parent */ public void setChildViewFillParent(boolean left) { if(left){ titleTextLayoutParams = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT,1); titleTextLayoutParams.gravity = Gravity.CENTER_VERTICAL; titleTextLayout.setLayoutParams(titleTextLayoutParams); rightViewLayoutParams = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); rightViewLayoutParams.gravity = Gravity.CENTER_VERTICAL; rightLayout.setLayoutParams(rightViewLayoutParams); }else{ titleTextLayoutParams = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); titleTextLayoutParams.gravity = Gravity.CENTER_VERTICAL; titleTextLayout.setLayoutParams(titleTextLayoutParams); rightViewLayoutParams = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT,1); rightViewLayoutParams.gravity = Gravity.CENTER_VERTICAL; rightLayout.setLayoutParams(rightViewLayoutParams); } } /** * 设置主标题栏高度. * @param height LayoutParams属性 和具体的大小px */ public void setTitleBarHeight(int height) { ViewGroup.LayoutParams params = this.getLayoutParams(); params.height = AbViewUtil.scaleValue(activity, height); this.setLayoutParams(params); } }