http://blog.csdn.net/yangyu20121224/article/details/9093821

http://blog.chttp://blog.csdn.net/yangyu20121224/article/details/9093821http://blog.csdn.net/yangyu20121224/article/details/9093821http://blog.csdn.net/yangyu20121224/article/details/9093821sdn.net/yangyu20121224/article/details/909382http://blog.csdn.net/yangyu20121224/article/details/909382http://blog.csdn.net/yangyu20121224/article/details/909382111

http://blog.csdn.net/yangyu20121224/article/details/9093821



【Android UI设计与开发】第14期:顶部标题栏(五)两种方式实现仿微信标题栏弹窗效果

分类:Android UI设计与开发 5407人阅读 评论(26) 收藏 举报 PopupWindow 弹出式菜单 自定义顶部标题栏 Android顶部标题栏

转载请注明出处:http://blog.csdn.net/yangyu20121224/article/details/9093821



博主在这篇文章中将会继续围绕顶部标题栏专题来进行实例讲解,今天要讲解的主题是分别使用PopupWindow和Activity两种不同的方式来实现仿微信顶部标题栏弹窗的这样一个效果。


一、实现效果图


这里为了演示方便,我将两种方法放在一个应用程序中演示,这个是主界面

【Android UI设计与开发】第14期:顶部标题栏(五)两种方式实现仿微信标题栏弹窗效果_第1张图片


虽然两种实现的方式不一样,但是最终的效果图都是差不多的

【Android UI设计与开发】第14期:顶部标题栏(五)两种方式实现仿微信标题栏弹窗效果_第2张图片


【Android UI设计与开发】第14期:顶部标题栏(五)两种方式实现仿微信标题栏弹窗效果_第3张图片


二、项目结构图


【Android UI设计与开发】第14期:顶部标题栏(五)两种方式实现仿微信标题栏弹窗效果_第4张图片


三、详细的编码实现


3.1 主界面的实现

为了演示方便,我这里把两种实现方式分成两个Activity界面放在了主Activity界面中。


1、主布局资源文件,activity_main.xml:

[html] view plain copy
  1. <RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent">
  5. <Button
  6. android:id="@+id/main_btn01"
  7. android:layout_width="fill_parent"
  8. android:layout_height="44dp"
  9. android:layout_above="@+id/main_btn02"
  10. android:layout_margin="5dp"
  11. android:background="@drawable/main_btn"
  12. android:text="第一种实现方式(PopupWindow实现)"
  13. android:textSize="16dp"/>
  14. <Button
  15. android:id="@+id/main_btn02"
  16. android:layout_width="fill_parent"
  17. android:layout_height="44dp"
  18. android:layout_centerVertical="true"
  19. android:layout_margin="5dp"
  20. android:background="@drawable/main_btn"
  21. android:text="第二种实现方式(Activity实现)"
  22. android:textSize="16dp"/>
  23. </RelativeLayout>
2、定义一个自定义按钮的资源文件,main_btn.xml:

[html] view plain copy
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <selectorxmlns:android="http://schemas.android.com/apk/res/android">
  3. <itemandroid:drawable="@drawable/btn_back_pre"android:state_pressed="true"/>
  4. <itemandroid:drawable="@drawable/btn_back_nor"/>
  5. </selector>
3、主Activity程序入口类,MainActivity.java:
[java] view plain copy
  1. packagecom.yangyu.mytitlebar01;
  2. importandroid.app.Activity;
  3. importandroid.content.Intent;
  4. importandroid.os.Bundle;
  5. importandroid.view.View;
  6. importandroid.view.View.OnClickListener;
  7. importandroid.widget.Button;
  8. /**
  9. *@authoryangyu
  10. *功能描述:主Activity类,程序的入口类
  11. */
  12. publicclassMainActivityextendsActivityimplementsOnClickListener{
  13. //定义按钮
  14. privateButtonmainBtn01,mainBtn02;
  15. @Override
  16. protectedvoidonCreate(BundlesavedInstanceState){
  17. super.onCreate(savedInstanceState);
  18. setContentView(R.layout.activity_main);
  19. initView();
  20. }
  21. /**
  22. *初始化组件
  23. */
  24. privatevoidinitView(){
  25. //得到按钮并设置监听事件
  26. mainBtn01=(Button)findViewById(R.id.main_btn01);
  27. mainBtn02=(Button)findViewById(R.id.main_btn02);
  28. mainBtn01.setOnClickListener(this);
  29. mainBtn02.setOnClickListener(this);
  30. }
  31. @Override
  32. publicvoidonClick(Viewv){
  33. switch(v.getId()){
  34. caseR.id.main_btn01:
  35. startActivity(newIntent(MainActivity.this,CustomTitleActivity01.class));
  36. break;
  37. caseR.id.main_btn02:
  38. startActivity(newIntent(MainActivity.this,CustomTitleActivity02.class));
  39. break;
  40. default:
  41. break;
  42. }
  43. }
  44. }


3.2 第一种实现方式(PopupWindow)


第一种实现方式主要是通过点击按钮来弹出一个PopupWindow菜单来实现的,步骤如下:

1、标题栏的布局资源文件,这个资源文件在第二种实现方式中也会使用到,activity_main.xml:

[html] view plain copy
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent"
  5. android:background="#fcfcfc"
  6. android:orientation="vertical">
  7. <RelativeLayout
  8. android:id="@+id/title"
  9. android:layout_width="fill_parent"
  10. android:layout_height="45dp"
  11. android:background="@drawable/title_bar"
  12. android:gravity="center_vertical">
  13. <TextView
  14. android:layout_width="wrap_content"
  15. android:layout_height="wrap_content"
  16. android:layout_centerInParent="true"
  17. android:text="微信"
  18. android:textColor="#ffffff"
  19. android:textSize="20sp"/>
  20. <ImageButton
  21. android:id="@+id/title_btn"
  22. android:layout_width="67dp"
  23. android:layout_height="wrap_content"
  24. android:layout_alignParentRight="true"
  25. android:layout_centerVertical="true"
  26. android:layout_marginRight="5dp"
  27. android:background="@drawable/title_button"
  28. android:onClick="btnmainright"
  29. android:src="@drawable/title_btn_function"/>
  30. </RelativeLayout>
  31. </LinearLayout>
2、弹窗的布局页面,这里定义了一个ListView,title_popup.xml:

[html] view plain copy
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="wrap_content"
  4. android:layout_height="wrap_content"
  5. android:background="@drawable/title_function_bg"
  6. android:orientation="vertical">
  7. <ListView
  8. android:id="@+id/title_list"
  9. android:layout_width="120dp"
  10. android:layout_height="fill_parent"
  11. android:cacheColorHint="#00000000"
  12. android:divider="@drawable/mm_title_functionframe_line"
  13. android:listSelector="@drawable/title_list_selector"
  14. android:padding="3dp"
  15. android:scrollingCache="false"/>
  16. </LinearLayout>
3、定义一个列表选项中的自定义按钮,title_list_selector.xml:

[html] view plain copy
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <selectorxmlns:android="http://schemas.android.com/apk/res/android">
  3. <itemandroid:drawable="@drawable/mm_title_functionframe_pressed"android:state_focused="true"></item>
  4. <itemandroid:drawable="@drawable/mm_title_functionframe_pressed"android:state_pressed="true"/>
  5. <itemandroid:drawable="@drawable/mm_title_functionframe_pressed"android:state_selected="true"></item>
  6. <itemandroid:drawable="@android:color/transparent"></item>
  7. </selector>
4、最后再定义一个弹窗按钮的自定义按钮,title_button.xml:

[html] view plain copy
  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <selectorxmlns:android="http://schemas.android.com/apk/res/android">
  3. <itemandroid:drawable="@drawable/mm_title_btn_focused"android:state_focused="true"/>
  4. <itemandroid:drawable="@drawable/mm_title_btn_pressed"android:state_pressed="true"/>
  5. <itemandroid:drawable="@drawable/mm_title_btn_pressed"android:state_selected="true"/>
  6. <itemandroid:drawable="@drawable/mm_title_btn_normal"/>
  7. </selector>
5、下面是Java代码部分,首先定义一个常量类,Util.java:

[java] view plain copy
  1. packagecom.yangyu.mytitlebar01;
  2. importandroid.content.Context;
  3. /**
  4. *@authoryangyu
  5. *功能描述:常量工具类
  6. */
  7. publicclassUtil{
  8. /**
  9. *得到设备屏幕的宽度
  10. */
  11. publicstaticintgetScreenWidth(Contextcontext){
  12. returncontext.getResources().getDisplayMetrics().widthPixels;
  13. }
  14. /**
  15. *得到设备屏幕的高度
  16. */
  17. publicstaticintgetScreenHeight(Contextcontext){
  18. returncontext.getResources().getDisplayMetrics().heightPixels;
  19. }
  20. /**
  21. *得到设备的密度
  22. */
  23. publicstaticfloatgetScreenDensity(Contextcontext){
  24. returncontext.getResources().getDisplayMetrics().density;
  25. }
  26. /**
  27. *把密度转换为像素
  28. */
  29. publicstaticintdip2px(Contextcontext,floatpx){
  30. finalfloatscale=getScreenDensity(context);
  31. return(int)(px*scale+0.5);
  32. }
  33. }
6、再定义一个实体对象类,ActionItem这个类主要是用来绘制列表选项中的标题和图标,ActionItem.java:

[java] view plain copy
  1. packagecom.yangyu.mytitlebar01;
  2. importandroid.content.Context;
  3. importandroid.graphics.drawable.Drawable;
  4. /**
  5. *@authoryangyu
  6. *功能描述:弹窗内部子类项(绘制标题和图标)
  7. */
  8. publicclassActionItem{
  9. //定义图片对象
  10. publicDrawablemDrawable;
  11. //定义文本对象
  12. publicCharSequencemTitle;
  13. publicActionItem(Drawabledrawable,CharSequencetitle){
  14. this.mDrawable=drawable;
  15. this.mTitle=title;
  16. }
  17. publicActionItem(Contextcontext,inttitleId,intdrawableId){
  18. this.mTitle=context.getResources().getText(titleId);
  19. this.mDrawable=context.getResources().getDrawable(drawableId);
  20. }
  21. publicActionItem(Contextcontext,CharSequencetitle,intdrawableId){
  22. this.mTitle=title;
  23. this.mDrawable=context.getResources().getDrawable(drawableId);
  24. }
  25. }
7、再定义一个TitlePopup标题栏弹窗类,该类继承自PopupWindow,TitlePopup.java:

[java] view plain copy
  1. packagecom.yangyu.mytitlebar01;
  2. importjava.util.ArrayList;
  3. importandroid.content.Context;
  4. importandroid.graphics.Rect;
  5. importandroid.graphics.drawable.BitmapDrawable;
  6. importandroid.view.Gravity;
  7. importandroid.view.LayoutInflater;
  8. importandroid.view.View;
  9. importandroid.view.ViewGroup;
  10. importandroid.view.ViewGroup.LayoutParams;
  11. importandroid.widget.AdapterView;
  12. importandroid.widget.AdapterView.OnItemClickListener;
  13. importandroid.widget.BaseAdapter;
  14. importandroid.widget.ListView;
  15. importandroid.widget.PopupWindow;
  16. importandroid.widget.TextView;
  17. /**
  18. *@authoryangyu
  19. *功能描述:标题按钮上的弹窗(继承自PopupWindow)
  20. */
  21. publicclassTitlePopupextendsPopupWindow{
  22. privateContextmContext;
  23. //列表弹窗的间隔
  24. protectedfinalintLIST_PADDING=10;
  25. //实例化一个矩形
  26. privateRectmRect=newRect();
  27. //坐标的位置(x、y)
  28. privatefinalint[]mLocation=newint[2];
  29. //屏幕的宽度和高度
  30. privateintmScreenWidth,mScreenHeight;
  31. //判断是否需要添加或更新列表子类项
  32. privatebooleanmIsDirty;
  33. //位置不在中心
  34. privateintpopupGravity=Gravity.NO_GRAVITY;
  35. //弹窗子类项选中时的监听
  36. privateOnItemOnClickListenermItemOnClickListener;
  37. //定义列表对象
  38. privateListViewmListView;
  39. //定义弹窗子类项列表
  40. privateArrayList<ActionItem>mActionItems=newArrayList<ActionItem>();
  41. publicTitlePopup(Contextcontext){
  42. //设置布局的参数
  43. this(context,LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
  44. }
  45. publicTitlePopup(Contextcontext,intwidth,intheight){
  46. this.mContext=context;
  47. //设置可以获得焦点
  48. setFocusable(true);
  49. //设置弹窗内可点击
  50. setTouchable(true);
  51. //设置弹窗外可点击
  52. setOutsideTouchable(true);
  53. //获得屏幕的宽度和高度
  54. mScreenWidth=Util.getScreenWidth(mContext);
  55. mScreenHeight=Util.getScreenHeight(mContext);
  56. //设置弹窗的宽度和高度
  57. setWidth(width);
  58. setHeight(height);
  59. setBackgroundDrawable(newBitmapDrawable());
  60. //设置弹窗的布局界面
  61. setContentView(LayoutInflater.from(mContext).inflate(R.layout.title_popup,null));
  62. initUI();
  63. }
  64. /**
  65. *初始化弹窗列表
  66. */
  67. privatevoidinitUI(){
  68. mListView=(ListView)getContentView().findViewById(R.id.title_list);
  69. mListView.setOnItemClickListener(newOnItemClickListener(){
  70. @Override
  71. publicvoidonItemClick(AdapterView<?>arg0,Viewarg1,intindex,longarg3){
  72. //点击子类项后,弹窗消失
  73. dismiss();
  74. if(mItemOnClickListener!=null)
  75. mItemOnClickListener.onItemClick(mActionItems.get(index),index);
  76. }
  77. });
  78. }
  79. /**
  80. *显示弹窗列表界面
  81. */
  82. publicvoidshow(Viewview){
  83. //获得点击屏幕的位置坐标
  84. view.getLocationOnScreen(mLocation);
  85. //设置矩形的大小
  86. mRect.set(mLocation[0],mLocation[1],mLocation[0]+view.getWidth(),mLocation[1]+view.getHeight());
  87. //判断是否需要添加或更新列表子类项
  88. if(mIsDirty){
  89. populateActions();
  90. }
  91. //显示弹窗的位置
  92. showAtLocation(view,popupGravity,mScreenWidth-LIST_PADDING-(getWidth()/2),mRect.bottom);
  93. }
  94. /**
  95. *设置弹窗列表子项
  96. */
  97. privatevoidpopulateActions(){
  98. mIsDirty=false;
  99. //设置列表的适配器
  100. mListView.setAdapter(newBaseAdapter(){
  101. @Override
  102. publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
  103. TextViewtextView=null;
  104. if(convertView==null){
  105. textView=newTextView(mContext);
  106. textView.setTextColor(mContext.getResources().getColor(android.R.color.white));
  107. textView.setTextSize(14);
  108. //设置文本居中
  109. textView.setGravity(Gravity.CENTER);
  110. //设置文本域的范围
  111. textView.setPadding(0,10,0,10);
  112. //设置文本在一行内显示(不换行)
  113. textView.setSingleLine(true);
  114. }else{
  115. textView=(TextView)convertView;
  116. }
  117. ActionItemitem=mActionItems.get(position);
  118. //设置文本文字
  119. textView.setText(item.mTitle);
  120. //设置文字与图标的间隔
  121. textView.setCompoundDrawablePadding(10);
  122. //设置在文字的左边放一个图标
  123. textView.setCompoundDrawablesWithIntrinsicBounds(item.mDrawable,null,null,null);
  124. returntextView;
  125. }
  126. @Override
  127. publiclonggetItemId(intposition){
  128. returnposition;
  129. }
  130. @Override
  131. publicObjectgetItem(intposition){
  132. returnmActionItems.get(position);
  133. }
  134. @Override
  135. publicintgetCount(){
  136. returnmActionItems.size();
  137. }
  138. });
  139. }
  140. /**
  141. *添加子类项
  142. */
  143. publicvoidaddAction(ActionItemaction){
  144. if(action!=null){
  145. mActionItems.add(action);
  146. mIsDirty=true;
  147. }
  148. }
  149. /**
  150. *清除子类项
  151. */
  152. publicvoidcleanAction(){
  153. if(mActionItems.isEmpty()){
  154. mActionItems.clear();
  155. mIsDirty=true;
  156. }
  157. }
  158. /**
  159. *根据位置得到子类项
  160. */
  161. publicActionItemgetAction(intposition){
  162. if(position<0||position>mActionItems.size())
  163. returnnull;
  164. returnmActionItems.get(position);
  165. }
  166. /**
  167. *设置监听事件
  168. */
  169. publicvoidsetItemOnClickListener(OnItemOnClickListeneronItemOnClickListener){
  170. this.mItemOnClickListener=onItemOnClickListener;
  171. }
  172. /**
  173. *@authoryangyu
  174. *功能描述:弹窗子类项按钮监听事件
  175. */
  176. publicstaticinterfaceOnItemOnClickListener{
  177. publicvoidonItemClick(ActionItemitem,intposition);
  178. }
  179. }
8、最后再定义一个Activity界面类,CustomTitleActivity01.java:

[java] view plain copy
  1. packagecom.yangyu.mytitlebar01;
  2. importandroid.app.Activity;
  3. importandroid.os.Bundle;
  4. importandroid.view.View;
  5. importandroid.view.View.OnClickListener;
  6. importandroid.view.ViewGroup.LayoutParams;
  7. importandroid.widget.ImageButton;
  8. /**
  9. *@authoryangyu
  10. *功能描述:第一种实现方式,PopupWindow实现方式
  11. */
  12. publicclassCustomTitleActivity01extendsActivity{
  13. //定义标题栏上的按钮
  14. privateImageButtontitleBtn;
  15. //定义标题栏弹窗按钮
  16. privateTitlePopuptitlePopup;
  17. @Override
  18. protectedvoidonCreate(BundlesavedInstanceState){
  19. super.onCreate(savedInstanceState);
  20. setContentView(R.layout.activity_title);
  21. initView();
  22. initData();
  23. }
  24. /**
  25. *初始化组件
  26. */
  27. privatevoidinitView(){
  28. //实例化标题栏按钮并设置监听
  29. titleBtn=(ImageButton)findViewById(R.id.title_btn);
  30. titleBtn.setOnClickListener(newOnClickListener(){
  31. @Override
  32. publicvoidonClick(Viewv){
  33. titlePopup.show(v);
  34. }
  35. });
  36. //实例化标题栏弹窗
  37. titlePopup=newTitlePopup(this,LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
  38. }
  39. /**
  40. *初始化数据
  41. */
  42. privatevoidinitData(){
  43. //给标题栏弹窗添加子类
  44. titlePopup.addAction(newActionItem(this,"发起聊天",R.drawable.mm_title_btn_compose_normal));
  45. titlePopup.addAction(newActionItem(this,"听筒模式",R.drawable.mm_title_btn_receiver_normal));
  46. titlePopup.addAction(newActionItem(this,"登录网页",R.drawable.mm_title_btn_keyboard_normal));
  47. titlePopup.addAction(newActionItem(this,"扫一扫",R.drawable.mm_title_btn_qrcode_normal));
  48. }
  49. }

3.2 第二种实现方式(Activity)


第二种实现方式主要是通过再定义一个Activity来调用实现的,要想实现一个Activity点击按钮实现另一个Activity的弹窗

效果,就要在AndroidManifest.xml清单文件中注册一个新的Activity,然后给它调用系统的样式来实现这种效果。

[html] view plain copy
  1. <activity
  2. android:name="DialogActivity"
  3. android:theme="@android:style/Theme.Translucent.NoTitleBar">
  4. </activity>

1、定义另一个Activity布局文件,activity_dialog.xml:

[html] view plain copy
  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent">
  5. <RelativeLayout
  6. android:layout_width="fill_parent"
  7. android:layout_height="fill_parent"
  8. android:layout_marginTop="50dp">
  9. <LinearLayout
  10. android:id="@+id/main_dialog_layout"
  11. android:layout_width="wrap_content"
  12. android:layout_height="wrap_content"
  13. android:layout_alignParentRight="true"
  14. android:layout_alignParentTop="true"
  15. android:background="@drawable/title_function_bg"
  16. android:orientation="vertical">
  17. <LinearLayout
  18. android:id="@+id/llayout01"
  19. android:layout_width="fill_parent"
  20. android:layout_height="wrap_content"
  21. android:layout_marginLeft="5dp"
  22. android:layout_marginRight="5dp"
  23. android:layout_marginTop="5dp"
  24. android:background="@drawable/title_list_selector">
  25. <ImageView
  26. android:id="@+id/imageView1"
  27. android:layout_width="wrap_content"
  28. android:layout_height="wrap_content"
  29. android:layout_gravity="center_vertical"
  30. android:layout_marginLeft="8dp"
  31. android:src="@drawable/mm_title_btn_compose_normal"/>
  32. <TextView
  33. android:layout_width="wrap_content"
  34. android:layout_height="wrap_content"
  35. android:padding="8dp"
  36. android:text="发起聊天"
  37. android:textColor="#fff"
  38. android:textSize="16sp"/>
  39. </LinearLayout>
  40. <ImageView
  41. android:id="@+id/imageView5"
  42. android:layout_width="wrap_content"
  43. android:layout_height="wrap_content"
  44. android:src="@drawable/mm_title_functionframe_line"/>
  45. <LinearLayout
  46. android:id="@+id/llayout02"
  47. android:layout_width="fill_parent"
  48. android:layout_height="wrap_content"
  49. android:layout_marginLeft="5dp"
  50. android:layout_marginRight="5dp"
  51. android:background="@drawable/title_list_selector">
  52. <ImageView
  53. android:id="@+id/imageView2"
  54. android:layout_width="wrap_content"
  55. android:layout_height="wrap_content"
  56. android:layout_gravity="center_vertical"
  57. android:layout_marginLeft="8dp"
  58. android:src="@drawable/mm_title_btn_receiver_normal"/>
  59. <TextView
  60. android:layout_width="wrap_content"
  61. android:layout_height="wrap_content"
  62. android:padding="8dp"
  63. android:text="听筒模式"
  64. android:textColor="#fff"
  65. android:textSize="16sp"/>
  66. </LinearLayout>
  67. <ImageView
  68. android:id="@+id/imageView5"
  69. android:layout_width="wrap_content"
  70. android:layout_height="wrap_content"
  71. android:src="@drawable/mm_title_functionframe_line"/>
  72. <LinearLayout
  73. android:id="@+id/llayout03"
  74. android:layout_width="fill_parent"
  75. android:layout_height="wrap_content"
  76. android:layout_marginLeft="5dp"
  77. android:layout_marginRight="5dp"
  78. android:background="@drawable/title_list_selector">
  79. <ImageView
  80. android:id="@+id/imageView3"
  81. android:layout_width="wrap_content"
  82. android:layout_height="wrap_content"
  83. android:layout_gravity="center_vertical"
  84. android:layout_marginLeft="8dp"
  85. android:src="@drawable/mm_title_btn_keyboard_normal"/>
  86. <TextView
  87. android:layout_width="wrap_content"
  88. android:layout_height="wrap_content"
  89. android:padding="8dp"
  90. android:text="登录网页"
  91. android:textColor="#fff"
  92. android:textSize="16sp"/>
  93. </LinearLayout>
  94. <ImageView
  95. android:id="@+id/imageView5"
  96. android:layout_width="wrap_content"
  97. android:layout_height="wrap_content"
  98. android:src="@drawable/mm_title_functionframe_line"/>
  99. <LinearLayout
  100. android:id="@+id/llayout04"
  101. android:layout_width="fill_parent"
  102. android:layout_height="wrap_content"
  103. android:layout_marginBottom="3dp"
  104. android:layout_marginLeft="5dp"
  105. android:layout_marginRight="5dp"
  106. android:background="@drawable/title_list_selector">
  107. <ImageView
  108. android:id="@+id/imageView4"
  109. android:layout_width="wrap_content"
  110. android:layout_height="wrap_content"
  111. android:layout_gravity="center_vertical"
  112. android:layout_marginLeft="8dp"
  113. android:src="@drawable/mm_title_btn_qrcode_normal"/>
  114. <TextView
  115. android:layout_width="wrap_content"
  116. android:layout_height="wrap_content"
  117. android:padding="13dp"
  118. android:text="扫一扫"
  119. android:textColor="#fff"
  120. android:textSize="16sp"/>
  121. </LinearLayout>
  122. </LinearLayout>
  123. </RelativeLayout>
  124. </RelativeLayout>
2、另一个Activity弹窗界面,DialogActivity.java:

[java] view plain copy
  1. packagecom.yangyu.mytitlebar01;
  2. importandroid.app.Activity;
  3. importandroid.os.Bundle;
  4. importandroid.view.MotionEvent;
  5. importandroid.view.View;
  6. importandroid.view.View.OnClickListener;
  7. importandroid.widget.LinearLayout;
  8. /**
  9. *@authoryangyu
  10. *功能描述:弹出Activity界面
  11. */
  12. publicclassDialogActivityextendsActivityimplementsOnClickListener{
  13. privateLinearLayoutlayout01,layout02,layout03,layout04;
  14. @Override
  15. protectedvoidonCreate(BundlesavedInstanceState){
  16. super.onCreate(savedInstanceState);
  17. setContentView(R.layout.activity_dialog);
  18. initView();
  19. }
  20. /**
  21. *初始化组件
  22. */
  23. privatevoidinitView(){
  24. //得到布局组件对象并设置监听事件
  25. layout01=(LinearLayout)findViewById(R.id.llayout01);
  26. layout02=(LinearLayout)findViewById(R.id.llayout02);
  27. layout03=(LinearLayout)findViewById(R.id.llayout03);
  28. layout04=(LinearLayout)findViewById(R.id.llayout04);
  29. layout01.setOnClickListener(this);
  30. layout02.setOnClickListener(this);
  31. layout03.setOnClickListener(this);
  32. layout04.setOnClickListener(this);
  33. }
  34. @Override
  35. publicbooleanonTouchEvent(MotionEventevent){
  36. finish();
  37. returntrue;
  38. }
  39. @Override
  40. publicvoidonClick(Viewv){
  41. }
  42. }
3、最后是第二种方式的显示界面,CustomTitleActivity02.java:

[java] view plain copy
  1. packagecom.yangyu.mytitlebar01;
  2. importandroid.app.Activity;
  3. importandroid.content.Intent;
  4. importandroid.os.Bundle;
  5. importandroid.view.View;
  6. importandroid.view.View.OnClickListener;
  7. importandroid.widget.ImageButton;
  8. /**
  9. *@authoryangyu
  10. *功能描述:第二种实现方式,Activity实现方式
  11. */
  12. publicclassCustomTitleActivity02extendsActivity{
  13. //定义标题栏上的按钮
  14. privateImageButtontitleBtn;
  15. @Override
  16. protectedvoidonCreate(BundlesavedInstanceState){
  17. super.onCreate(savedInstanceState);
  18. setContentView(R.layout.activity_title);
  19. initView();
  20. }
  21. /**
  22. *初始化组件
  23. */
  24. privatevoidinitView(){
  25. //实例化标题栏按钮并设置监听
  26. titleBtn=(ImageButton)findViewById(R.id.title_btn);
  27. titleBtn.setOnClickListener(newOnClickListener(){
  28. @Override
  29. publicvoidonClick(Viewv){
  30. startActivity(newIntent(CustomTitleActivity02.this,DialogActivity.class));
  31. }
  32. });
  33. }
  34. }


两种弹窗的实现方式基本上就讲完了,有什么问题可以跟博主留言。


源码下载地址


















【Android UI设计与开发】第04期:引导界面(四)仿人人网V5.9.2最新版引导界面

分类:Android UI设计与开发 3143人阅读 评论(13) 收藏 举报 仿人人 仿人人引导界面 android引导界面 android 界面设计

转载请注明出处:http://blog.csdn.net/yangyu20121224/article/details/8988147


这一篇我将会以人人网的引导界面为实例来展开详细的讲解,人人网的引导界面比较的新颖,不同于其他应用程序千篇一律的靠滑动来引导用户,而是以一个一个比较生动形象的动画效果展示在用户们的面前,有一种给人眼前一亮的感觉,话不多说,进入正题。


一、实现的效果图


欢迎界面:

【Android UI设计与开发】第14期:顶部标题栏(五)两种方式实现仿微信标题栏弹窗效果_第5张图片


引导界面1

【Android UI设计与开发】第14期:顶部标题栏(五)两种方式实现仿微信标题栏弹窗效果_第6张图片


引导界面 2

【Android UI设计与开发】第14期:顶部标题栏(五)两种方式实现仿微信标题栏弹窗效果_第7张图片


引导界面 3

【Android UI设计与开发】第14期:顶部标题栏(五)两种方式实现仿微信标题栏弹窗效果_第8张图片


二 、项目的目录结构


【Android UI设计与开发】第14期:顶部标题栏(五)两种方式实现仿微信标题栏弹窗效果_第9张图片


三、具体的编码实现


1、欢迎界面的xml布局,activity_welcome:

[html] view plain copy
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent"
  5. android:background="@drawable/v5_6_2_welcome"
  6. android:orientation="vertical"/>
2、引导界面的xml布局,activity_guide.xml:

[html] view plain copy
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent"
  5. android:orientation="vertical">
  6. <ImageView
  7. android:id="@+id/iv_guide_picture"
  8. android:layout_width="fill_parent"
  9. android:layout_height="fill_parent"
  10. android:layout_weight="1.0"
  11. android:scaleType="fitXY"/>
  12. <LinearLayout
  13. android:id="@+id/ll_bottom_action_bar"
  14. android:layout_width="fill_parent"
  15. android:layout_height="wrap_content"
  16. android:layout_alignParentBottom="true"
  17. android:orientation="horizontal"
  18. android:padding="7dip">
  19. <Button
  20. android:id="@+id/btn_register"
  21. android:layout_width="fill_parent"
  22. android:layout_height="45dip"
  23. android:layout_weight="1.5"
  24. android:background="@drawable/guide_btn_blue"
  25. android:gravity="center"
  26. android:singleLine="true"
  27. android:text="注册"
  28. android:textColor="#FFFFFF"
  29. android:textSize="15.0sp"/>
  30. <Button
  31. android:id="@+id/btn_look_at_the_people_i_know"
  32. android:layout_width="fill_parent"
  33. android:layout_height="45dip"
  34. android:layout_marginLeft="8dip"
  35. android:layout_marginRight="8dip"
  36. android:layout_weight="1.0"
  37. android:background="@drawable/guide_btn_white"
  38. android:gravity="center"
  39. android:singleLine="true"
  40. android:text="看看我认识的人"
  41. android:textColor="#000000"
  42. android:textSize="15.0sp"/>
  43. <Button
  44. android:id="@+id/btn_login"
  45. android:layout_width="fill_parent"
  46. android:layout_height="45dip"
  47. android:layout_weight="1.5"
  48. android:background="@drawable/guide_btn_blue"
  49. android:gravity="center"
  50. android:singleLine="true"
  51. android:text="登录"
  52. android:textColor="#FFFFFF"
  53. android:textSize="15.0sp"/>
  54. </LinearLayout>
  55. </RelativeLayout>
3、在这里还要创建两个xml资源文件文件来实现自定义按钮的效果,关于自定义按钮的效果实现我会在后面的UI专题详细介绍,这里就不在赘述, guide_btn_blue.xml:

[html] view plain copy
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <selectorxmlns:android="http://schemas.android.com/apk/res/android">
  3. <itemandroid:drawable="@drawable/v5_0_1_guide_blue_default"android:state_focused="true"android:state_pressed="false"/>
  4. <itemandroid:drawable="@drawable/v5_0_1_guide_blue_press"android:state_pressed="true"/>
  5. <itemandroid:drawable="@drawable/v5_0_1_guide_blue_default"/>
  6. </selector>
guide_btn_white:

[html] view plain copy
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <selectorxmlns:android="http://schemas.android.com/apk/res/android">
  3. <itemandroid:drawable="@drawable/v5_0_1_guide_black_default"android:state_focused="true"android:state_pressed="false"/>
  4. <itemandroid:drawable="@drawable/v5_0_1_guide_black_press"android:state_pressed="true"/>
  5. <itemandroid:drawable="@drawable/v5_0_1_guide_black_default"/>
  6. </selector>
4、然后是动画效果的xml资源文件,关于自定义动画效果的实现我也会在后面的UI专题中详细介绍,这里也就不再赘述 渐入动画资源文件,guide_fade_in.xml:

[html] view plain copy
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <setxmlns:android="http://schemas.android.com/apk/res/android">
  3. <alphaandroid:fromAlpha="0.0"
  4. android:toAlpha="1.0"/>
  5. </set>
渐隐动画资源文件,guide_fade_out.xml:

[html] view plain copy
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <setxmlns:android="http://schemas.android.com/apk/res/android">
  3. <scale
  4. android:fillAfter="false"
  5. android:fromXScale="1.1"
  6. android:fromYScale="1.1"
  7. android:interpolator="@android:anim/decelerate_interpolator"
  8. android:pivotX="50.0%"
  9. android:pivotY="50.0%"
  10. android:toXScale="1.1"
  11. android:toYScale="1.1"/>
  12. <alpha
  13. xmlns:android="http://schemas.android.com/apk/res/android"
  14. android:fromAlpha="1.0"
  15. android:toAlpha="0.0"/>
  16. </set>
放大动画资源文件,guide_fade_in_scale: [html] view plain copy
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <setxmlns:android="http://schemas.android.com/apk/res/android">
  3. <scale
  4. android:fillAfter="false"
  5. android:fromXScale="1.0"
  6. android:fromYScale="1.0"
  7. android:interpolator="@android:anim/decelerate_interpolator"
  8. android:pivotX="50.0%"
  9. android:pivotY="50.0%"
  10. android:toXScale="1.1"
  11. android:toYScale="1.1"/>
  12. </set>
5、 开始启动的欢迎界WelcomeActivity.java:

[java] view plain copy
  1. packagecom.yangyu.myguideview03;
  2. importandroid.app.Activity;
  3. importandroid.content.Intent;
  4. importandroid.os.Bundle;
  5. importandroid.os.CountDownTimer;
  6. /**
  7. *@authoryangyu
  8. *功能描述:欢迎界面Activity(Logo)
  9. */
  10. publicclassWelcomeActivityextendsActivity{
  11. @Override
  12. publicvoidonCreate(BundlesavedInstanceState){
  13. super.onCreate(savedInstanceState);
  14. setContentView(R.layout.activity_welcome);
  15. /**
  16. *millisInFuture:从开始调用start()到倒计时完成并onFinish()方法被调用的毫秒数
  17. *countDownInterval:接收onTick(long)回调的间隔时间
  18. */
  19. newCountDownTimer(5000,1000){
  20. @Override
  21. publicvoidonTick(longmillisUntilFinished){
  22. }
  23. @Override
  24. publicvoidonFinish(){
  25. Intentintent=newIntent(WelcomeActivity.this,GuideActivity.class);
  26. startActivity(intent);
  27. WelcomeActivity.this.finish();
  28. }
  29. }.start();
  30. }
  31. }
6、引导界面,GuideActivity.java:

[java] view plain copy
  1. packagecom.yangyu.myguideview03;
  2. importandroid.app.Activity;
  3. importandroid.graphics.drawable.Drawable;
  4. importandroid.os.Bundle;
  5. importandroid.view.View;
  6. importandroid.view.View.OnClickListener;
  7. importandroid.view.animation.Animation;
  8. importandroid.view.animation.Animation.AnimationListener;
  9. importandroid.view.animation.AnimationUtils;
  10. importandroid.widget.Button;
  11. importandroid.widget.ImageView;
  12. importandroid.widget.Toast;
  13. /**
  14. *@authoryangyu
  15. *功能描述:导引界面(每张图片都执行的动画顺序,渐现、放大和渐隐,结束后切换图片和文字
  16. *又开始执行渐现、放大和渐隐,当最后一张执行完渐隐,切换到第一张,从而达到循环效果)
  17. */
  18. publicclassGuideActivityextendsActivityimplementsOnClickListener{
  19. //定义注册、登录和看看我认识的人按钮
  20. privateButtonbtnRegister,btnLogin,btnIKnowPeople;
  21. //显示图片的ImageView组件
  22. privateImageViewivGuidePicture;
  23. //要展示的一组图片资源
  24. privateDrawable[]pictures;
  25. //每张展示图片要执行的一组动画效果
  26. privateAnimation[]animations;
  27. //当前执行的是第几张图片(资源索引)
  28. privateintcurrentItem=0;
  29. @Override
  30. protectedvoidonCreate(BundlesavedInstanceState){
  31. super.onCreate(savedInstanceState);
  32. setContentView(R.layout.activity_guide);
  33. initView();
  34. initData();
  35. }
  36. /**
  37. *初始化组件
  38. */
  39. privatevoidinitView(){
  40. //实例化ImageView引导图片
  41. ivGuidePicture=(ImageView)findViewById(R.id.iv_guide_picture);
  42. //实例化按钮
  43. btnRegister=(Button)findViewById(R.id.btn_register);
  44. btnIKnowPeople=(Button)findViewById(R.id.btn_look_at_the_people_i_know);
  45. btnLogin=(Button)findViewById(R.id.btn_login);
  46. //实例化引导图片数组
  47. pictures=newDrawable[]{getResources().getDrawable(R.drawable.v5_3_0_guide_pic1),getResources().getDrawable(R.drawable.v5_3_0_guide_pic2),
  48. getResources().getDrawable(R.drawable.v5_3_0_guide_pic3)};
  49. //实例化动画效果数组
  50. animations=newAnimation[]{AnimationUtils.loadAnimation(this,R.anim.guide_fade_in),
  51. AnimationUtils.loadAnimation(this,R.anim.guide_fade_in_scale),
  52. AnimationUtils.loadAnimation(this,R.anim.guide_fade_out)};
  53. }
  54. /**
  55. *初始化数据
  56. */
  57. privatevoidinitData(){
  58. //给按钮设置监听
  59. btnRegister.setOnClickListener(this);
  60. btnIKnowPeople.setOnClickListener(this);
  61. btnLogin.setOnClickListener(this);
  62. //给每个动画效果设置播放时间
  63. animations[0].setDuration(1500);
  64. animations[1].setDuration(3000);
  65. animations[2].setDuration(1500);
  66. //给每个动画效果设置监听事件
  67. animations[0].setAnimationListener(newGuideAnimationListener(0));
  68. animations[1].setAnimationListener(newGuideAnimationListener(1));
  69. animations[2].setAnimationListener(newGuideAnimationListener(2));
  70. //设置图片动画初始化默认值为0
  71. ivGuidePicture.setImageDrawable(pictures[currentItem]);
  72. ivGuidePicture.startAnimation(animations[0]);
  73. }
  74. /**
  75. *实现了动画监听接口,重写里面的方法
  76. */
  77. classGuideAnimationListenerimplementsAnimationListener{
  78. privateintindex;
  79. publicGuideAnimationListener(intindex){
  80. this.index=index;
  81. }
  82. @Override
  83. publicvoidonAnimationStart(Animationanimation){
  84. }
  85. //重写动画结束时的监听事件,实现了动画循环播放的效果
  86. @Override
  87. publicvoidonAnimationEnd(Animationanimation){
  88. if(index<(animations.length-1)){
  89. ivGuidePicture.startAnimation(animations[index+1]);
  90. }else{
  91. currentItem++;
  92. if(currentItem>(pictures.length-1)){
  93. currentItem=0;
  94. }
  95. ivGuidePicture.setImageDrawable(pictures[currentItem]);
  96. ivGuidePicture.startAnimation(animations[0]);
  97. }
  98. }
  99. @Override
  100. publicvoidonAnimationRepeat(Animationanimation){
  101. }
  102. }
  103. @Override
  104. publicvoidonClick(Viewv){
  105. switch(v.getId()){
  106. caseR.id.btn_register:
  107. Toast.makeText(this,"点击了注册按钮",Toast.LENGTH_SHORT).show();
  108. break;
  109. caseR.id.btn_look_at_the_people_i_know:
  110. Toast.makeText(this,"点击了我认识的人按钮",Toast.LENGTH_SHORT).show();
  111. break;
  112. caseR.id.btn_login:
  113. Toast.makeText(this,"点击了登录按钮",Toast.LENGTH_SHORT).show();
  114. break;
  115. default:
  116. break;
  117. }
  118. }
  119. }
下一篇将会对整个引导界面的开发专题做一个完结篇,敬请期待。


源码下载地址




更多相关文章

  1. android操作XML的几种方式
  2. 超级清爽android计算器界面源码
  3. android 自定义toggle Button按钮
  4. android超炫button按钮动画效果
  5. Qt_Qtopia与Android的进程间通讯方式
  6. android 登陆界面
  7. Android 用手动组拼的方式生成xml
  8. android 滑动欢迎界面
  9. android 线程方式打印log到sd卡

随机推荐

  1. Android(安卓)monkey 使用及日志分析
  2. Android(安卓)沉浸式状态栏与隐藏导航栏
  3. arcgis for android 学习 - (2) hello Wr
  4. Android(安卓)轻松实现语音识别
  5. 2018-2019-2 20189203 移动平台应用开发
  6. android本地后台服务示例
  7. 修正Android摄像头API
  8. Android(安卓)Uri命名格式
  9. Android基础 : Android(安卓)Service
  10. android 牛人必修 ant 编译android工程