• Android-Tab单选控件


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

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

    FlatTabGroup.java:

    public class FlatTabGroup extends RadioGroup implements RadioGroup.OnCheckedChangeListener {
        public FlatTabGroup(Context context) {
            this(context, null);
        }
    
        private int mRadius;
        private int mStroke;
        private int mHighlightColor;
        private String[] mItemString;
        private float mTextSize;
        private ColorStateList mTextColor;
        private int[] mTabViewIds;
        private OnTabCheckedListener mTabCheckedListener;
    
        public FlatTabGroup(Context context, AttributeSet attrs) {
            super(context, attrs);
            setOrientation(HORIZONTAL);
            setGravity(Gravity.CENTER_VERTICAL);
            TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.FlatTabGroup);
            mHighlightColor = array.getColor(R.styleable.FlatTabGroup_tab_border_color, Color.WHITE);
            mStroke = array.getDimensionPixelSize(R.styleable.FlatTabGroup_tab_border_width, 2);
            mRadius = array.getDimensionPixelOffset(R.styleable.FlatTabGroup_tab_radius, 5);
            mTextColor = array.getColorStateList(R.styleable.FlatTabGroup_tab_textColor);
            mTextSize = array.getDimensionPixelSize(R.styleable.FlatTabGroup_tab_textSize, 14);
            int id = array.getResourceId(R.styleable.FlatTabGroup_tab_items, 0);
            array.recycle();
            mItemString = isInEditMode() ? new String[] { "TAB A", "TAB B", "TAB C"} : context.getResources().getStringArray(id);
            generateTabView(context, attrs);
            super.setOnCheckedChangeListener(this);
            
        }
    
        private void generateTabView(Context context, AttributeSet attrs) {
            if (mItemString == null) {
                return;
            }
            mTabViewIds = new int[mItemString.length];
            for (int i=0; i<mItemString.length;i++ ) {
            <span style="white-space:pre">	</span>String text = mItemString[i];
                RadioButton button = new RadioButton(context, attrs);
                button.setGravity(Gravity.CENTER);
                button.setButtonDrawable(android.R.color.transparent);
                button.setText(text);
                button.setTextColor(mTextColor);
                button.setTextSize(TypedValue.COMPLEX_UNIT_PX, mTextSize);
                button.setId(mTabViewIds[i] = generateViewIds());
                LayoutParams lp = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT, 1);
                if(i < mItemString.length - 1){
                <span style="white-space:pre">	</span>lp.rightMargin = -1 * mStroke;
                }
                addView(button, lp);
            }
        }
        public void setOnTabCheckedListener(OnTabCheckedListener listener) {
            mTabCheckedListener = listener;
        }
    
        public void setSelection(int position) {
            check(getChildAt(position).getId());
        }
    
        @Override
        public void onCheckedChanged(RadioGroup group, int checkedId) {
            if (mTabCheckedListener != null) {
                int checkedPosition = -1;
                for (int i = 0; i < mTabViewIds.length; i++) {
                    if (mTabViewIds[i] == checkedId) {
                        checkedPosition = i;
                        break;
                    }
                }
                mTabCheckedListener.onChecked(this, checkedPosition);
            }
        }
    
        @Override
        protected void onFinishInflate() {
            super.onFinishInflate();
            updateChildBackground();
        }
    
        @SuppressWarnings("deprecation")
    	private void updateChildBackground() {
            for (int i = 0; i < getChildCount(); i++) {
                View child = getChildAt(i);
                if (child instanceof RadioButton) {
                    child.setBackgroundDrawable(generateTabBackground(i, mHighlightColor));
                }
            }
        }
    
        private Drawable generateTabBackground(int position, int color) {//怎样用代码定义selector
            StateListDrawable stateListDrawable = new StateListDrawable();
            stateListDrawable.addState(new int[] {android.R.attr.state_checked}, generateDrawable(position, color));
            stateListDrawable.addState(new int[] {                            }, generateDrawable(position, Color.TRANSPARENT));
            return stateListDrawable;
        }
    
        private Drawable generateDrawable(int position, int color) {
            float[] radius;
            if (position == 0) {
                radius = new float[] {
                        mRadius, mRadius,
                        0, 0,
                        0, 0,
                        mRadius, mRadius
                };
            } else if (position == getChildCount() - 1) {
                radius = new float[] {
                        0, 0,
                        mRadius, mRadius,
                        mRadius, mRadius,
                        0, 0
                };
            } else {
                radius = new float[] {
                        0, 0,
                        0, 0,
                        0, 0,
                        0, 0
                };
            }
            GradientDrawable shape = new GradientDrawable();//怎样用代码生成圆角shape
            shape.setCornerRadii(radius);
            shape.setColor(color);
            shape.setStroke(mStroke, mHighlightColor);
            return shape;
        }
    
        private static final AtomicInteger sNextGeneratedId = new AtomicInteger(1);//怎样使用自己定义的id
    
        /**
         * Generate a value suitable for use in {@link #setId(int)}. This value will
         * not collide with ID values generated at build time by aapt for R.id.
         * 
         * @return a generated ID value
         */
        public static int generateViewIds() {
            for (;;) {
                final int result = sNextGeneratedId.get();
                // aapt-generated IDs have the high byte nonzero; clamp to the range
                // under that.
                int newValue = result + 1;
                if (newValue > 0x00FFFFFF)
                    newValue = 1; // Roll over to 1, not 0.
                if (sNextGeneratedId.compareAndSet(result, newValue)) {
                    return result;
                }
            }
        }
    
        public static interface OnTabCheckedListener {
            public void onChecked(FlatTabGroup group, int position);
        }
    }
    
    这里有几个点挺有意思:

    (1)怎样用代码做selector

    (2)怎样用代码生成圆角

    (3)怎样使用自己定义的id

    attr_flat_tab_group.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <declare-styleable name="FlatTabGroup">
            <attr name="tab_items" format="reference" />
            <attr name="tab_border_width" format="dimension|reference" />
            <attr name="tab_border_color" format="color|reference" />
            <attr name="tab_radius" format="dimension|reference" />
            <attr name="tab_textColor" format="reference" />
            <attr name="tab_textSize" format="dimension|reference" />
        </declare-styleable>
    </resources>

    arrays_flat_tab_group.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <string-array name="array_tabs_more_video">
            <item>实时直播</item>
            <item>直播预约</item>
            <item>精彩回看</item>
        </string-array>
    </resources>
    引用的时候:

    <com.example.view.FlatTabGroup
             android:id="@+id/flat_tab_group"
             android:layout_width="match_parent"
             android:layout_height="50dp"
             android:paddingBottom="5dp"
             android:paddingTop="5dp"
    		 android:layout_marginLeft="10dp"
    		 android:layout_marginRight="10dp"
             android:layout_gravity="center_vertical"
             app:tab_border_color="#cdcdcd"
             app:tab_border_width="1dp"
             app:tab_items="@array/array_tabs_more_video"
             app:tab_radius="5dp"
             app:tab_textColor="@android:color/black"
             app:tab_textSize="16sp"/>

          FlatTabGroup tabs = (FlatTabGroup)this.findViewById(R.id.flat_tab_group);
          tabs.setOnTabCheckedListener(new OnTabCheckedListener(){
    			@Override
    			public void onChecked(FlatTabGroup group, int position) {
    				Toast.makeText(MainActivity.this, ""+position, Toast.LENGTH_SHORT).show();
    			}
          });
          tabs.setSelection(0);


  • 相关阅读:
    Android睡眠唤醒机制--Kernel态
    android-铃声的设置与播放
    Android RingtoneManager 铃声管理
    RingtoneManager-获得系统当前的铃声
    Android RingtoneManager铃声管理
    android中常见声音操作方式(Ringtone,SoundPool,MediaPlayer)小结
    android 闹钟提醒并且在锁屏下弹出Dialog对话框并播放铃声和震动
    CSS中常见的BUG调试
    row_number() OVER (PARTITION BY COL1 ORDER BY COL2)
    android平台中,EventBus研究学习
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5213559.html
Copyright © 2020-2023  润新知