仿制微信6.0界面<1>

【前言】
微信的界面简洁大方,最近搜到了一篇关于仿制微信界面的视频。视频连接在这里。但是这个视频讲解速度很快,为了方便后来人(也是方便自己),我将会将这个视频的基本要点记录一下。

【开发环境】
Eclipse +Android Developer Tools+小米note调试

【ActionBar的绘制】
1. 取消微信标题栏图标的显示
2. 改变OverflowButton按钮(即界面右上角的省略号)的图标为加号
3.由于在某些机型上自带菜单键,所以2中的OverflowButton有可能被隐藏,所以需要强行设置起显示
4.在OverflowButton展开之后,各个选项上是没有图标的。这里需要修改为显示图标。

【代码1 取消微信标题栏图标的显示】

//这里比较容易,只需要在onCreate()方法当中添加函数调用即可
getActionBar().setDisplayShowHomeEnabled(false);

【代码2 修改OverflowButton按钮的样式】

//要想修改样式,首先应该考虑改变style
//修改values-v14中的样式
    <style name="AppBaseTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- API 14 theme customizations can go here. -->
        <!-- <item name="android:actionOverflowButtonStyle"></item> -->
        <item name="android:actionOverflowButtonStyle">
            @style/myChatActionOverflowButtonStyle
        </item>
    </style>
    <style name="myChatActionOverflowButtonStyle">
        <item name="android:src">@drawable/actionbar_add_icon</item>
    </style>

【代码3 强制显示OverflowButton按钮(即界面右上角的省略号)】

//这里原作者采取了一种比较高级的方式————即反射
//关于反射这里简单引用一下
//http://www.cnblogs.com/bingoidea/archive/2009/06/21/1507889.html
//在这里的作用,简单地说就是可以通过秘术来获取本身不可能访问地到的属性和方法
private void setOverflowButtonAlways() throws Exception{
//获取到ViewConfiutation
      ViewConfiguration configuration=ViewConfiguration.get(this);
//获取field
        Field menuKey=ViewConfiguration.class.getDeclaredField("sHasPermanetMenuKey");
        //使得这个私有属性可以被访问
        menuKey.setAccessible(true);
        //该变configuration中这个field的值
        menuKey.setBoolean(configuration, false);
    }

【代码4 修改OverflowButton中的图标进行显示】

//这里同代码3也是利用了Java的反射机制去修改系统默认设置
public boolean onMenuOpened(int featureId, Menu menu) {
        // TODO Auto-generated method stub
        if(featureId==Window.FEATURE_ACTION_BAR&&menu!=null){
            if(menu.getClass().getSimpleName().equals("MenuBuilder")){
                try {
                //同样先获取到需要调用的method
                    Method m=menu.getClass().
                        getDeclaredMethod("setOptionalIconsVisible",Boolean.TYPE);
                    //设为可访问
                    m.setAccessible(true);
                    //调用方法
                    m.invoke(menu,true);
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }
        }
        return super.onMenuOpened(featureId, menu);
    }

版权声明:本文为博主原创文章,转载请标明出处。

posted @ 2015-03-31 15:20  Fridge  阅读(216)  评论(0编辑  收藏  举报