【Android UI设计与开发】第14期:顶部标题栏(五)两种方式实现仿微信标题栏弹窗效果
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设计与开发 2013-06-14 16:04 5407人阅读 评论(26) 收藏 举报 PopupWindow 弹出式菜单 自定义顶部标题栏 Android顶部标题栏转载请注明出处:http://blog.csdn.net/yangyu20121224/article/details/9093821
博主在这篇文章中将会继续围绕顶部标题栏专题来进行实例讲解,今天要讲解的主题是分别使用PopupWindow和Activity两种不同的方式来实现仿微信顶部标题栏弹窗的这样一个效果。
一、实现效果图
这里为了演示方便,我将两种方法放在一个应用程序中演示,这个是主界面
虽然两种实现的方式不一样,但是最终的效果图都是差不多的
二、项目结构图
三、详细的编码实现
3.1 主界面的实现
为了演示方便,我这里把两种实现方式分成两个Activity界面放在了主Activity界面中。
1、主布局资源文件,activity_main.xml:
[html] view plain copy
- <RelativeLayoutxmlns: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">
- <Button
- android:id="@+id/main_btn01"
- android:layout_width="fill_parent"
- android:layout_height="44dp"
- android:layout_above="@+id/main_btn02"
- android:layout_margin="5dp"
- android:background="@drawable/main_btn"
- android:text="第一种实现方式(PopupWindow实现)"
- android:textSize="16dp"/>
- <Button
- android:id="@+id/main_btn02"
- android:layout_width="fill_parent"
- android:layout_height="44dp"
- android:layout_centerVertical="true"
- android:layout_margin="5dp"
- android:background="@drawable/main_btn"
- android:text="第二种实现方式(Activity实现)"
- android:textSize="16dp"/>
- </RelativeLayout>
[html] view plain copy
- <?xmlversion="1.0"encoding="utf-8"?>
- <selectorxmlns:android="http://schemas.android.com/apk/res/android">
- <itemandroid:drawable="@drawable/btn_back_pre"android:state_pressed="true"/>
- <itemandroid:drawable="@drawable/btn_back_nor"/>
- </selector>
[java] view plain copy
- packagecom.yangyu.mytitlebar01;
- importandroid.app.Activity;
- importandroid.content.Intent;
- importandroid.os.Bundle;
- importandroid.view.View;
- importandroid.view.View.OnClickListener;
- importandroid.widget.Button;
- /**
- *@authoryangyu
- *功能描述:主Activity类,程序的入口类
- */
- publicclassMainActivityextendsActivityimplementsOnClickListener{
- //定义按钮
- privateButtonmainBtn01,mainBtn02;
- @Override
- protectedvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- initView();
- }
- /**
- *初始化组件
- */
- privatevoidinitView(){
- //得到按钮并设置监听事件
- mainBtn01=(Button)findViewById(R.id.main_btn01);
- mainBtn02=(Button)findViewById(R.id.main_btn02);
- mainBtn01.setOnClickListener(this);
- mainBtn02.setOnClickListener(this);
- }
- @Override
- publicvoidonClick(Viewv){
- switch(v.getId()){
- caseR.id.main_btn01:
- startActivity(newIntent(MainActivity.this,CustomTitleActivity01.class));
- break;
- caseR.id.main_btn02:
- startActivity(newIntent(MainActivity.this,CustomTitleActivity02.class));
- break;
- default:
- break;
- }
- }
- }
3.2 第一种实现方式(PopupWindow)
第一种实现方式主要是通过点击按钮来弹出一个PopupWindow菜单来实现的,步骤如下:
1、标题栏的布局资源文件,这个资源文件在第二种实现方式中也会使用到,activity_main.xml:
[html] view plain copy
- <?xmlversion="1.0"encoding="utf-8"?>
- <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:background="#fcfcfc"
- android:orientation="vertical">
- <RelativeLayout
- android:id="@+id/title"
- android:layout_width="fill_parent"
- android:layout_height="45dp"
- android:background="@drawable/title_bar"
- android:gravity="center_vertical">
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_centerInParent="true"
- android:text="微信"
- android:textColor="#ffffff"
- android:textSize="20sp"/>
- <ImageButton
- android:id="@+id/title_btn"
- android:layout_width="67dp"
- android:layout_height="wrap_content"
- android:layout_alignParentRight="true"
- android:layout_centerVertical="true"
- android:layout_marginRight="5dp"
- android:background="@drawable/title_button"
- android:onClick="btnmainright"
- android:src="@drawable/title_btn_function"/>
- </RelativeLayout>
- </LinearLayout>
[html] view plain copy
- <?xmlversion="1.0"encoding="utf-8"?>
- <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:background="@drawable/title_function_bg"
- android:orientation="vertical">
- <ListView
- android:id="@+id/title_list"
- android:layout_width="120dp"
- android:layout_height="fill_parent"
- android:cacheColorHint="#00000000"
- android:divider="@drawable/mm_title_functionframe_line"
- android:listSelector="@drawable/title_list_selector"
- android:padding="3dp"
- android:scrollingCache="false"/>
- </LinearLayout>
[html] view plain copy
- <?xmlversion="1.0"encoding="utf-8"?>
- <selectorxmlns:android="http://schemas.android.com/apk/res/android">
- <itemandroid:drawable="@drawable/mm_title_functionframe_pressed"android:state_focused="true"></item>
- <itemandroid:drawable="@drawable/mm_title_functionframe_pressed"android:state_pressed="true"/>
- <itemandroid:drawable="@drawable/mm_title_functionframe_pressed"android:state_selected="true"></item>
- <itemandroid:drawable="@android:color/transparent"></item>
- </selector>
[html] view plain copy
- <?xmlversion="1.0"encoding="UTF-8"?>
- <selectorxmlns:android="http://schemas.android.com/apk/res/android">
- <itemandroid:drawable="@drawable/mm_title_btn_focused"android:state_focused="true"/>
- <itemandroid:drawable="@drawable/mm_title_btn_pressed"android:state_pressed="true"/>
- <itemandroid:drawable="@drawable/mm_title_btn_pressed"android:state_selected="true"/>
- <itemandroid:drawable="@drawable/mm_title_btn_normal"/>
- </selector>
[java] view plain copy
- packagecom.yangyu.mytitlebar01;
- importandroid.content.Context;
- /**
- *@authoryangyu
- *功能描述:常量工具类
- */
- publicclassUtil{
- /**
- *得到设备屏幕的宽度
- */
- publicstaticintgetScreenWidth(Contextcontext){
- returncontext.getResources().getDisplayMetrics().widthPixels;
- }
- /**
- *得到设备屏幕的高度
- */
- publicstaticintgetScreenHeight(Contextcontext){
- returncontext.getResources().getDisplayMetrics().heightPixels;
- }
- /**
- *得到设备的密度
- */
- publicstaticfloatgetScreenDensity(Contextcontext){
- returncontext.getResources().getDisplayMetrics().density;
- }
- /**
- *把密度转换为像素
- */
- publicstaticintdip2px(Contextcontext,floatpx){
- finalfloatscale=getScreenDensity(context);
- return(int)(px*scale+0.5);
- }
- }
[java] view plain copy
- packagecom.yangyu.mytitlebar01;
- importandroid.content.Context;
- importandroid.graphics.drawable.Drawable;
- /**
- *@authoryangyu
- *功能描述:弹窗内部子类项(绘制标题和图标)
- */
- publicclassActionItem{
- //定义图片对象
- publicDrawablemDrawable;
- //定义文本对象
- publicCharSequencemTitle;
- publicActionItem(Drawabledrawable,CharSequencetitle){
- this.mDrawable=drawable;
- this.mTitle=title;
- }
- publicActionItem(Contextcontext,inttitleId,intdrawableId){
- this.mTitle=context.getResources().getText(titleId);
- this.mDrawable=context.getResources().getDrawable(drawableId);
- }
- publicActionItem(Contextcontext,CharSequencetitle,intdrawableId){
- this.mTitle=title;
- this.mDrawable=context.getResources().getDrawable(drawableId);
- }
- }
[java] view plain copy
- packagecom.yangyu.mytitlebar01;
- importjava.util.ArrayList;
- importandroid.content.Context;
- importandroid.graphics.Rect;
- importandroid.graphics.drawable.BitmapDrawable;
- importandroid.view.Gravity;
- importandroid.view.LayoutInflater;
- importandroid.view.View;
- importandroid.view.ViewGroup;
- importandroid.view.ViewGroup.LayoutParams;
- importandroid.widget.AdapterView;
- importandroid.widget.AdapterView.OnItemClickListener;
- importandroid.widget.BaseAdapter;
- importandroid.widget.ListView;
- importandroid.widget.PopupWindow;
- importandroid.widget.TextView;
- /**
- *@authoryangyu
- *功能描述:标题按钮上的弹窗(继承自PopupWindow)
- */
- publicclassTitlePopupextendsPopupWindow{
- privateContextmContext;
- //列表弹窗的间隔
- protectedfinalintLIST_PADDING=10;
- //实例化一个矩形
- privateRectmRect=newRect();
- //坐标的位置(x、y)
- privatefinalint[]mLocation=newint[2];
- //屏幕的宽度和高度
- privateintmScreenWidth,mScreenHeight;
- //判断是否需要添加或更新列表子类项
- privatebooleanmIsDirty;
- //位置不在中心
- privateintpopupGravity=Gravity.NO_GRAVITY;
- //弹窗子类项选中时的监听
- privateOnItemOnClickListenermItemOnClickListener;
- //定义列表对象
- privateListViewmListView;
- //定义弹窗子类项列表
- privateArrayList<ActionItem>mActionItems=newArrayList<ActionItem>();
- publicTitlePopup(Contextcontext){
- //设置布局的参数
- this(context,LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
- }
- publicTitlePopup(Contextcontext,intwidth,intheight){
- this.mContext=context;
- //设置可以获得焦点
- setFocusable(true);
- //设置弹窗内可点击
- setTouchable(true);
- //设置弹窗外可点击
- setOutsideTouchable(true);
- //获得屏幕的宽度和高度
- mScreenWidth=Util.getScreenWidth(mContext);
- mScreenHeight=Util.getScreenHeight(mContext);
- //设置弹窗的宽度和高度
- setWidth(width);
- setHeight(height);
- setBackgroundDrawable(newBitmapDrawable());
- //设置弹窗的布局界面
- setContentView(LayoutInflater.from(mContext).inflate(R.layout.title_popup,null));
- initUI();
- }
- /**
- *初始化弹窗列表
- */
- privatevoidinitUI(){
- mListView=(ListView)getContentView().findViewById(R.id.title_list);
- mListView.setOnItemClickListener(newOnItemClickListener(){
- @Override
- publicvoidonItemClick(AdapterView<?>arg0,Viewarg1,intindex,longarg3){
- //点击子类项后,弹窗消失
- dismiss();
- if(mItemOnClickListener!=null)
- mItemOnClickListener.onItemClick(mActionItems.get(index),index);
- }
- });
- }
- /**
- *显示弹窗列表界面
- */
- publicvoidshow(Viewview){
- //获得点击屏幕的位置坐标
- view.getLocationOnScreen(mLocation);
- //设置矩形的大小
- mRect.set(mLocation[0],mLocation[1],mLocation[0]+view.getWidth(),mLocation[1]+view.getHeight());
- //判断是否需要添加或更新列表子类项
- if(mIsDirty){
- populateActions();
- }
- //显示弹窗的位置
- showAtLocation(view,popupGravity,mScreenWidth-LIST_PADDING-(getWidth()/2),mRect.bottom);
- }
- /**
- *设置弹窗列表子项
- */
- privatevoidpopulateActions(){
- mIsDirty=false;
- //设置列表的适配器
- mListView.setAdapter(newBaseAdapter(){
- @Override
- publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
- TextViewtextView=null;
- if(convertView==null){
- textView=newTextView(mContext);
- textView.setTextColor(mContext.getResources().getColor(android.R.color.white));
- textView.setTextSize(14);
- //设置文本居中
- textView.setGravity(Gravity.CENTER);
- //设置文本域的范围
- textView.setPadding(0,10,0,10);
- //设置文本在一行内显示(不换行)
- textView.setSingleLine(true);
- }else{
- textView=(TextView)convertView;
- }
- ActionItemitem=mActionItems.get(position);
- //设置文本文字
- textView.setText(item.mTitle);
- //设置文字与图标的间隔
- textView.setCompoundDrawablePadding(10);
- //设置在文字的左边放一个图标
- textView.setCompoundDrawablesWithIntrinsicBounds(item.mDrawable,null,null,null);
- returntextView;
- }
- @Override
- publiclonggetItemId(intposition){
- returnposition;
- }
- @Override
- publicObjectgetItem(intposition){
- returnmActionItems.get(position);
- }
- @Override
- publicintgetCount(){
- returnmActionItems.size();
- }
- });
- }
- /**
- *添加子类项
- */
- publicvoidaddAction(ActionItemaction){
- if(action!=null){
- mActionItems.add(action);
- mIsDirty=true;
- }
- }
- /**
- *清除子类项
- */
- publicvoidcleanAction(){
- if(mActionItems.isEmpty()){
- mActionItems.clear();
- mIsDirty=true;
- }
- }
- /**
- *根据位置得到子类项
- */
- publicActionItemgetAction(intposition){
- if(position<0||position>mActionItems.size())
- returnnull;
- returnmActionItems.get(position);
- }
- /**
- *设置监听事件
- */
- publicvoidsetItemOnClickListener(OnItemOnClickListeneronItemOnClickListener){
- this.mItemOnClickListener=onItemOnClickListener;
- }
- /**
- *@authoryangyu
- *功能描述:弹窗子类项按钮监听事件
- */
- publicstaticinterfaceOnItemOnClickListener{
- publicvoidonItemClick(ActionItemitem,intposition);
- }
- }
[java] view plain copy
- packagecom.yangyu.mytitlebar01;
- importandroid.app.Activity;
- importandroid.os.Bundle;
- importandroid.view.View;
- importandroid.view.View.OnClickListener;
- importandroid.view.ViewGroup.LayoutParams;
- importandroid.widget.ImageButton;
- /**
- *@authoryangyu
- *功能描述:第一种实现方式,PopupWindow实现方式
- */
- publicclassCustomTitleActivity01extendsActivity{
- //定义标题栏上的按钮
- privateImageButtontitleBtn;
- //定义标题栏弹窗按钮
- privateTitlePopuptitlePopup;
- @Override
- protectedvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_title);
- initView();
- initData();
- }
- /**
- *初始化组件
- */
- privatevoidinitView(){
- //实例化标题栏按钮并设置监听
- titleBtn=(ImageButton)findViewById(R.id.title_btn);
- titleBtn.setOnClickListener(newOnClickListener(){
- @Override
- publicvoidonClick(Viewv){
- titlePopup.show(v);
- }
- });
- //实例化标题栏弹窗
- titlePopup=newTitlePopup(this,LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
- }
- /**
- *初始化数据
- */
- privatevoidinitData(){
- //给标题栏弹窗添加子类
- titlePopup.addAction(newActionItem(this,"发起聊天",R.drawable.mm_title_btn_compose_normal));
- titlePopup.addAction(newActionItem(this,"听筒模式",R.drawable.mm_title_btn_receiver_normal));
- titlePopup.addAction(newActionItem(this,"登录网页",R.drawable.mm_title_btn_keyboard_normal));
- titlePopup.addAction(newActionItem(this,"扫一扫",R.drawable.mm_title_btn_qrcode_normal));
- }
- }
3.2 第二种实现方式(Activity)
第二种实现方式主要是通过再定义一个Activity来调用实现的,要想实现一个Activity点击按钮实现另一个Activity的弹窗
效果,就要在AndroidManifest.xml清单文件中注册一个新的Activity,然后给它调用系统的样式来实现这种效果。
[html] view plain copy
- <activity
- android:name="DialogActivity"
- android:theme="@android:style/Theme.Translucent.NoTitleBar">
- </activity>
1、定义另一个Activity布局文件,activity_dialog.xml:
[html] view plain copy
- <?xmlversion="1.0"encoding="UTF-8"?>
- <RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
- <RelativeLayout
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:layout_marginTop="50dp">
- <LinearLayout
- android:id="@+id/main_dialog_layout"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentRight="true"
- android:layout_alignParentTop="true"
- android:background="@drawable/title_function_bg"
- android:orientation="vertical">
- <LinearLayout
- android:id="@+id/llayout01"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_marginLeft="5dp"
- android:layout_marginRight="5dp"
- android:layout_marginTop="5dp"
- android:background="@drawable/title_list_selector">
- <ImageView
- android:id="@+id/imageView1"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:layout_marginLeft="8dp"
- android:src="@drawable/mm_title_btn_compose_normal"/>
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:padding="8dp"
- android:text="发起聊天"
- android:textColor="#fff"
- android:textSize="16sp"/>
- </LinearLayout>
- <ImageView
- android:id="@+id/imageView5"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:src="@drawable/mm_title_functionframe_line"/>
- <LinearLayout
- android:id="@+id/llayout02"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_marginLeft="5dp"
- android:layout_marginRight="5dp"
- android:background="@drawable/title_list_selector">
- <ImageView
- android:id="@+id/imageView2"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:layout_marginLeft="8dp"
- android:src="@drawable/mm_title_btn_receiver_normal"/>
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:padding="8dp"
- android:text="听筒模式"
- android:textColor="#fff"
- android:textSize="16sp"/>
- </LinearLayout>
- <ImageView
- android:id="@+id/imageView5"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:src="@drawable/mm_title_functionframe_line"/>
- <LinearLayout
- android:id="@+id/llayout03"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_marginLeft="5dp"
- android:layout_marginRight="5dp"
- android:background="@drawable/title_list_selector">
- <ImageView
- android:id="@+id/imageView3"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:layout_marginLeft="8dp"
- android:src="@drawable/mm_title_btn_keyboard_normal"/>
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:padding="8dp"
- android:text="登录网页"
- android:textColor="#fff"
- android:textSize="16sp"/>
- </LinearLayout>
- <ImageView
- android:id="@+id/imageView5"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:src="@drawable/mm_title_functionframe_line"/>
- <LinearLayout
- android:id="@+id/llayout04"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_marginBottom="3dp"
- android:layout_marginLeft="5dp"
- android:layout_marginRight="5dp"
- android:background="@drawable/title_list_selector">
- <ImageView
- android:id="@+id/imageView4"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:layout_marginLeft="8dp"
- android:src="@drawable/mm_title_btn_qrcode_normal"/>
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:padding="13dp"
- android:text="扫一扫"
- android:textColor="#fff"
- android:textSize="16sp"/>
- </LinearLayout>
- </LinearLayout>
- </RelativeLayout>
- </RelativeLayout>
[java] view plain copy
- packagecom.yangyu.mytitlebar01;
- importandroid.app.Activity;
- importandroid.os.Bundle;
- importandroid.view.MotionEvent;
- importandroid.view.View;
- importandroid.view.View.OnClickListener;
- importandroid.widget.LinearLayout;
- /**
- *@authoryangyu
- *功能描述:弹出Activity界面
- */
- publicclassDialogActivityextendsActivityimplementsOnClickListener{
- privateLinearLayoutlayout01,layout02,layout03,layout04;
- @Override
- protectedvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_dialog);
- initView();
- }
- /**
- *初始化组件
- */
- privatevoidinitView(){
- //得到布局组件对象并设置监听事件
- layout01=(LinearLayout)findViewById(R.id.llayout01);
- layout02=(LinearLayout)findViewById(R.id.llayout02);
- layout03=(LinearLayout)findViewById(R.id.llayout03);
- layout04=(LinearLayout)findViewById(R.id.llayout04);
- layout01.setOnClickListener(this);
- layout02.setOnClickListener(this);
- layout03.setOnClickListener(this);
- layout04.setOnClickListener(this);
- }
- @Override
- publicbooleanonTouchEvent(MotionEventevent){
- finish();
- returntrue;
- }
- @Override
- publicvoidonClick(Viewv){
- }
- }
[java] view plain copy
- packagecom.yangyu.mytitlebar01;
- importandroid.app.Activity;
- importandroid.content.Intent;
- importandroid.os.Bundle;
- importandroid.view.View;
- importandroid.view.View.OnClickListener;
- importandroid.widget.ImageButton;
- /**
- *@authoryangyu
- *功能描述:第二种实现方式,Activity实现方式
- */
- publicclassCustomTitleActivity02extendsActivity{
- //定义标题栏上的按钮
- privateImageButtontitleBtn;
- @Override
- protectedvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_title);
- initView();
- }
- /**
- *初始化组件
- */
- privatevoidinitView(){
- //实例化标题栏按钮并设置监听
- titleBtn=(ImageButton)findViewById(R.id.title_btn);
- titleBtn.setOnClickListener(newOnClickListener(){
- @Override
- publicvoidonClick(Viewv){
- startActivity(newIntent(CustomTitleActivity02.this,DialogActivity.class));
- }
- });
- }
- }
两种弹窗的实现方式基本上就讲完了,有什么问题可以跟博主留言。
源码下载地址
【Android UI设计与开发】第04期:引导界面(四)仿人人网V5.9.2最新版引导界面
分类:Android UI设计与开发 2013-05-29 11:06 3143人阅读 评论(13) 收藏 举报 仿人人 仿人人引导界面 android引导界面 android 界面设计转载请注明出处:http://blog.csdn.net/yangyu20121224/article/details/8988147
这一篇我将会以人人网的引导界面为实例来展开详细的讲解,人人网的引导界面比较的新颖,不同于其他应用程序千篇一律的靠滑动来引导用户,而是以一个一个比较生动形象的动画效果展示在用户们的面前,有一种给人眼前一亮的感觉,话不多说,进入正题。
一、实现的效果图
欢迎界面:
引导界面1
引导界面 2
引导界面 3
二 、项目的目录结构
三、具体的编码实现
1、欢迎界面的xml布局,activity_welcome:
[html] view plain copy
- <?xmlversion="1.0"encoding="utf-8"?>
- <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:background="@drawable/v5_6_2_welcome"
- android:orientation="vertical"/>
[html] view plain copy
- <?xmlversion="1.0"encoding="utf-8"?>
- <RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:orientation="vertical">
- <ImageView
- android:id="@+id/iv_guide_picture"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:layout_weight="1.0"
- android:scaleType="fitXY"/>
- <LinearLayout
- android:id="@+id/ll_bottom_action_bar"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_alignParentBottom="true"
- android:orientation="horizontal"
- android:padding="7dip">
- <Button
- android:id="@+id/btn_register"
- android:layout_width="fill_parent"
- android:layout_height="45dip"
- android:layout_weight="1.5"
- android:background="@drawable/guide_btn_blue"
- android:gravity="center"
- android:singleLine="true"
- android:text="注册"
- android:textColor="#FFFFFF"
- android:textSize="15.0sp"/>
- <Button
- android:id="@+id/btn_look_at_the_people_i_know"
- android:layout_width="fill_parent"
- android:layout_height="45dip"
- android:layout_marginLeft="8dip"
- android:layout_marginRight="8dip"
- android:layout_weight="1.0"
- android:background="@drawable/guide_btn_white"
- android:gravity="center"
- android:singleLine="true"
- android:text="看看我认识的人"
- android:textColor="#000000"
- android:textSize="15.0sp"/>
- <Button
- android:id="@+id/btn_login"
- android:layout_width="fill_parent"
- android:layout_height="45dip"
- android:layout_weight="1.5"
- android:background="@drawable/guide_btn_blue"
- android:gravity="center"
- android:singleLine="true"
- android:text="登录"
- android:textColor="#FFFFFF"
- android:textSize="15.0sp"/>
- </LinearLayout>
- </RelativeLayout>
[html] view plain copy
- <?xmlversion="1.0"encoding="utf-8"?>
- <selectorxmlns:android="http://schemas.android.com/apk/res/android">
- <itemandroid:drawable="@drawable/v5_0_1_guide_blue_default"android:state_focused="true"android:state_pressed="false"/>
- <itemandroid:drawable="@drawable/v5_0_1_guide_blue_press"android:state_pressed="true"/>
- <itemandroid:drawable="@drawable/v5_0_1_guide_blue_default"/>
- </selector>
[html] view plain copy
- <?xmlversion="1.0"encoding="utf-8"?>
- <selectorxmlns:android="http://schemas.android.com/apk/res/android">
- <itemandroid:drawable="@drawable/v5_0_1_guide_black_default"android:state_focused="true"android:state_pressed="false"/>
- <itemandroid:drawable="@drawable/v5_0_1_guide_black_press"android:state_pressed="true"/>
- <itemandroid:drawable="@drawable/v5_0_1_guide_black_default"/>
- </selector>
[html] view plain copy
- <?xmlversion="1.0"encoding="utf-8"?>
- <setxmlns:android="http://schemas.android.com/apk/res/android">
- <alphaandroid:fromAlpha="0.0"
- android:toAlpha="1.0"/>
- </set>
[html] view plain copy
- <?xmlversion="1.0"encoding="utf-8"?>
- <setxmlns:android="http://schemas.android.com/apk/res/android">
- <scale
- android:fillAfter="false"
- android:fromXScale="1.1"
- android:fromYScale="1.1"
- android:interpolator="@android:anim/decelerate_interpolator"
- android:pivotX="50.0%"
- android:pivotY="50.0%"
- android:toXScale="1.1"
- android:toYScale="1.1"/>
- <alpha
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:fromAlpha="1.0"
- android:toAlpha="0.0"/>
- </set>
- <?xmlversion="1.0"encoding="utf-8"?>
- <setxmlns:android="http://schemas.android.com/apk/res/android">
- <scale
- android:fillAfter="false"
- android:fromXScale="1.0"
- android:fromYScale="1.0"
- android:interpolator="@android:anim/decelerate_interpolator"
- android:pivotX="50.0%"
- android:pivotY="50.0%"
- android:toXScale="1.1"
- android:toYScale="1.1"/>
- </set>
[java] view plain copy
- packagecom.yangyu.myguideview03;
- importandroid.app.Activity;
- importandroid.content.Intent;
- importandroid.os.Bundle;
- importandroid.os.CountDownTimer;
- /**
- *@authoryangyu
- *功能描述:欢迎界面Activity(Logo)
- */
- publicclassWelcomeActivityextendsActivity{
- @Override
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_welcome);
- /**
- *millisInFuture:从开始调用start()到倒计时完成并onFinish()方法被调用的毫秒数
- *countDownInterval:接收onTick(long)回调的间隔时间
- */
- newCountDownTimer(5000,1000){
- @Override
- publicvoidonTick(longmillisUntilFinished){
- }
- @Override
- publicvoidonFinish(){
- Intentintent=newIntent(WelcomeActivity.this,GuideActivity.class);
- startActivity(intent);
- WelcomeActivity.this.finish();
- }
- }.start();
- }
- }
[java] view plain copy
- packagecom.yangyu.myguideview03;
- importandroid.app.Activity;
- importandroid.graphics.drawable.Drawable;
- importandroid.os.Bundle;
- importandroid.view.View;
- importandroid.view.View.OnClickListener;
- importandroid.view.animation.Animation;
- importandroid.view.animation.Animation.AnimationListener;
- importandroid.view.animation.AnimationUtils;
- importandroid.widget.Button;
- importandroid.widget.ImageView;
- importandroid.widget.Toast;
- /**
- *@authoryangyu
- *功能描述:导引界面(每张图片都执行的动画顺序,渐现、放大和渐隐,结束后切换图片和文字
- *又开始执行渐现、放大和渐隐,当最后一张执行完渐隐,切换到第一张,从而达到循环效果)
- */
- publicclassGuideActivityextendsActivityimplementsOnClickListener{
- //定义注册、登录和看看我认识的人按钮
- privateButtonbtnRegister,btnLogin,btnIKnowPeople;
- //显示图片的ImageView组件
- privateImageViewivGuidePicture;
- //要展示的一组图片资源
- privateDrawable[]pictures;
- //每张展示图片要执行的一组动画效果
- privateAnimation[]animations;
- //当前执行的是第几张图片(资源索引)
- privateintcurrentItem=0;
- @Override
- protectedvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_guide);
- initView();
- initData();
- }
- /**
- *初始化组件
- */
- privatevoidinitView(){
- //实例化ImageView引导图片
- ivGuidePicture=(ImageView)findViewById(R.id.iv_guide_picture);
- //实例化按钮
- btnRegister=(Button)findViewById(R.id.btn_register);
- btnIKnowPeople=(Button)findViewById(R.id.btn_look_at_the_people_i_know);
- btnLogin=(Button)findViewById(R.id.btn_login);
- //实例化引导图片数组
- pictures=newDrawable[]{getResources().getDrawable(R.drawable.v5_3_0_guide_pic1),getResources().getDrawable(R.drawable.v5_3_0_guide_pic2),
- getResources().getDrawable(R.drawable.v5_3_0_guide_pic3)};
- //实例化动画效果数组
- animations=newAnimation[]{AnimationUtils.loadAnimation(this,R.anim.guide_fade_in),
- AnimationUtils.loadAnimation(this,R.anim.guide_fade_in_scale),
- AnimationUtils.loadAnimation(this,R.anim.guide_fade_out)};
- }
- /**
- *初始化数据
- */
- privatevoidinitData(){
- //给按钮设置监听
- btnRegister.setOnClickListener(this);
- btnIKnowPeople.setOnClickListener(this);
- btnLogin.setOnClickListener(this);
- //给每个动画效果设置播放时间
- animations[0].setDuration(1500);
- animations[1].setDuration(3000);
- animations[2].setDuration(1500);
- //给每个动画效果设置监听事件
- animations[0].setAnimationListener(newGuideAnimationListener(0));
- animations[1].setAnimationListener(newGuideAnimationListener(1));
- animations[2].setAnimationListener(newGuideAnimationListener(2));
- //设置图片动画初始化默认值为0
- ivGuidePicture.setImageDrawable(pictures[currentItem]);
- ivGuidePicture.startAnimation(animations[0]);
- }
- /**
- *实现了动画监听接口,重写里面的方法
- */
- classGuideAnimationListenerimplementsAnimationListener{
- privateintindex;
- publicGuideAnimationListener(intindex){
- this.index=index;
- }
- @Override
- publicvoidonAnimationStart(Animationanimation){
- }
- //重写动画结束时的监听事件,实现了动画循环播放的效果
- @Override
- publicvoidonAnimationEnd(Animationanimation){
- if(index<(animations.length-1)){
- ivGuidePicture.startAnimation(animations[index+1]);
- }else{
- currentItem++;
- if(currentItem>(pictures.length-1)){
- currentItem=0;
- }
- ivGuidePicture.setImageDrawable(pictures[currentItem]);
- ivGuidePicture.startAnimation(animations[0]);
- }
- }
- @Override
- publicvoidonAnimationRepeat(Animationanimation){
- }
- }
- @Override
- publicvoidonClick(Viewv){
- switch(v.getId()){
- caseR.id.btn_register:
- Toast.makeText(this,"点击了注册按钮",Toast.LENGTH_SHORT).show();
- break;
- caseR.id.btn_look_at_the_people_i_know:
- Toast.makeText(this,"点击了我认识的人按钮",Toast.LENGTH_SHORT).show();
- break;
- caseR.id.btn_login:
- Toast.makeText(this,"点击了登录按钮",Toast.LENGTH_SHORT).show();
- break;
- default:
- break;
- }
- }
- }
源码下载地址
更多相关文章
- android操作XML的几种方式
- 超级清爽android计算器界面源码
- android 自定义toggle Button按钮
- android超炫button按钮动画效果
- Qt_Qtopia与Android的进程间通讯方式
- android 登陆界面
- Android 用手动组拼的方式生成xml
- android 滑动欢迎界面
- android 线程方式打印log到sd卡