0
点赞
收藏
分享

微信扫一扫

Android-自定义TitleBar 和 BadgeView (消息红点提示)的实现


1. 回顾

上篇实现了 底部菜单的实现 通过 fragment 和 ViewPager实现;

2.重点

(1)自定义ViewPager上面的TitleBar实现
(2)BadgeView消息红色点提示

3.ViewPager 上面自定义 TitleBar实现

3.1 效果图
红点提示和自定义tabbar

Android-自定义TitleBar 和 BadgeView (消息红点提示)的实现_Android

3.2 基本思路
自已定义布局文件,后通过Viewpager 的 onPageChangeListener 事件 , 来监听 , 页面的变化 从而, 改变 titlebar 的 显示 效果;

3.3自定义titlebar 布局实现
    注意: 布局是很简单的 , 但是 在使用 BadgeView (红色的点 提示多少条)的时候,一定要在显示的textView 外面加上 一个布局 ,不管是 LiearLayout 还是 RelateLayout ,都可以 ,否则 ,TextView的文字不显示;

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="40dp"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="35dp"
        android:background="#eeeeee"
        android:orientation="horizontal" >

        <TextView
            android:id="@+id/tv_lianmeng"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:gravity="center"
            android:text="联盟"
            android:textColor="#ee11cc"
            android:textSize="20sp" />

        <TextView
            android:id="@+id/tv_juntuan"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:gravity="center"
            android:text="军团"
            android:textColor="@android:color/black"
            android:textSize="20sp" />

        <LinearLayout
            android:id="@+id/linear_badge"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:orientation="horizontal"
            android:layout_weight="1" >

            <TextView
                android:id="@+id/tv_tongshuai"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:gravity="center"
                android:text="统帅"
                android:textColor="@android:color/black"
                android:textSize="20sp" />
        </LinearLayout>
    </LinearLayout>

    <TextView
        android:id="@+id/tv_mvcolor"
        android:layout_width="50dp"
        android:layout_height="match_parent"
        android:background="#abeeef" />

</LinearLayout>

3.4 业务实现

  • ViewPager 适配器使用的是 FragmentPageAdapter
  • ViewPager 子页面实现是通过 Fragment 实现
  • OnPageChangeListener 实现
  • BadgeView 红色提示点实现

package cn.labelnet.titlebardemo;

import java.util.ArrayList;
import java.util.List;

import android.annotation.SuppressLint;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.PagerTabStrip;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Display;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.RelativeLayout;
import android.widget.TextView;
import cn.labelnet.adapter.VpkuwuAdapter;
import cn.labelnet.fragmemt.JuntuanFragment;
import cn.labelnet.fragmemt.LianMengFragment;
import cn.labelnet.fragmemt.TongshuaiFragment;

import com.readystatesoftware.viewbadger.BadgeView;

@SuppressLint("NewApi")
public class MainActivity extends FragmentActivity {

    private ViewPager vp_ku;

    private PagerTabStrip vp_title;

    private String[] titles = { "联盟", "军团", "统帅" };

    private List<Fragment> fragments;

    /**
     * 光标所在的 linearLayout
     */
    private LinearLayout linear_badge;

    /**
     * titlebar上面的三个文字和 下面移动的光标
     */
    private TextView tv_lianmeng, tv_juntuan, tv_tongshuai, tv_mvcolor;
    /**
     * 屏幕宽度的 1/3
     */
    private int oneTitleBarWidth;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        fragments = new ArrayList<Fragment>();
        initView();

    }

    /**
     * 初始化工作
     * 
     */
    private void initView() {
        vp_ku = (ViewPager) findViewById(R.id.vp_kuwu);
        // vp_title = (PagerTabStrip) findViewById(R.id.vp_title);

        // topbar
        tv_lianmeng = (TextView) findViewById(R.id.tv_lianmeng);
        tv_juntuan = (TextView) findViewById(R.id.tv_juntuan);
        tv_mvcolor = (TextView) findViewById(R.id.tv_mvcolor);
        tv_tongshuai = (TextView) findViewById(R.id.tv_tongshuai);

        linear_badge = (LinearLayout) findViewById(R.id.linear_badge);

        /**
         * 初始化tv_mvcolor的 宽度 ,为 屏幕宽度的 1/3
         * 
         */

        // 01.得到屏幕的宽度 , 后取1/3
        Display display = getWindowManager().getDefaultDisplay();
        DisplayMetrics outMetrics = new DisplayMetrics();
        display.getMetrics(outMetrics);
        // 获得屏幕宽度
        oneTitleBarWidth = outMetrics.widthPixels / 3;
        Log.i("Main", "width=" + oneTitleBarWidth);

        // 初始化 数据
        LianMengFragment lianMengFragment = new LianMengFragment();
        fragments.add(lianMengFragment);
        JuntuanFragment juntuanFragment = new JuntuanFragment();
        fragments.add(juntuanFragment);
        TongshuaiFragment tongshuaiFragment = new TongshuaiFragment();
        fragments.add(tongshuaiFragment);

        // 设置 Adapter
        VpkuwuAdapter vpkuwuAdapter = new VpkuwuAdapter(
                getSupportFragmentManager(), fragments, titles);
        vp_ku.setAdapter(vpkuwuAdapter);

        // 设置监听事件
        vp_ku.setOnPageChangeListener(new Vp_kuChangeListener());

    }

    /**
     * ViewPager 切换 监听事件
     * 
     * @author yuan
     *
     */

    class Vp_kuChangeListener implements OnPageChangeListener {

        private int marignleft = 0;

        @Override
        public void onPageScrollStateChanged(int arg0) {

        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {

            // 获得移动左边的距离
            marignleft = (int) (oneTitleBarWidth * arg0 + oneTitleBarWidth
                    * arg1);

            /**
             * 给光标设置参数
             */
            LayoutParams layoutParams = (LayoutParams) tv_mvcolor
                    .getLayoutParams();
            layoutParams.leftMargin = marignleft;
            layoutParams.width = oneTitleBarWidth;
            tv_mvcolor.setLayoutParams(layoutParams);

        }

        @Override
        public void onPageSelected(int arg0) {
            resetTvColor();
            setTvColor(arg0);
        }

    }

    /**
     * 重置所有title的颜色
     */
    public void resetTvColor() {
        tv_juntuan.setTextColor(Color.BLACK);
        tv_lianmeng.setTextColor(Color.BLACK);
        tv_tongshuai.setTextColor(Color.BLACK);
    }

    /**
     * 设置当前页面的title颜色
     * 
     * @param arg0
     */
    public void setTvColor(int arg0) {
        switch (arg0) {
        case 0:
            tv_lianmeng.setTextColor(Color.parseColor("#ee11cc"));
            break;
        case 1:
            tv_juntuan.setTextColor(Color.parseColor("#ee11cc"));
            break;
        case 2:
            tv_tongshuai.setTextColor(Color.parseColor("#ee11cc"));
            // 模拟红色点消息提醒
            BadgeView badgeView = new BadgeView(this, tv_tongshuai);
            badgeView.setText("99+");
            badgeView.show();

            break;

        }
    }

}

4. demo 下载

BadgeView的jar包在工程中,工程为eclipse 开发版本

demo点击下载


举报

相关推荐

0 条评论