相信大家对于微信等社交应用的UI界面已经都很熟悉了,该UI最值得借鉴的莫过于第一次使用的时候一些列产品介绍的图片,可以左右滑动浏览,最后 进入应用,这一效果适用于多种项目中,相信今后开发应用一定会用得到。网路上也有不少这样的例子可以参考,不过看别人的代码是一回事,自己实际做起来又是 另一回事,今天的这个微信的Demo是研究过多个类似的界面后自己动手去实现的效果,并且都加上了详细的注释(虽然有的多余),方便以后回顾一看就能看明 白,只有真正亲自写一写,体会才会更深刻,例子中的图片都是在微信的APK中提取出来的,涉及到的知识点无外乎是ViewPager和 Animation。
首先是开场闪屏的一个界面,使用handler控制该页面指定时间后进行跳转

[mw_shl_code=java,true]package com.example.weichat.UI;

import com.example.weichat.R;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;

/** 开场欢迎动画 */
public class WelcomeA extends Activity {
        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.strat);
                //延迟两秒后执行run方法中的页面跳转
                new Handler().postDelayed(new Runnable() {

@Override
                        public void run() {
                                Intent intent = new Intent(WelcomeA.this, WhatsnewPagesA.class);
                                startActivity(intent);
                                WelcomeA.this.finish();
                        }
                }, 2000);
        [/mw_shl_code]
接着是主要的部分,也就是一系列的功能介绍图片,主要是viewpager来实现,嵌套在上面的小圆点的跟随导航也是要实现的效果之一

[mw_shl_code=java,true]package com.example.weichat.UI;

import java.util.ArrayList;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.view.Window;
import android.widget.ImageView;
import com.example.weichat.R;

/** What's new 的导航界面 */
public class WhatsnewPagesA extends Activity {
        /** Viewpager对象 */
        private ViewPager viewPager;
        private ImageView imageView;
        /** 创建一个数组,用来存放每个页面要显示的View */
        private ArrayList<View> pageViews;
        /** 创建一个imageview类型的数组,用来表示导航小圆点 */
        private ImageView[] imageViews;
        /** 装显示图片的viewgroup */
        private ViewGroup viewPictures;
        /** 导航小圆点的viewgroup */
        private ViewGroup viewPoints;

@Override
        protected void onCreate(Bundle savedInstanceState) {
                // TODO Auto-generated method stub
                super.onCreate(savedInstanceState);
                requestWindowFeature(Window.FEATURE_NO_TITLE);
                LayoutInflater inflater = getLayoutInflater();
                pageViews = new ArrayList<View>();
                pageViews.add(inflater.inflate(R.layout.viewpager01, null));
                pageViews.add(inflater.inflate(R.layout.viewpager02, null));
                pageViews.add(inflater.inflate(R.layout.viewpager03, null));
                pageViews.add(inflater.inflate(R.layout.viewpager04, null));
                pageViews.add(inflater.inflate(R.layout.viewpager05, null));
                pageViews.add(inflater.inflate(R.layout.viewpager06, null));

// 小圆点数组,大小是图片的个数
                imageViews = new ImageView[pageViews.size()];
                // 从指定的XML文件中加载视图
                viewPictures = (ViewGroup) inflater.inflate(R.layout.viewpagers, null);

viewPager = (ViewPager) viewPictures.findViewById(R.id.guidePagers);
                viewPoints = (ViewGroup) viewPictures.findViewById(R.id.viewPoints);

// 添加小圆点导航的图片
                for (int i = 0; i < pageViews.size(); i++) {
                        imageView = new ImageView(WhatsnewPagesA.this);
                        imageView.setLayoutParams(new LayoutParams(20, 20));
                        imageView.setPadding(5, 0, 5, 0);
                        // 吧小圆点放进数组中
                        imageViews = imageView;
                        // 默认选中的是第一张图片,此时第一个小圆点是选中状态,其他不是
                        if (i == 0)
                                imageViews.setImageDrawable(getResources().getDrawable(
                                                R.drawable.page_indicator_focused));
                        else
                                imageViews.setImageDrawable(getResources().getDrawable(
                                                R.drawable.page_indicator_unfocused));
                        // 将imageviews添加到小圆点视图组
                        viewPoints.addView(imageViews);
                }

setContentView(viewPictures);

viewPager.setAdapter(new NavigationPageAdapter());
                // 为viewpager添加监听,当view发生变化时的响应
                viewPager.setOnPageChangeListener(new NavigationPageChangeListener());
        }

// 导航图片view的适配器,必须要实现的是下面四个方法
        class NavigationPageAdapter extends PagerAdapter {

@Override
                public int getCount() {
                        return pageViews.size();
                }

@Override
                public boolean isViewFromObject(View arg0, Object arg1) {
                        return arg0 == arg1;
                }

// 初始化每个Item
                @Override
                public Object instantiateItem(View container, int position) {
                        ((ViewPager) container).addView(pageViews.get(position));
                        return pageViews.get(position);
                }

// 销毁每个Item
                @Override
                public void destroyItem(View container, int position, Object object) {
                        ((ViewPager) container).removeView(pageViews.get(position));
                }

}

// viewpager的监听器,主要是onPageSelected要实现
        class NavigationPageChangeListener implements OnPageChangeListener {

@Override
                public void onPageScrollStateChanged(int arg0) {

}

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

}

@Override
                public void onPageSelected(int position) {
                        // 循环主要是控制导航中每个小圆点的状态
                        for (int i = 0; i < imageViews.length; i++) {
                                // 当前view下设置小圆点为选中状态
                                imageViews.setImageDrawable(getResources().getDrawable(
                                                R.drawable.page_indicator_focused));
                                // 其余设置为飞选中状态
                                if (position != i)
                                        imageViews.setImageDrawable(getResources().getDrawable(
                                                        R.drawable.page_indicator_unfocused));
                        }
                }

}

// 开始按钮方法,开始按钮在XML文件中onClick属性设置;
        // 我试图把按钮在本activity中实例化并设置点击监听,但总是报错,使用这个方法后没有报错,原因没找到
        public void startbutton(View v) {
                Intent intent = new Intent(WhatsnewPagesA.this, WhatsnewAnimationA.class);
                startActivity(intent);
                WhatsnewPagesA.this.finish();
        }

}
[/mw_shl_code]
而后的便是开门的动画效果了,这一块还是比较简单的,分别控制两幅图片的移动动画就可以实现

[mw_shl_code=java,true]package com.example.weichat.UI;

import com.example.weichat.R;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
import android.view.animation.TranslateAnimation;
import android.widget.ImageView;

/**导航过后的动画效果界面*/
public class WhatsnewAnimationA extends Activity {

private ImageView img_left, img_right;

@Override
        protected void onCreate(Bundle savedInstanceState) {
                // TODO Auto-generated method stub
                super.onCreate(savedInstanceState);
                setContentView(R.layout.whatnew_animation);
                img_left = (ImageView) findViewById(R.id.doorpage_left);
                img_right = (ImageView) findViewById(R.id.doorpage_right);

//创建一个AnimationSet对象
                AnimationSet animLeft = new AnimationSet(true);
                TranslateAnimation transLeft = new TranslateAnimation(
                                Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF,
                                -1f, Animation.RELATIVE_TO_SELF, 0f,
                                Animation.RELATIVE_TO_SELF, 0f);
                //设置动画效果持续的时间
                transLeft.setDuration(2000);
                //将anim对象添加到AnimationSet对象中
                animLeft.addAnimation(transLeft);
                animLeft.setFillAfter(true);
                img_left.startAnimation(transLeft);
                transLeft.startNow();
               
               
               
                //创建一个AnimationSet对象
                AnimationSet animRight = new AnimationSet(true);
                TranslateAnimation transRight = new TranslateAnimation(
                                Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF,
                                1f, Animation.RELATIVE_TO_SELF, 0f,
                                Animation.RELATIVE_TO_SELF, 0f);
                //设置动画效果持续的时间
                transRight.setDuration(2000);
                //将anim对象添加到AnimationSet对象中
                animRight.addAnimation(transRight);
                animRight.setFillAfter(true);
                img_right.startAnimation(transRight);
                transRight.startNow();
               
                new Handler().postDelayed(new Runnable() {
                       
                        @Override
                        public void run() {
                                // TODO Auto-generated method stub
                                Intent intent = new Intent(WhatsnewAnimationA.this, FirstPageA.class);
                                startActivity(intent);
                                WhatsnewAnimationA.this.finish();
                        }
                }, 1000);
        }

}
[/mw_shl_code]
最后进入到我们的登陆界面,就是一个简单的微信登陆布局,代码就不贴了

OK了,以上就是微信第一次使用的时候开场功能介绍和动画,比较使用,适用于为自己发布新产品的时候作为导航简介,大家可以根据具体要求具体设计,不过大致思路都是这样的。

Android仿QQ微信开场导航以及登陆界面的更多相关文章

  1. Android 仿QQ微信开场导航以及登陆界面

    相信大家对于微信等社交应用的UI界面已经都很熟悉了,该UI最值得借鉴的莫过于第一次使用的时候一些列产品介绍的图片,可以左右滑动浏览,最后进入应 用,这一效果适用于多种项目中,相信今后开发应用一定会用得 ...

  2. android 仿QQ手机版

    千人2群开启,欢迎大家围观打酱油,群号145667827     您当前位置 : JavaApk-安卓应用游戏源码服务专家 » QQ » Android项目源码界面超级华丽的仿QQ最新版本 Andro ...

  3. Android仿QQ ios dialog,仿QQ退出向上菜单

    Android仿QQ ios dialog,仿QQ退出向上菜单 EasyDialog两种模式 仿QQ退出向上菜单,自己定义向上菜单              github地址:https://gith ...

  4. Android 仿QQ首页的消息和电话的切换,首页的头部(完全用布局控制)

    Android 仿QQ首页的消息和电话的切换,首页的头部(完全用布局控制) 首先贴上七个控制布局代码 1.title_text_sel.xml 字体颜色的切换 放到color文件夹下面 <?xm ...

  5. Oauth2.0 QQ&微信&微博实现第三方登陆

    一.写在前面 目前对于大多数的App或Web网站都支持有第三方登陆这个功能,用户可使用 QQ/ 微信/ 微博 帐号快速登录你的网站,降低注册门槛,为你的网站带来海量新用户.最近在新项目上刚好用到了,在 ...

  6. Android仿QQ登录下拉历史列表

    demo中包含了Sqlite数据库增删改查,对存储的账号进行按照最新的时间排序,限制了最多存储5条数据. 效果图: 1.首先创建MyHelper建表: public class MyHelper ex ...

  7. android仿qq空间、微信朋友圈图片展示

    废话不多说,先上效果图 由于近期须要做朋友圈功能,所以在此记录一下,事实上非常多人不明确的一点应该是在图片的排列上面吧,不规则的排列,事实上非常easy的.就是一个GridView.然而你xml光光写 ...

  8. [转]ANDROID仿IOS微信滑动删除_SWIPELISTVIEW左滑删除例子

    转载:http://dwtedx.sinaapp.com/itshare_290.html 本例子实现了滑动删除ListView的Itemdemo的效果.大家都知道.这种创意是来源于IOS的.左滑删除 ...

  9. Android仿QQ窗口的抖动的动画效果

    就是仿照QQ窗口的抖动效果,在项目的res下创建anim文件夹,再创建两个xml文件:cycle.xml  . myanim.xml   cycle.xml  :   <?xml version ...

随机推荐

  1. npm的.npmrc文件在哪里?缓存及全局包文件在什么位置?

    npm的.npmrc文件在哪里?缓存及全局包文件在什么位置?   npm作为node开发过程中的必备工具,长期使用之后,您可能会想:这些全局安装的node包都放在硬盘里面的哪个地方?配置文件.npmr ...

  2. http协议基础(七)通用首部字段

    通用首部字段的意思,就是:请求和响应报文双方都会使用的首部 1.Cache-Control 通过指定它的指令,能操作缓存的工作机制 指令参数是可选的,多个指令通过“,”分隔 Cache-Control ...

  3. Problem B. Full Binary Tree

    题目 链接:http://code.google.com/codejam/contest/2984486/dashboard#s=p1 googlde code jam 2014 Round1A 解题 ...

  4. yii2常用的migrate命令

    开发中经常会用到的方法小结: 1../yii migrate xxx_xx 在表中插入某字段 : public function up() {$this->addColumn('{{applic ...

  5. python 换行符的识别问题,Unix 和Windows 中是不一样的

    关于换行符的识别问题,在Unix 和Windows 中是不一样的(分别是n 和rn).默认情况下,Python 会以统一模式处理换行符.这种模式下,在读取文本的时候,Python 可以识别所有的普通换 ...

  6. Ignite缓存大小管理

    Ignite使用计算机内存存储缓存数据,达到提升缓存读写性能的.但是计算机内存往往是有限的,我们必须合理管理Ignite对内存的使用. Ignite可以使用JVM堆外内存和堆内内存.使用堆外内存基本上 ...

  7. MockWebServer--环境

    MockWebServer是一个可脚本化的用于测试HTTP客户端的Web服务器.主要用于测试你的应用在进行HTTP.HTTPS请求时是否按照预期的行为动作.使用该工具,你可以验证应用的请求是否符合预期 ...

  8. bzoj1660 / P2866 [USACO06NOV]糟糕的一天Bad Hair Day

    P2866 [USACO06NOV]糟糕的一天Bad Hair Day 奶牛题里好多单调栈..... 维护一个单调递减栈,存每只牛的高度和位置,顺便统计一下答案. #include<iostre ...

  9. CF#338D. GCD Table

    传送门 简单的中国剩余定理练习. 首先行数一定是$lcm$,然后只要确定最小的列数就能判定解合不合法了. 我们可以得到线性模方程组: $y \equiv 0 \pmod{a_1}$ $y+1 \equ ...

  10. 20145324王嘉澜《网络对抗技术》Web基础

    实践要求 ①Web前端HTML: 能正常安装.启停Apache.理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML ②Web前端javascipt: 理解JavaScript ...