Android-Tab单选控件

今天看到项目中有一个控件写得非常漂亮,据说是github上开源的控件,地址没找到,如下图所示,非常常见的效果,几个tab页面来回切换:

转载请标明出处:http://blog.csdn.net/goldenfish1919/article/details/46799341

FlatTabGroup.java:

[java]  view plain  copy
  1. public class FlatTabGroup extends RadioGroup implements RadioGroup.OnCheckedChangeListener {  
  2.     public FlatTabGroup(Context context) {  
  3.         this(context, null);  
  4.     }  
  5.   
  6.     private int mRadius;  
  7.     private int mStroke;  
  8.     private int mHighlightColor;  
  9.     private String[] mItemString;  
  10.     private float mTextSize;  
  11.     private ColorStateList mTextColor;  
  12.     private int[] mTabViewIds;  
  13.     private OnTabCheckedListener mTabCheckedListener;  
  14.   
  15.     public FlatTabGroup(Context context, AttributeSet attrs) {  
  16.         super(context, attrs);  
  17.         setOrientation(HORIZONTAL);  
  18.         setGravity(Gravity.CENTER_VERTICAL);  
  19.         TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.FlatTabGroup);  
  20.         mHighlightColor = array.getColor(R.styleable.FlatTabGroup_tab_border_color, Color.WHITE);  
  21.         mStroke = array.getDimensionPixelSize(R.styleable.FlatTabGroup_tab_border_width, 2);  
  22.         mRadius = array.getDimensionPixelOffset(R.styleable.FlatTabGroup_tab_radius, 5);  
  23.         mTextColor = array.getColorStateList(R.styleable.FlatTabGroup_tab_textColor);  
  24.         mTextSize = array.getDimensionPixelSize(R.styleable.FlatTabGroup_tab_textSize, 14);  
  25.         int id = array.getResourceId(R.styleable.FlatTabGroup_tab_items, 0);  
  26.         array.recycle();  
  27.         mItemString = isInEditMode() ? new String[] { "TAB A""TAB B""TAB C"} : context.getResources().getStringArray(id);  
  28.         generateTabView(context, attrs);  
  29.         super.setOnCheckedChangeListener(this);  
  30.           
  31.     }  
  32.   
  33.     private void generateTabView(Context context, AttributeSet attrs) {  
  34.         if (mItemString == null) {  
  35.             return;  
  36.         }  
  37.         mTabViewIds = new int[mItemString.length];  
  38.         for (int i=0; i<mItemString.length;i++ ) {  
  39.         <span style="white-space:pre">    </span>String text = mItemString[i];  
  40.             RadioButton button = new RadioButton(context, attrs);  
  41.             button.setGravity(Gravity.CENTER);  
  42.             button.setButtonDrawable(android.R.color.transparent);  
  43.             button.setText(text);  
  44.             button.setTextColor(mTextColor);  
  45.             button.setTextSize(TypedValue.COMPLEX_UNIT_PX, mTextSize);  
  46.             button.setId(mTabViewIds[i] = generateViewIds());  
  47.             LayoutParams lp = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT, 1);  
  48.             if(i < mItemString.length - 1){  
  49.             <span style="white-space:pre">  </span>lp.rightMargin = -1 * mStroke;  
  50.             }  
  51.             addView(button, lp);  
  52.         }  
  53.     }  
  54.     public void setOnTabCheckedListener(OnTabCheckedListener listener) {  
  55.         mTabCheckedListener = listener;  
  56.     }  
  57.   
  58.     public void setSelection(int position) {  
  59.         check(getChildAt(position).getId());  
  60.     }  
  61.   
  62.     @Override  
  63.     public void onCheckedChanged(RadioGroup group, int checkedId) {  
  64.         if (mTabCheckedListener != null) {  
  65.             int checkedPosition = -1;  
  66.             for (int i = 0; i < mTabViewIds.length; i++) {  
  67.                 if (mTabViewIds[i] == checkedId) {  
  68.                     checkedPosition = i;  
  69.                     break;  
  70.                 }  
  71.             }  
  72.             mTabCheckedListener.onChecked(this, checkedPosition);  
  73.         }  
  74.     }  
  75.   
  76.     @Override  
  77.     protected void onFinishInflate() {  
  78.         super.onFinishInflate();  
  79.         updateChildBackground();  
  80.     }  
  81.   
  82.     @SuppressWarnings("deprecation")  
  83.     private void updateChildBackground() {  
  84.         for (int i = 0; i < getChildCount(); i++) {  
  85.             View child = getChildAt(i);  
  86.             if (child instanceof RadioButton) {  
  87.                 child.setBackgroundDrawable(generateTabBackground(i, mHighlightColor));  
  88.             }  
  89.         }  
  90.     }  
  91.   
  92.     private Drawable generateTabBackground(int position, int color) {//如何用代码定义selector  
  93.         StateListDrawable stateListDrawable = new StateListDrawable();  
  94.         stateListDrawable.addState(new int[] {android.R.attr.state_checked}, generateDrawable(position, color));  
  95.         stateListDrawable.addState(new int[] {                            }, generateDrawable(position, Color.TRANSPARENT));  
  96.         return stateListDrawable;  
  97.     }  
  98.   
  99.     private Drawable generateDrawable(int position, int color) {  
  100.         float[] radius;  
  101.         if (position == 0) {  
  102.             radius = new float[] {  
  103.                     mRadius, mRadius,  
  104.                     00,  
  105.                     00,  
  106.                     mRadius, mRadius  
  107.             };  
  108.         } else if (position == getChildCount() - 1) {  
  109.             radius = new float[] {  
  110.                     00,  
  111.                     mRadius, mRadius,  
  112.                     mRadius, mRadius,  
  113.                     00  
  114.             };  
  115.         } else {  
  116.             radius = new float[] {  
  117.                     00,  
  118.                     00,  
  119.                     00,  
  120.                     00  
  121.             };  
  122.         }  
  123.         GradientDrawable shape = new GradientDrawable();//如何用代码生成圆角shape  
  124.         shape.setCornerRadii(radius);  
  125.         shape.setColor(color);  
  126.         shape.setStroke(mStroke, mHighlightColor);  
  127.         return shape;  
  128.     }  
  129.   
  130.     private static final AtomicInteger sNextGeneratedId = new AtomicInteger(1);//如何使用自定义的id  
  131.   
  132.     /** 
  133.      * Generate a value suitable for use in {@link #setId(int)}. This value will 
  134.      * not collide with ID values generated at build time by aapt for R.id. 
  135.      *  
  136.      * @return a generated ID value 
  137.      */  
  138.     public static int generateViewIds() {  
  139.         for (;;) {  
  140.             final int result = sNextGeneratedId.get();  
  141.             // aapt-generated IDs have the high byte nonzero; clamp to the range  
  142.             // under that.  
  143.             int newValue = result + 1;  
  144.             if (newValue > 0x00FFFFFF)  
  145.                 newValue = 1// Roll over to 1, not 0.  
  146.             if (sNextGeneratedId.compareAndSet(result, newValue)) {  
  147.                 return result;  
  148.             }  
  149.         }  
  150.     }  
  151.   
  152.     public static interface OnTabCheckedListener {  
  153.         public void onChecked(FlatTabGroup group, int position);  
  154.     }  
  155. }  
这里有几个点挺有意思:

(1)如何用代码做selector

(2)如何用代码生成圆角

(3)如何使用自定义的id

attr_flat_tab_group.xml:

[java]  view plain  copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <resources>  
  3.     <declare-styleable name="FlatTabGroup">  
  4.         <attr name="tab_items" format="reference" />  
  5.         <attr name="tab_border_width" format="dimension|reference" />  
  6.         <attr name="tab_border_color" format="color|reference" />  
  7.         <attr name="tab_radius" format="dimension|reference" />  
  8.         <attr name="tab_textColor" format="reference" />  
  9.         <attr name="tab_textSize" format="dimension|reference" />  
  10.     </declare-styleable>  
  11. </resources>  

arrays_flat_tab_group.xml:

[java]  view plain  copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <resources>  
  3.     <string-array name="array_tabs_more_video">  
  4.         <item>实时直播</item>  
  5.         <item>直播预约</item>  
  6.         <item>精彩回看</item>  
  7.     </string-array>  
  8. </resources>  
引用的时候:

[html]  view plain  copy
  1. <com.example.view.FlatTabGroup  
  2.          android:id="@+id/flat_tab_group"  
  3.          android:layout_width="match_parent"  
  4.          android:layout_height="50dp"  
  5.          android:paddingBottom="5dp"  
  6.          android:paddingTop="5dp"  
  7.          android:layout_marginLeft="10dp"  
  8.          android:layout_marginRight="10dp"  
  9.          android:layout_gravity="center_vertical"  
  10.          app:tab_border_color="#cdcdcd"  
  11.          app:tab_border_width="1dp"  
  12.          app:tab_items="@array/array_tabs_more_video"  
  13.          app:tab_radius="5dp"  
  14.          app:tab_textColor="@android:color/black"  
  15.          app:tab_textSize="16sp"/>  

[java]  view plain  copy
  1.    FlatTabGroup tabs = (FlatTabGroup)this.findViewById(R.id.flat_tab_group);  
  2.    tabs.setOnTabCheckedListener(new OnTabCheckedListener(){  
  3. @Override  
  4. public void onChecked(FlatTabGroup group, int position) {  
  5.     Toast.makeText(MainActivity.this""+position, Toast.LENGTH_SHORT).show();  
  6. }  
  7.    });  
  8.    tabs.setSelection(0);  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值