【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 1488|回复: 0

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

[复制链接]
发表于 2013-1-15 17:22:44 | 显示全部楼层 |阅读模式

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

首先是开场闪屏的一个界面,使用handler控制该页面指定时间后进行跳转
                 

接着是主要的部分,也就是一系列的功能介绍图片,主要是viewpager来实现,嵌套在上面的小圆点的跟随导航也是要实现的效果之一
                               
  1. package com.example.weichat.UI;

  2. import java.util.ArrayList;
  3. import android.app.Activity;
  4. import android.content.Intent;
  5. import android.os.Bundle;
  6. import android.support.v4.view.PagerAdapter;
  7. import android.support.v4.view.ViewPager;
  8. import android.support.v4.view.ViewPager.OnPageChangeListener;
  9. import android.view.LayoutInflater;
  10. import android.view.View;
  11. import android.view.ViewGroup;
  12. import android.view.ViewGroup.LayoutParams;
  13. import android.view.Window;
  14. import android.widget.ImageView;
  15. import com.example.weichat.R;

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

  29.         @Override
  30.         protected void onCreate(Bundle savedInstanceState) {
  31.                 // TODO Auto-generated method stub
  32.                 super.onCreate(savedInstanceState);
  33.                 requestWindowFeature(Window.FEATURE_NO_TITLE);
  34.                 LayoutInflater inflater = getLayoutInflater();
  35.                 pageViews = new ArrayList<View>();
  36.                 pageViews.add(inflater.inflate(R.layout.viewpager01, null));
  37.                 pageViews.add(inflater.inflate(R.layout.viewpager02, null));
  38.                 pageViews.add(inflater.inflate(R.layout.viewpager03, null));
  39.                 pageViews.add(inflater.inflate(R.layout.viewpager04, null));
  40.                 pageViews.add(inflater.inflate(R.layout.viewpager05, null));
  41.                 pageViews.add(inflater.inflate(R.layout.viewpager06, null));

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

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

  48.                 // 添加小圆点导航的图片
  49.                 for (int i = 0; i < pageViews.size(); i++) {
  50.                         imageView = new ImageView(WhatsnewPagesA.this);
  51.                         imageView.setLayoutParams(new LayoutParams(20, 20));
  52.                         imageView.setPadding(5, 0, 5, 0);
  53.                         // 吧小圆点放进数组中
  54.                         imageViews[i] = imageView;
  55.                         // 默认选中的是第一张图片,此时第一个小圆点是选中状态,其他不是
  56.                         if (i == 0)
  57.                                 imageViews[i].setImageDrawable(getResources().getDrawable(
  58.                                                 R.drawable.page_indicator_focused));
  59.                         else
  60.                                 imageViews[i].setImageDrawable(getResources().getDrawable(
  61.                                                 R.drawable.page_indicator_unfocused));
  62.                         // 将imageviews添加到小圆点视图组
  63.                         viewPoints.addView(imageViews[i]);
  64.                 }

  65.                 setContentView(viewPictures);

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

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

  72.                 @Override
  73.                 public int getCount() {
  74.                         return pageViews.size();
  75.                 }

  76.                 @Override
  77.                 public boolean isViewFromObject(View arg0, Object arg1) {
  78.                         return arg0 == arg1;
  79.                 }

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

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

  91.         }

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

  94.                 @Override
  95.                 public void onPageScrollStateChanged(int arg0) {

  96.                 }

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

  99.                 }

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

  113.         }

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

  121. }
复制代码
而后的便是开门的动画效果了,这一块还是比较简单的,分别控制两幅图片的移动动画就可以实现
             
  1. package com.example.weichat.UI;

  2. import com.example.weichat.R;
  3. import android.app.Activity;
  4. import android.content.Intent;
  5. import android.os.Bundle;
  6. import android.os.Handler;
  7. import android.view.animation.Animation;
  8. import android.view.animation.AnimationSet;
  9. import android.view.animation.TranslateAnimation;
  10. import android.widget.ImageView;

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

  13.         private ImageView img_left, img_right;

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

  21.                 //创建一个AnimationSet对象
  22.                 AnimationSet animLeft = new AnimationSet(true);
  23.                 TranslateAnimation transLeft = new TranslateAnimation(
  24.                                 Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF,
  25.                                 -1f, Animation.RELATIVE_TO_SELF, 0f,
  26.                                 Animation.RELATIVE_TO_SELF, 0f);
  27.                 //设置动画效果持续的时间
  28.                 transLeft.setDuration(2000);
  29.                 //将anim对象添加到AnimationSet对象中
  30.                 animLeft.addAnimation(transLeft);
  31.                 animLeft.setFillAfter(true);
  32.                 img_left.startAnimation(transLeft);
  33.                 transLeft.startNow();
  34.                
  35.                
  36.                
  37.                 //创建一个AnimationSet对象
  38.                 AnimationSet animRight = new AnimationSet(true);
  39.                 TranslateAnimation transRight = new TranslateAnimation(
  40.                                 Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF,
  41.                                 1f, Animation.RELATIVE_TO_SELF, 0f,
  42.                                 Animation.RELATIVE_TO_SELF, 0f);
  43.                 //设置动画效果持续的时间
  44.                 transRight.setDuration(2000);
  45.                 //将anim对象添加到AnimationSet对象中
  46.                 animRight.addAnimation(transRight);
  47.                 animRight.setFillAfter(true);
  48.                 img_right.startAnimation(transRight);
  49.                 transRight.startNow();
  50.                
  51.                 new Handler().postDelayed(new Runnable() {
  52.                        
  53.                         @Override
  54.                         public void run() {
  55.                                 // TODO Auto-generated method stub
  56.                                 Intent intent = new Intent(WhatsnewAnimationA.this, FirstPageA.class);
  57.                                 startActivity(intent);
  58.                                 WhatsnewAnimationA.this.finish();
  59.                         }
  60.                 }, 1000);
  61.         }
  62.        

  63. }
复制代码
最后进入到我们的登陆界面,就是一个简单的微信登陆布局,代码就不贴了
                    

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2024-6-29 06:11

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表