精华内容
下载资源
问答
  • android tabbar

    2019-04-20 23:11:15
    使用android默认的底部BottomNavigationView控件,实现fragment页面切换。
  • Android TabBar 导航栏

    2015-10-21 21:13:22
    这是一个自定义的Android导航栏,使用方便,可以通过调用里面的方法去设置自己的风格 。 Android TabBar 导航栏
  • Android Tabbar实现

    2016-10-31 08:47:58
    使用TabActivity实现底部Tabbar
  • } /** 自定义tabbar **/ tabBarView(){ return ( tabBarStyle={styles.tab} > {this.renderTabView('头条','Home','头条板块',true)} {this.renderTabView('视频','Video','视频板块',false)} {this.renderTabView...

    接下来我来简单说明如何应用,首先进入到项目的根目录引入开源支持包:

    npm install react-native-tab-navigator --save

    2c006bfe7053902912389778e5582a88.png

    确保支持包导入进来.

    0239216fcbb5be5f6bb51c2be8720d51.png

    使用简介:

    selected={this.state.selectedTab === 'home'}

    title="Home"

    renderIcon={() => }

    renderSelectedIcon={() => }

    badgeText="1"

    onPress={() => this.setState({ selectedTab: 'home' })}>

    {homeView}

    selected={this.state.selectedTab === 'profile'}

    title="Profile"

    renderIcon={() => }

    renderSelectedIcon={() => }

    renderBadge={() => }

    onPress={() => this.setState({ selectedTab: 'profile' })}>

    {profileView}

    通过使用简介我们可以了解该组件如何使用,但是复杂的UI操作就得需要查看源码了解究竟了,,比如:我们要如何修改TabNavigator.Item的title样式和badgeText的样式.

    源码如下:

    export default class TabNavigatorItem extends React.Component {

    static propTypes = {

    renderIcon: PropTypes.func,

    renderSelectedIcon: PropTypes.func,

    badgeText: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),

    renderBadge: PropTypes.func,

    title: PropTypes.string,

    titleStyle: Text.propTypes.style,

    selectedTitleStyle: Text.propTypes.style,

    tabStyle: View.propTypes.style,

    selected: PropTypes.bool,

    onPress: PropTypes.func,

    allowFontScaling: PropTypes.bool,

    };

    可以看出renderIcon和renderSelectedIcon对应的PropTypes.func方法,个人感觉这么做非常好,可自定义性非常大,

    selectedTitleStyle字面意思可以看出是选中文字的样式,而renderBadge对应的是渲染Badge的方法.

    比如:

    title='头条'

    renderIcon={()=>}

    renderSelectedIcon={()=>}

    selected={this.state.selectedTab==='Home'}

    selectedTitleStyle={{color:'#f85959'}}

    onPress={()=>this.onPress('Home')}

    renderBadge={()=>15}

    >

    最后贴下全部代码:

    /**

    * Sample React Native App

    * https://github.com/facebook/react-native

    * @flow

    */

    import React, { Component } from 'react';

    import {

    AppRegistry,

    StyleSheet,

    Text,

    View,

    Image,

    } from 'react-native';

    //引入tabbar支持包

    import TabNavigator from 'react-native-tab-navigator';

    const TabNavigatorItem =TabNavigator.Item;

    const TAB_NORMAL_1=require('./images/tabbar_1.png');

    const TAB_NORMAL_2=require('./images/tabbar_2.png');

    const TAB_NORMAL_3=require('./images/tabbar_3.png');

    const TAB_NORMAL_4=require('./images/tabbar_4.png');

    const TAB_PRESS_1=require('./images/tabbar_1_press.png');

    const TAB_PRESS_2=require('./images/tabbar_2_press.png');

    const TAB_PRESS_3=require('./images/tabbar_3_press.png');

    const TAB_PRESS_4=require('./images/tabbar_4_press.png');

    class toutiao extends Component {

    constructor(){

    super();

    this.state={

    selectedTab:'Home',

    }

    }

    /**

    tab点击方法

    **/

    onPress(tabName){

    if(tabName){

    this.setState(

    {

    selectedTab:tabName,

    }

    );

    }

    }

    /**

    渲染每项

    **/

    renderTabView(title,tabName,tabContent,isBadge){

    var tabNomal;

    var tabPress;

    switch (tabName) {

    case 'Home':

    tabNomal=TAB_NORMAL_1;

    tabPress=TAB_PRESS_1;

    break;

    case 'Video':

    tabNomal=TAB_NORMAL_2;

    tabPress=TAB_PRESS_2;

    break;

    case 'Follow':

    tabNomal=TAB_NORMAL_3;

    tabPress=TAB_PRESS_3;

    break;

    case 'Mine':

    tabNomal=TAB_NORMAL_4;

    tabPress=TAB_PRESS_4;

    break;

    default:

    }

    return(

    title={title}

    renderIcon={()=>}

    renderSelectedIcon={()=>}

    selected={this.state.selectedTab===tabName}

    selectedTitleStyle={{color:'#f85959'}}

    onPress={()=>this.onPress(tabName)}

    renderBadge={()=>isBadge?15:null}

    >

    {tabContent}

    );

    }

    /**

    自定义tabbar

    **/

    tabBarView(){

    return (

    tabBarStyle={styles.tab}

    >

    {this.renderTabView('头条','Home','头条板块',true)}

    {this.renderTabView('视频','Video','视频板块',false)}

    {this.renderTabView('关注','Follow','关注板块',false)}

    {this.renderTabView('我的','Mine','我的板块',false)}

    );

    }

    render() {

    var tabBarView=this.tabBarView();

    return (

    {tabBarView}

    );

    }

    }

    const styles = StyleSheet.create({

    container: {

    flex: 1,

    backgroundColor: '#F5FCFF',

    },

    welcome: {

    fontSize: 20,

    textAlign: 'center',

    margin: 10,

    },

    instructions: {

    textAlign: 'center',

    color: '#333333',

    marginBottom: 5,

    },

    tab:{

    height: 52,

    alignItems:'center',

    backgroundColor:'#f4f5f6',

    },

    tabIcon:{

    width:25,

    height:25,

    },

    badgeView:{

    width:22,

    height:14 ,

    backgroundColor:'#f85959',

    borderWidth:1,

    marginLeft:10,

    marginTop:3,

    borderColor:'#FFF',

    alignItems:'center',

    justifyContent:'center',

    borderRadius:8,

    },

    badgeText:{

    color:'#fff',

    fontSize:8,

    }

    });

    AppRegistry.registerComponent('toutiao', () => toutiao);

    最后贴下效果图:可以看到实现了跨平台体验,不过由于设备分辨率不统一所以适配上需要花些时间调整,总之来说还是不错的.

    3bf93c2e7a2727c4bcc0fa390cf82e30.png    

    6fa81d59d4b0d98e95afb02f3ae1747b.png

    88193ddc7c426d54d82725c57e7c4f26.png    

    d3b1b8270b22251030b7984e79432fbf.png

    展开全文
  • 灵活易用的Android自定义TabBar选项卡控件,支持Tab选项卡的任意View组合布局,支持事件接口回调,扩展性非常强大的选项卡,可用来排版任意样式的选项卡布局。
  • 公司美工突然从网上找了个切换动画,叫我照着gif图给tabbar写个动画。看了那个gif半天没看出什么头绪,只要硬着头皮 用贝塞尔曲线实现了tabbar切换动画。 先贴个代码git地址:...

    公司美工突然从网上找了个切换动画,叫我照着gif图给tabbar写个动画。看了那个gif半天没看出什么头绪,只要硬着头皮 用贝塞尔曲线实现了tabbar切换动画。
    先贴个代码git地址https://gitee.com/rookieci/TabBarAnimView

    再上个效果图
    tabbar贝塞尔曲线切换动画
    主要由TabBarAnimView绘制而成,使用方式如下

        <com.xcc.viewlibrary.TabBarAnimView
            android:id="@+id/viewTabBarAnim"
            android:layout_width="match_parent"
            android:layout_height="0px"
            android:background="#fff"
            app:tColor="#FE672E"
            app:tMaxDia="40dp"
            app:tMinDia="20dp"
            app:tNumb="5" />
    

    app:tNumb 配置tab数量
    app:tColor 配置绘制颜色
    app:tMaxDia 配置大圆直径
    app:tMinDia 配置小圆直径(这儿用于绘制贝塞尔曲线时的定位点)

    制作控件时发现 三次贝塞尔曲线会比二次贝塞尔曲线更好看,此处使用的是二次贝塞尔曲线。

    以下是TabBarAnimView实现代码

    attrs.xml

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <attr name="tColor" format="color" />
        <declare-styleable name="TabBarAnimView">
            <attr name="tColor" />
            <attr name="tNumb" format="integer" />
            <attr name="tMinDia" format="dimension" />
            <attr name="tMaxDia" format="dimension" />
        </declare-styleable>
    </resources>
    

    TabBarAnimView.java

    package com.xcc.viewlibrary;
    
    import android.animation.Animator;
    import android.animation.AnimatorListenerAdapter;
    import android.animation.ValueAnimator;
    import android.content.Context;
    import android.content.res.TypedArray;
    import android.graphics.Canvas;
    import android.graphics.Paint;
    import android.graphics.Path;
    import android.os.Build;
    import android.util.AttributeSet;
    import android.view.View;
    import android.view.animation.OvershootInterpolator;
    
    import androidx.annotation.Nullable;
    import androidx.annotation.RequiresApi;
    
    /**
     * 用于TabBar背景动画
     */
    public class TabBarAnimView extends View {
        public TabBarAnimView(Context context) {
            super(context);
            init(context, null);
        }
    
        public TabBarAnimView(Context context, @Nullable AttributeSet attrs) {
            super(context, attrs);
            init(context, attrs);
        }
    
        public TabBarAnimView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            init(context, attrs);
        }
    
        @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
        public TabBarAnimView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
            super(context, attrs, defStyleAttr, defStyleRes);
            init(context, attrs);
        }
    
        protected void init(Context context, AttributeSet attrs) {
            if (attrs != null) {
                TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.TabBarAnimView);
                color = a.getColor(R.styleable.TabBarAnimView_tColor, 0xFF000000);
                tabNumb = a.getInt(R.styleable.TabBarAnimView_tNumb, 4);
                maxDia = a.getDimension(R.styleable.TabBarAnimView_tMaxDia, 4);
                minDia = a.getDimension(R.styleable.TabBarAnimView_tMinDia, 4);
                a.recycle();
            }
            addOnAttachStateChangeListener(new OnAttachStateChangeListener() {
                public void onViewAttachedToWindow(View v) {
                    isViewAttachedToWindow = true;
                }
    
                public void onViewDetachedFromWindow(View v) {
                    isViewAttachedToWindow = false;
                }
            });
            currentIndex = -1;
            paint = new Paint();
            paint.setAntiAlias(true);
            paint.setStyle(Paint.Style.FILL);
            paint.setColor(color);
            if (BuildConfig.DEBUG) paint.setStrokeWidth(3);
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            if (!isViewAttachedToWindow) return;
            if (getWidth() == 0) return;
            if (type == 1) {
                onFirstDraw(canvas);
            } else if (type == 2) onMoveAnim(canvas);
        }
    
        private void onFirstDraw(Canvas canvas) {
            canvas.drawCircle(getCircleX(currentIndex), getCircleY(), cDia / 2, paint);
        }
    
        private void onMoveAnim(Canvas canvas) {
            final int i = stepTime / 3;
            float currentCircleX = getCircleX(currentIndex);//起始位置
            float selectCircleX = getCircleX(selectIndex);//目标位置
            boolean toRight = selectCircleX > currentCircleX;//向右 -->
            float circleY = getCircleY();
            int runTime = i << 1;
            if (currStepTime < runTime) {//阶段一
                float circleX = (selectCircleX - currentCircleX) * currStepTime / runTime + currentCircleX;
                canvas.drawCircle(circleX, circleY, maxDia / 2, paint);//绘制大圆
    
                Path path = new Path();
                path.moveTo(circleX, circleY - maxDia / 2);//大圆上部定点
    
                //计算小圆位置
                float cDist = currentCircleX - circleX;//圆心距离
                float abs = Math.abs(cDist);
                float minCX;//小圆x
                if (abs < maxDia) {//距离小于直径
                    minCX = currentCircleX;
                } else minCX = circleX + (toRight ? -maxDia : maxDia);
                //canvas.drawCircle(minCX, circleY, minDia / 2, paint);//用于定位的小圆
                if (toRight) {
                    minCX -= minDia;
                } else minCX += minDia;
                //二次贝塞尔曲线不好看
                /*path.quadTo(minCX, circleY, circleX, circleY + maxDia / 2);*/
                path.cubicTo(minCX, circleY - minDia / 2
                        , minCX, circleY + minDia / 2
                        , circleX, circleY + maxDia / 2);//三次
                path.close();
                canvas.drawPath(path, paint);
            } else {//阶段二
                canvas.drawCircle(selectCircleX, circleY, maxDia / 2, paint);//绘制大圆
    
                Path path = new Path();
                path.moveTo(selectCircleX, circleY - maxDia / 2);//大圆上部定点
                int overTime = stepTime - currStepTime;
                float v = maxDia * overTime / i;
                float minCX = selectCircleX + (toRight ? -v : v);//小圆x
                //canvas.drawCircle(minCX, circleY, minDia / 2, paint);
                if (toRight) {
                    minCX -= minDia;
                } else minCX += minDia;
                /*path.quadTo(minCX, circleY, circleX, circleY + maxDia / 2);*/
                path.cubicTo(minCX, circleY - minDia / 2
                        , minCX, circleY + minDia / 2
                        , selectCircleX, circleY + maxDia / 2);//三次
                path.close();
                canvas.drawPath(path, paint);
            }
        }
    
        private boolean isViewAttachedToWindow;
        private int tabNumb;//tab数量
        private int color;
        private float minDia; //小圆直径
        private float maxDia;//大圆直径
        private int currentIndex;//当前选中 -1表示没有选中
        private int selectIndex;//选中 从0开始
        private int waitSelectIndex;//等待选中
        private Paint paint;
        private int type;//绘制模式 1开始位置的绘制
        private float cDia;
        private static final int stepTime = 480;//绘制步进时长 分三个阶段
        private int currStepTime;//当前步进时长
        private boolean runAnim;//执行动画中
    
        /**
         * @param index 选中哦index
         */
        private float getCircleX(int index) {
            float tabW = getWidth() * 1.0f / tabNumb;
            return tabW * (index + 0.5f);
        }
    
        //获取高度一半作为圆中心点
        private float getCircleY() {
            return getHeight() / 2.0f;
        }
    
        public void setSelectIndex(int selectIndex) {
            if (currentIndex == -1) {
                currentIndex = selectIndex;
                this.selectIndex = selectIndex;
                openFirstAnim();
            } else {
                this.waitSelectIndex = selectIndex;
                if (runAnim) return;
                if (currentIndex == selectIndex) {
                    openFirstAnim();
                    return;
                }
                runAnim = true;
                this.selectIndex = selectIndex;
                openMoveAnim();
            }
        }
    
        private void openFirstAnim() {
            ValueAnimator valueAnimator = ValueAnimator.ofFloat(minDia, maxDia);
            valueAnimator.addUpdateListener(animation -> {
                type = 1;
                cDia = (Float) animation.getAnimatedValue();
                if (!isViewAttachedToWindow) return;
                invalidate();
            });
            valueAnimator.setInterpolator(new OvershootInterpolator());//回弹
            valueAnimator.setDuration(500);
            valueAnimator.start();
        }
    
        private void openMoveAnim() {
            //计算位置
            ValueAnimator valueAnimator = ValueAnimator.ofInt(0, stepTime);
            valueAnimator.addUpdateListener(animation -> {
                type = 2;
                currStepTime = (Integer) animation.getAnimatedValue();
                if (!isViewAttachedToWindow) return;
                invalidate();
            });
            valueAnimator.addListener(new AnimatorListenerAdapter() {
                public void onAnimationEnd(Animator animation) {
                    currentIndex = selectIndex;
                    runAnim = false;
                    startWaitSelect();
                }
            });
            valueAnimator.setDuration(stepTime);
            valueAnimator.start();
        }
    
        private void startWaitSelect() {
            if (waitSelectIndex == currentIndex) return;
            setSelectIndex(waitSelectIndex);
        }
    }
    
    

    最后再贴出代码git地址https://gitee.com/rookieci/TabBarAnimView

    总结:实际上在这个动画当中,用椭圆绘制的动画应该比贝塞尔曲线绘制的更好看。但是公司需求多变,回头这个动画可能就会被删除,所以暂时不想去改效果了。

    展开全文
  • 底部tabbar使用的 JPTabBaractivity中的布局android:layout_width="match_parent"android:layout_height="0dp"android:id="@+id/viewPage"app:layout_constraintTop_toTopOf="parent"app:layout_constraintBottom_...

    底部tabbar使用的 JPTabBar

    activity中的布局

    android:layout_width="match_parent"

    android:layout_height="0dp"

    android:id="@+id/viewPage"

    app:layout_constraintTop_toTopOf="parent"

    app:layout_constraintBottom_toTopOf="@+id/line"

    android:background="@color/colorAccent"/>

    android:id="@+id/line"

    android:layout_width="match_parent"

    android:layout_height="0.5dp"

    android:background="@color/line"

    app:layout_constraintTop_toBottomOf="@id/viewPage"

    app:layout_constraintBottom_toTopOf="@+id/tabbar"/>

    android:id="@+id/tabbar"

    android:layout_width="match_parent"

    android:layout_height="56dp"

    app:layout_constraintBottom_toBottomOf="parent"

    android:background="#fff"

    />

    TabViewPage 去掉滑动手势

    package com.example.fordgao.travel.baseUI;

    import android.content.Context;

    import android.support.v4.view.ViewPager;

    import android.util.AttributeSet;

    import android.view.MotionEvent;

    public class TabViewPage extends ViewPager {

    public TabViewPage(Context context) {

    super(context);

    }

    public TabViewPage(Context context, AttributeSet attrs) {

    super(context, attrs);

    }

    @Override

    public boolean onInterceptTouchEvent(MotionEvent ev) {

    return false;

    }

    @Override

    public boolean onTouchEvent(MotionEvent ev) {

    return false;

    }

    @Override

    public void setCurrentItem(int item) {

    super.setCurrentItem(item, false);

    }

    }

    activity代码

    JPTabBar jpTabBar;

    @Titles

    private static final String[] mTitles = {"首页","订机票","我的"};

    @SeleIcons

    private static final int[] mSeleIcons = {R.mipmap.tab_home_selected,R.mipmap.tab_air_selected,R.mipmap.tab_mine_selected};

    @NorIcons

    private static final int[] mNormalIcons = {R.mipmap.tab_home, R.mipmap.tab_air, R.mipmap.tab_mine};

    ViewPager viewPager;

    List mFragmentList = new ArrayList();

    MainPagerAdapter mViewPagerFragmentAdapter;

    FragmentManager mFragmentManager;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    Tool.setStatusBarColor(this, R.color.colorNav);

    overridePendingTransition(R.anim.anim_alpha_show, R.anim.view_stay);

    jpTabBar = findViewById(R.id.tabbar);

    jpTabBar.setSelectedColor(ContextCompat.getColor(this, R.color.tabSColor));

    jpTabBar.setTabTextSize(12);

    viewPager = findViewById(R.id.viewPage);

    mFragmentManager = getSupportFragmentManager();

    Fragment_home home = new Fragment_home();

    Fragment_air air = new Fragment_air();

    Fragment_mine mine = new Fragment_mine();

    ((ArrayList) mFragmentList).add(home);

    ((ArrayList) mFragmentList).add(air);

    ((ArrayList) mFragmentList).add(mine);

    mViewPagerFragmentAdapter = new MainPagerAdapter(mFragmentManager, (ArrayList) mFragmentList);

    viewPager.setAdapter(mViewPagerFragmentAdapter);

    viewPager.setCurrentItem(0);

    jpTabBar.setTabListener(new OnTabSelectListener() {

    @Override

    public void onTabSelect(int index) {

    viewPager.setCurrentItem(index);

    }

    @Override

    public boolean onInterruptSelect(int index) {

    return false;

    }

    });

    }

    import java.util.ArrayList;

    public class MainPagerAdapter extends FragmentPagerAdapter {

    ArrayList list;

    //通过构造获取list集合

    public MainPagerAdapter(FragmentManager fm, ArrayList list) {

    super(fm, FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);

    this.list=list;

    }

    //设置每一个的内容

    @Override

    public Fragment getItem(int arg0) {

    // TODO Auto-generated method stub

    return list.get(arg0);

    }

    //设置有多少内容

    @Override

    public int getCount() {

    // TODO Auto-generated method stub

    return list.size();

    }

    }

    Fragment基类使用懒加载数据

    import androidx.annotation.LayoutRes;

    import androidx.annotation.NonNull;

    import androidx.annotation.Nullable;

    import androidx.fragment.app.Fragment;

    public abstract class BaseLazyFragment extends Fragment {

    private boolean isFirst; // 是否首次加载

    @Nullable

    @Override

    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

    return inflater.inflate(getLayoutId(), container, false);

    }

    @LayoutRes

    protected abstract int getLayoutId();

    /**

    * 懒加载

    */

    protected abstract void onLazyLoad();

    @Override

    public void onResume() {

    super.onResume();

    if (!isFirst) {

    initUiAndListener();

    onLazyLoad();

    isFirst = true;

    }

    }

    /**

    * 控件初始化和监听

    */

    protected abstract void initUiAndListener();

    }

    在子类Fragment中

    import base.components.BaseLazyFragment;

    public class FragmentHome extends BaseLazyFragment {

    @Override

    protected int getLayoutId() {

    return R.layout.fragment_home;

    }

    @Override

    protected void onLazyLoad() {

    }

    @Override

    protected void initUiAndListener() {

    }

    }

    展开全文
  • React Native之Android Tabbar的实现.

    万次阅读 2016-07-04 04:34:30
    React是Facebook开源出来的一套前段框架,据目测是目前最热门的一套框架,随之而来是(RN)React Native,这套框架的意义重大,颠覆的... 接下来讲解的是Android中如何实现TabBar,都知道RN中针对IOS有TabBarIOS组件而针

           React是Facebook开源出来的一套前段框架,据目测是目前最热门的一套框架,随之而来是(RN)React Native,这套框架的意义重大,颠覆的不仅仅是移动开发者,连整个应用市场都会受到影响的,所以身为移动的开发者,快速学习起来吧,跟随市场的前沿.

           接下来讲解的是Android中如何实现TabBar,都知道RN中针对IOS有TabBarIOS组件而针对安卓并没有类似的组件,因为是从安卓原生转过来的,所以能力有限,只能借助高手来实现自己的功能模块.

           一个不错的跨平台开源模块:https://github.com/exponentjs/react-native-tab-navigator

           接下来我来简单说明如何应用,首先进入到项目的根目录引入开源支持包:

              npm install react-native-tab-navigator --save    

          

             确保支持包导入进来.

           

             

      使用简介:

    <TabNavigator>
      <TabNavigator.Item
        selected={this.state.selectedTab === 'home'}
        title="Home"
        renderIcon={() => <Image source={...} />}
        renderSelectedIcon={() => <Image source={...} />}
        badgeText="1"
        onPress={() => this.setState({ selectedTab: 'home' })}>
        {homeView}
      </TabNavigator.Item>
      <TabNavigator.Item
        selected={this.state.selectedTab === 'profile'}
        title="Profile"
        renderIcon={() => <Image source={...} />}
        renderSelectedIcon={() => <Image source={...} />}
        renderBadge={() => <CustomBadgeView />}
        onPress={() => this.setState({ selectedTab: 'profile' })}>
        {profileView}
      </TabNavigator.Item>
    </TabNavigator>


           通过使用简介我们可以了解该组件如何使用,但是复杂的UI操作就得需要查看源码了解究竟了,,比如:我们要如何修改TabNavigator.Item的title样式和badgeText的样式.

    源码如下:

    export default class TabNavigatorItem extends React.Component {
      static propTypes = {
        renderIcon: PropTypes.func,
        renderSelectedIcon: PropTypes.func,
        badgeText: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
        renderBadge: PropTypes.func,
        title: PropTypes.string,
        titleStyle: Text.propTypes.style,
        selectedTitleStyle: Text.propTypes.style,
        tabStyle: View.propTypes.style,
        selected: PropTypes.bool,
        onPress: PropTypes.func,
        allowFontScaling: PropTypes.bool,
      };


    可以看出renderIcon和renderSelectedIcon对应的PropTypes.func方法,个人感觉这么做非常好,可自定义性非常大,

    selectedTitleStyle字面意思可以看出是选中文字的样式,而renderBadge对应的是渲染Badge的方法.

    比如:

     <TabNavigator.Item
           title='头条'
           renderIcon={()=><Image style={styles.tabIcon} source={TAB_NORMAL_1}/>}
           renderSelectedIcon={()=><Image style={styles.tabIcon} source={TAB_PRESS_1}/>}
           selected={this.state.selectedTab==='Home'}
           selectedTitleStyle={{color:'#f85959'}}
           onPress={()=>this.onPress('Home')}
           renderBadge={()=><View style={styles.badgeView}><Text style={styles.badgeText}>15</Text></View>}
          >


    最后贴下全部代码:

    /**
     * Sample React Native App
     * https://github.com/facebook/react-native
     * @flow
     */
    
    import React, { Component } from 'react';
    import {
      AppRegistry,
      StyleSheet,
      Text,
      View,
      Image,
    } from 'react-native';
    
    //引入tabbar支持包
    import TabNavigator from 'react-native-tab-navigator';
    
    const TabNavigatorItem =TabNavigator.Item;
    
    const TAB_NORMAL_1=require('./images/tabbar_1.png');
    const TAB_NORMAL_2=require('./images/tabbar_2.png');
    const TAB_NORMAL_3=require('./images/tabbar_3.png');
    const TAB_NORMAL_4=require('./images/tabbar_4.png');
    
    const TAB_PRESS_1=require('./images/tabbar_1_press.png');
    const TAB_PRESS_2=require('./images/tabbar_2_press.png');
    const TAB_PRESS_3=require('./images/tabbar_3_press.png');
    const TAB_PRESS_4=require('./images/tabbar_4_press.png');
    
    class toutiao extends Component {
    
      constructor(){
        super();
        this.state={
          selectedTab:'Home',
        }
      }
    
      /**
      tab点击方法
      **/
      onPress(tabName){
        if(tabName){
          this.setState(
            {
              selectedTab:tabName,
            }
          );
        }
      }
       /**
       渲染每项
       **/
       renderTabView(title,tabName,tabContent,isBadge){
         var tabNomal;
         var tabPress;
         switch (tabName) {
           case 'Home':
             tabNomal=TAB_NORMAL_1;
             tabPress=TAB_PRESS_1;
             break;
         case 'Video':
           tabNomal=TAB_NORMAL_2;
           tabPress=TAB_PRESS_2;
           break;
         case 'Follow':
           tabNomal=TAB_NORMAL_3;
           tabPress=TAB_PRESS_3;
           break;
         case 'Mine':
           tabNomal=TAB_NORMAL_4;
           tabPress=TAB_PRESS_4;
           break;
           default:
    
         }
         return(
           <TabNavigatorItem
            title={title}
            renderIcon={()=><Image style={styles.tabIcon} source={tabNomal}/>}
            renderSelectedIcon={()=><Image style={styles.tabIcon} source={tabPress}/>}
            selected={this.state.selectedTab===tabName}
            selectedTitleStyle={{color:'#f85959'}}
            onPress={()=>this.onPress(tabName)}
            renderBadge={()=>isBadge?<View style={styles.badgeView}><Text style={styles.badgeText}>15</Text></View>:null}
           >
           <View style={{flex:1,justifyContent:'center',alignItems:'center'}}><Text>{tabContent}</Text></View>
           </TabNavigatorItem>
         );
       }
    
       /**
       自定义tabbar
       **/
      tabBarView(){
        return (
          <TabNavigator
           tabBarStyle={styles.tab}
          >
          {this.renderTabView('头条','Home','头条板块',true)}
          {this.renderTabView('视频','Video','视频板块',false)}
          {this.renderTabView('关注','Follow','关注板块',false)}
          {this.renderTabView('我的','Mine','我的板块',false)}
          </TabNavigator>
        );
      }
    
    
      render() {
        var tabBarView=this.tabBarView();
        return (
          <View style={styles.container}>
            {tabBarView}
          </View>
        );
      }
    }
    
    const styles = StyleSheet.create({
      container: {
        flex: 1,
        backgroundColor: '#F5FCFF',
      },
      welcome: {
        fontSize: 20,
        textAlign: 'center',
        margin: 10,
      },
      instructions: {
        textAlign: 'center',
        color: '#333333',
        marginBottom: 5,
      },
      tab:{
        height: 52,
        alignItems:'center',
        backgroundColor:'#f4f5f6',
      },
      tabIcon:{
        width:25,
        height:25,
      },
      badgeView:{
        width:22,
        height:14 ,
        backgroundColor:'#f85959',
        borderWidth:1,
        marginLeft:10,
        marginTop:3,
        borderColor:'#FFF',
        alignItems:'center',
        justifyContent:'center',
        borderRadius:8,
      },
      badgeText:{
        color:'#fff',
        fontSize:8,
      }
    });
    
    AppRegistry.registerComponent('toutiao', () => toutiao);



    最后贴下效果图:可以看到实现了跨平台体验,不过由于设备分辨率不统一所以适配上需要花些时间调整,总之来说还是不错的.

               

             


        源码下载

         

    展开全文
  • android tabbar切换的实现

    千次阅读 2016-05-05 13:36:52
    Android现在实现Tab类型的界面方式越来越多,今天就把常见的实现方式给大家来个总结。目前写了: 1、传统的ViewPager实现 2、FragmentManager+Fragment实现 3、ViewPager+FragmentPage
  • 合金类别栏小工具 的平台的 MVC 框架的小部件。 用于创建可滚动类别下拉菜单的简单快速的小部件。 安装 手动安装 下载/...用法 1. 声明在视图中 声明为 Alloy 标记标签 ...$.bar
  • const TAB_PRESS_4=require('./images/tabbar_4_press.png'); class toutiao extends Component {  constructor(){ super(); this.state={ selectedTab:'Home', } }  /** tab点击方法 **/ ...
  • 效果演示这个项目最重要的一点就是Android和iOS通用。通过tab的内容点击跳转的Second页面切换tab时,tab内容的变化切换tab时,消息上的小红点或数字提醒变化使用react-native-xtabbarReact Nativ...
  • Android自定义TabBar

    千次阅读 2015-05-19 12:20:40
    http://www.sunhome.org.cn我发现现在的移动开发界面都被iOS主导了,UI动不动设计出来的东西都是ios的风格,对于一个做Android的程序员来说甚是苦恼啊,为了适应这种环境和氛围,今天我们来自定义一个TabBar,...
  • android_tabbar_sina android中一个简单的tabbar,类似于sina
  • IOS有官方的TabBarIOS可以实现,而Android暂时没有提供官方UI。这里分享一个自己的简单实现,没有使用第三方库。目录:一. 效果图二. 实现逻辑及顺序三. 主要组件源码:四. 可运行源码地址一.效果图show二.实现逻辑...
  • 主要为大家详细介绍了Android Navigation TabBar控件实现多彩标签栏的相关代码,感兴趣的小伙伴们可以参考一下
  • Android 自定义Tabbar

    2012-08-27 13:56:00
    自定义tabbar public class TopTabbar extends LinearLayout implements OnClickListener {//namespaceprivate final String nameSpace = "http://meiyitianabc.blog.163.com";//default for ta...
  • 一个强大的TabBar,实现市面上APP基本上所拥有的功能,代码简单构造容易!只需不足5行代码就把基本的界面搭建出来了,附上效果图:主要功能特色:多种Tab切换的动画效果实现底部导航中间按钮凸出的效果实现WeChat那种...
  • Android 仿新浪微博TabBar

    热门讨论 2012-03-23 23:35:18
    使用Android中的TabHost加上RadioButton,实现类似新浪微博TabBar模式的标签栏。
  • react-native-tabbar-android

    2016-11-30 20:48:47
    react native实现Androidtabbar功能
  • 最近着手开发的一个兼容iOS、AndroidTabBar。还在不断开发中! 地址:https://github.com/future-cha... 欢迎fork,欢迎star。 :p 自己捣鼓了个E文的readme,没啥难度凑合可看。 react-native-tabs React Native ...
  • Android自定义的TabBar

    千次阅读 2013-10-29 16:10:31
    Android自定义的TabBar,自定义了几个属性,可以在xml布局文件中使用,Tab的标题、图标等属性可以在布局文件中完成配置,Java代码中只需要指定Tab跳转的监听接口。可以在所有Android版本使用,建议配合ViewPager使用...
  • TabBar-master 标签栏控件,支持自定义圆角弧度
  • Android应用中,默认是把Tabbar放在顶部的,但是我们经常看到有些应用模范iPhone应用将Tabbar实现到底部去,那么在Titanium中我们是否也能实现将Tabbar放到底部呢?答案当然是能。在Titanium中TabGroup就是Android...
  • Android源代码】Android自定义的TabBar

    千次阅读 2013-09-18 11:52:49
    Android自定义的TabBar,自定义了几个属性,可以在xml布局文件中使用,Tab的标题、图标等属性可以在布局文件中完成配置,Java代码中只需要指定Tab跳转的监听接口。可以在所有Android版本使用,建议配合ViewPager使用...
  • Android高仿马蜂窝Tabbar波浪线
  • 给删除等等,从而会引起别的问题,虽然都能解决,但是觉得很麻烦,就打算自己再重写一个,tabbar不用tabwidget,而是自己自定义布局tabbar.xml <LinearLayout xmlns:android=...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,987
精华内容 1,994
关键字:

androidtabbar