首页 > 系统 > Android > 正文

Android仿微信主界面设计

2020-04-11 10:55:03
字体:
来源:转载
供稿:网友

先来一张效果图


一.ActionBar的设计

首先是main.xml,先定义这些菜单,界面稍后在调整

<menu xmlns:android="http://schemas.android.com/apk/res/android" tools:context=".MainActivity"> <item  android:id="@+id/action_search"  android:actionViewClass="android.widget.SearchView"  android:icon="@drawable/actionbar_search_icon"  android:showAsAction="always|collapseActionView"  android:title="@string/action_search"  /> <item  android:id="@+id/action_add"  android:actionProviderClass="develop.niuli.com.weixin.PlusActionProvider"  android:icon="@drawable/actionbar_add_icon"  android:showAsAction="always"  android:title="@string/action_add"  /> <!--在这里设置菜单.然后自定义一个menu --> <item  android:id="@+id/action_btn01"  android:icon="@drawable/abc_ic_menu_moreoverflow_mtrl_alpha"  android:orderInCategory="2"  android:title="更多"  android:showAsAction="always"> <menu> <item   android:id="@+id/action_photo"  android:icon="@drawable/ofm_photo_icon"  android:title="@string/action_photo"  android:showAsAction="never"  /> <item  android:id="@+id/action_connection"  android:icon="@drawable/ofm_collect_icon"  android:title="@string/action_connection"  android:showAsAction="never"  /> <item  android:id="@+id/action_card"  android:icon="@drawable/ofm_card_icon"  android:title="@string/action_card"  android:showAsAction="never"  /> <item  android:id="@+id/action_settings"  android:icon="@drawable/ofm_setting_icon"  android:title="@string/action_settings"  android:showAsAction="never"   /> <item  android:id="@+id/action_feed"  android:icon="@drawable/ofm_feedback_icon"  android:title="@string/action_feed"  android:showAsAction="never"  /> </menu></item></menu>

1.android:actionViewClass="android.widget.SearchView"调用系统的搜索栏样式,
2.android:showAsAction="always|collapseActionView"使其可以铺满整个ActionBar.这样就能模仿出微信的效果了
3.再者overflow里面的带图标+title效果,需要自定义一个item包裹一个单独的menu,这样的话就不需要用代码就能实现图标+title的效果
4.android:actionProviderClass="develop.niuli.com.weixin.PlusActionProvider"这个使用的ActionProvider,也就相当于自定义另一个菜单实现加号功能,而PlusActionProvider是自己单独写的一个类

/** *主要用于模仿微信上+号实现的菜单 */public class PlusActionProvider extends ActionProvider { private Context context; public PlusActionProvider(Context context) {  super(context);  this.context = context; } @Override public View onCreateActionView() {  return null; } @Override public void onPrepareSubMenu(SubMenu subMenu) {  //移除已经存在的项  subMenu.clear();  //为菜单添加图片和文字,并且加入监听事件  subMenu.add(context.getString(R.string.plus_group_chat))    .setIcon(R.drawable.ofm_group_chat_icon)    .setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {     @Override     public boolean onMenuItemClick(MenuItem item) {      return false;     }    });  //剩下的如法炮制就好了  subMenu.add(context.getString(R.string.plus_add_friend))    .setIcon(R.drawable.ofm_add_icon)    .setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {     @Override     public boolean onMenuItemClick(MenuItem item) {      return false;     }    });  subMenu.add(context.getString(R.string.plus_video_chat))    .setIcon(R.drawable.ofm_video_icon)    .setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {     @Override     public boolean onMenuItemClick(MenuItem item) {      return false;     }    });  subMenu.add(context.getString(R.string.plus_scan))    .setIcon(R.drawable.ofm_qrcode_icon)    .setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {     @Override     public boolean onMenuItemClick(MenuItem item) {      return false;     }    });  subMenu.add(context.getString(R.string.plus_take_photo))    .setIcon(R.drawable.ofm_camera_icon)    .setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {     @Override     public boolean onMenuItemClick(MenuItem item) {      return false;     }    }); } @Override public boolean hasSubMenu() {  return true; }}

这样的ActionBar基本实现了我们想要的功能,剩下的就差样式之类,所以修改Style.xml文件,AS里面也自带主题编辑器,暂时还没用到过,后期尝试

<resources> <!-- 这里可以使用官方的编译器来设置,具体还要再次学习--> <style name="App_Theme" parent="@android:style/Theme.Holo.Light">  <!-- Customize your theme here. -->  <item name="android:actionBarStyle">@style/wexinActionBar</item>  <item name="android:itemBackground">@drawable/actionbar_bg_selector</item>  <item name="android:actionBarItemBackground">@drawable/actionbar_bg_selector</item>  <item name="android:itemTextAppearance">@style/WeChatActionBarTitleText</item>  <item name="android:actionOverflowButtonStyle">@style/WeChatActionButtonOverflow</item> </style> <style name="wexinActionBar" parent="@android:style/Widget.Holo.ActionBar">  <item name="android:background">#303537</item>  <item name="android:titleTextStyle">@style/WeChatActionBarTitleText</item> </style> <style name="WeChatActionBarTitleText" parent="@android:style/TextAppearance.Holo.Widget.ActionBar.Title">  <item name="android:textColor">#cfcfcf</item>  <item name="android:textSize">17sp</item> </style> <style name="WeChatActionButtonOverflow" parent="android:style/Widget.Holo.ActionButton.Overflow">  <item name="android:src">@drawable/actionbar_more_icon</item> </style></resources>

二.主界面的设计

使用PagerSlidingTabStrip+viewpager,两者会自动适配,用起来很方便.
在main_activity.xml中配置

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto" tools:context=".MainActivity"> <!--引入的类似ActionBar的一个tabs开源项目 --> <com.astuetz.PagerSlidingTabStrip  android:id="@+id/tabs"  android:layout_width="match_parent"  app:pstsShouldExpand="true"  android:layout_height="40dp"/> <android.support.v4.view.ViewPager  android:id="@+id/pagers"  android:layout_width="match_parent"  android:layout_height="wrap_content"  android:layout_below="@+id/tabs"  /></RelativeLayout>

然后建立三个fragment布局,放入到viewpager,下面举一个例子

<?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView  android:layout_width="match_parent"  android:layout_height="match_parent"  android:text="聊天界面"  android:gravity="center"  android:textSize="20sp"  /></FrameLayout>
public class ChatFragment extends android.support.v4.app.Fragment { @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {  View view = inflater.inflate(R.layout.chatfragment_layout,container,false);  return view; }}

接下来就是在MainActivity.java中代码配置了

/**  * tabs栏的实例  */ private PagerSlidingTabStrip tabs; /**  * 获取当前屏幕的密度  */ private DisplayMetrics dm; /**  * 主界面的viewpager  */ private ViewPager pagers; @Override protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);  setOverflowShowingAlways();  dm = getResources().getDisplayMetrics();  pagers = (ViewPager) findViewById(R.id.pagers);  tabs = (PagerSlidingTabStrip) findViewById(R.id.tabs);  //这个类要继承FragmentActivity才可以有这个方法  pagers.setAdapter(new ViewPagerAdapter(getSupportFragmentManager()));  tabs.setViewPager(pagers);  setTabValue(); } /**  * 对PagerSlidingTabStrip属性的修改  */ private void setTabValue(){//  //设置tabs自动填充满整个屏幕,xml文件设置才有效果//  tabs.setShouldExpand(true);  //设置tabs的分割线透明  tabs.setDividerColor(Color.TRANSPARENT);  //设置tabs底部线的高度  //TypedValue需要学习了解  tabs.setUnderlineHeight((int) TypedValue.applyDimension(    TypedValue.COMPLEX_UNIT_DIP, 1, dm));  // 设置Tab Indicator的高度  tabs.setIndicatorHeight((int) TypedValue.applyDimension(    TypedValue.COMPLEX_UNIT_DIP, 4, dm));  // 设置Tab标题文字的大小  tabs.setTextSize((int) TypedValue.applyDimension(    TypedValue.COMPLEX_UNIT_SP, 16, dm));  // 设置Tab Indicator的颜色  tabs.setIndicatorColor(Color.parseColor("#45c01a"));  // 设置选中Tab文字的颜色 (这是我自定义的一个方法)//  tabs.setSelectedTextColor(Color.parseColor("#45c01a"));  // 取消点击Tab时的背景色  tabs.setTabBackground(0); }

可以看出来viewpager需要一个Adapter来配置其页面,而tabs需要配置viewpager,这样的话,三者就能完美的相适应.

public class ViewPagerAdapter extends FragmentPagerAdapter { /**  * 聊天界面  */ private ChatFragment chatFragment; /**  * 发现页面  */ private FoungFragment foundFragment; /**  * 聊天界面  */ private ContactFragment contactFragment; private final String[] titles = { "聊天", "发现", "通讯录" }; public ViewPagerAdapter(FragmentManager fm) {  super(fm); } @Override public Fragment getItem(int position) {  switch (position) {   case 0:    if (chatFragment == null) {     chatFragment = new ChatFragment();    }    return chatFragment;   case 1:    if (foundFragment == null) {     foundFragment = new FoungFragment();    }    return foundFragment;   case 2:    if (contactFragment == null) {     contactFragment = new ContactFragment();    }    return contactFragment;   default:    return null;  } } @Override public int getCount() {  return titles.length; } @Override public CharSequence getPageTitle(int position) {  return titles[position]; }}

本文已被整理到了《Android微信开发教程汇总》,欢迎大家学习阅读。

以上就是本文的全部内容,希望对大家的学习有所帮助。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表