Android仿QQ登陆

  今天根据腾讯qq,我们做一个练习,来学习如何制作一个漂亮的布局。首先看一下官方图片

  还是一个启动画面,之后进入登录页面,导航页面就不介绍了,大家可以参考微信的导航页面。首先程序进入SplashActivity,就是启动页面,Activity代码如下:
package com.example.imitateqq;

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

public class SplashActivity extends Activity {

     private Intent intent;
     @Override
     protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.splash);
          startMainAvtivity();
     }

     private void startMainAvtivity() {          
          new Handler().postDelayed(new Runnable() {
               public void run() {
                    intent=new Intent(SplashActivity.this,QQ.class);
                    startActivity(intent);
                    SplashActivity.this.finish();//结束本Activity
               }
          }, 1000);//设置执行时间
     }     
}
xml布局文件就是一个全屏的图片,要注意的是设置 android:scaleType ="matrix"这个属性。不然不会全屏
<? xml version= "1.0" encoding = "utf-8"?>
< LinearLayout xmlns:android ="http://schemas.android.com/apk/res/android"
    android:layout_width= "match_parent"
    android:layout_height= "match_parent"
    android:orientation= "vertical" >
    < ImageView
        android:layout_width ="match_parent"
        android:layout_height ="match_parent"
        android:scaleType ="matrix"
        android:src ="@drawable/splash" />
</ LinearLayout>
  过1秒之后转入登陆页面,从图片我们可以看出,腾讯的UI做的还是相当美观漂亮的,既简洁又不失美观。先分析一下这个登录界面,从整体可以看出,根布局的背景色是蓝色的,而那个QQ 2012 Android其实是一个图片背景色和根布局的背景色一样,这样就不会有视觉偏差。下面就是两个文本框EditText了,注意这里和官方给的不一样,因为后面有一个小箭头,当点击这个箭头时,会在第一个文本框的下面显示已经输入的qq号码,在qq号码的后面还有删除qq信息的按钮。这个地方需要注意一下。再往下就是登陆Button以及那连个“记住密码”和“注册新账号”比较简单,注意位置的安排即可。最后就是最下面的“更多登陆选项”,当点击的时候会向上弹出一些内容,其实就是一个隐藏的布局,当点击上面的时候,使下面隐藏的布局显示。当然也可以使用滑动抽屉来做,但是相对来说比较麻烦。下面看一下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"
    android:background= "@drawable/login_bg" >

    < ImageView
        android:id ="@+id/loginbutton"
        android:layout_width ="wrap_content"
        android:layout_height ="wrap_content"
        android:layout_centerHorizontal ="true"
        android:layout_marginTop ="50dp"
        android:src ="@drawable/login_pic" />

    <LinearLayout
        android:id ="@+id/input"
        android:layout_width ="fill_parent"
        android:layout_height ="wrap_content"
        android:layout_below ="@id/loginbutton"
        android:layout_marginLeft ="28.0dip"
        android:layout_marginRight ="28.0dip"
        android:background ="@drawable/login_input"
        android:orientation ="vertical" >

        < LinearLayout
            android:layout_width ="fill_parent"
            android:layout_height ="44.0dip"
            android:background ="@drawable/login_input"
            android:gravity ="center_vertical"
            android:orientation ="horizontal" >

            < EditText
                android:id ="@+id/searchEditText"
                android:layout_width ="0dp"
                android:layout_height ="fill_parent"
                android:layout_weight ="1"
                android:background ="@null"
                android:ems ="10"
                android:imeOptions ="actionDone"
                android:singleLine ="true"
                android:textSize ="16sp" >

                < requestFocus />
            </ EditText>

            < Button
                android:id ="@+id/button_clear"
                android:layout_width ="20dip"
                android:layout_height ="20dip"
                android:layout_marginRight ="8dip"
                android:background ="@drawable/login_input_arrow"
                android:visibility ="visible" />
        </ LinearLayout>

        < View
            android:layout_width ="fill_parent"
            android:layout_height ="1.0px"
            android:layout_marginLeft ="1.0px"
            android:layout_marginRight ="1.0px"
            android:background ="#ffc0c3c4" />

        < EditText
            android:id ="@+id/password"
            android:layout_width ="fill_parent"
            android:layout_height ="44.0dip"
            android:background ="#00ffffff"
            android:gravity ="center_vertical"
            android:inputType ="textPassword"
            android:maxLength ="16"
            android:maxLines ="1"
            android:textColor ="#ff1d1d1d"
            android:textColorHint ="#ff666666"
            android:textSize ="16.0sp" />
    </LinearLayout >

    <Button
        android:id ="@+id/buton1"
        android:layout_width ="270dp"
        android:background ="@drawable/chat_send_button_bg"
        android:paddingTop ="5.0dip"
        android:layout_height ="50dp"
        android:layout_marginLeft ="28.0dip"
        android:layout_marginRight ="28.0dip"
        android:layout_marginTop ="12.0dip"
        android:layout_below ="@+id/input"
        android:gravity ="center"
        android:textSize ="20dp"
        android:text = "登录" />

    <RelativeLayout
        android:id ="@+id/relative"
        android:layout_width ="fill_parent"
        android:layout_height ="wrap_content"
        android:layout_alignLeft ="@+id/input"
        android:layout_alignRight ="@+id/input"
        android:layout_below ="@id/buton1" >

         < CheckBox
            android:id ="@+id/auto_save_password"
            android:layout_width ="wrap_content"
            android:layout_height ="wrap_content"
            android:layout_alignParentLeft ="true"
            android:background ="@null"
            android:button ="@null"
            android:checked ="true"
            android:drawableLeft ="@drawable/checkbox_bg1"
            android:drawablePadding ="4.0dip"
            android:text = "记住密码"
            android:textColor ="#ffffffff"
            android:textSize ="12.0sp" />

        < Button
            android:id ="@+id/regist"
            android:layout_width ="wrap_content"
            android:layout_height ="wrap_content"
            android:layout_alignParentRight ="true"
            android:background ="@drawable/login_reg_normal"
            android:clickable ="true"
            android:gravity ="left|center"
            android:paddingLeft ="8.0dip"
            android:paddingRight ="18.0dip"
            android:text = "注册新账号"
            android:textColor ="#ffffffff"
            android:textSize ="12.0sp" />
    </RelativeLayout >

    <LinearLayout
        android:id ="@+id/more_bottom"
        android:layout_width ="fill_parent"
        android:layout_height ="wrap_content"
        android:layout_alignParentBottom ="true"
        android:background ="@drawable/login_moremenu_back"
        android:orientation ="vertical" >
       
    <RelativeLayout
        android:id ="@+id/input2"
        android:layout_width ="fill_parent"
        android:layout_height ="40dp"
        android:background ="@drawable/login_moremenu_back"
        android:orientation ="vertical" >

        < ImageView
                android:id ="@+id/more_image"
                android:layout_width ="wrap_content"
                android:layout_height ="wrap_content"
                android:layout_centerVertical ="true"
                android:layout_marginRight ="5.0dip"
                android:layout_toLeftOf ="@+id/more_text"
                android:clickable ="false"
                android:src ="@drawable/login_more_up" />
       
        < TextView
            android:id ="@+id/more_text"
            android:layout_width ="wrap_content"
            android:layout_height ="wrap_content"
            android:layout_centerInParent ="true"
            android:background ="@null"
            android:gravity ="center"
            android:maxLines ="1"
            android:text = "更多登陆选项"
            android:textColor ="#ffc6e6f9"
            android:textSize ="14.0sp" />
    </RelativeLayout >
     <LinearLayout
            android:id ="@+id/morehidebottom"
            android:layout_width ="fill_parent"
            android:layout_height ="wrap_content"
            android:orientation ="vertical"
            android:visibility ="gone" >

            < View
                android:layout_width ="fill_parent"
                android:layout_height ="1.0px"
                android:background ="#ff005484" />

            < View
                android:layout_width ="fill_parent"
                android:layout_height ="1.0px"
                android:background ="#ff0883cb" />

            < LinearLayout
                android:layout_width ="fill_parent"
                android:layout_height ="wrap_content"
                android:layout_marginLeft ="30.0dip"
                android:layout_marginRight ="30.0dip"
                android:layout_marginTop ="12.0dip"
                android:orientation ="horizontal" >

                < CheckBox
                    android:id ="@+id/hide_login"
                    android:layout_width ="1.0px"
                    android:layout_height ="wrap_content"
                    android:layout_weight ="2.0"
                    android:background ="@null"
                    android:button ="@null"
                    android:checked ="false"
                    android:drawableLeft ="@drawable/checkbox_bg1"
                    android:drawablePadding ="4.0dip"
                    android:text = "隐身登陆"
                    android:textColor ="#ffc6e6f9"
                    android:textSize ="12.0sp" />

                < CheckBox
                    android:id ="@+id/silence_login"
                    android:layout_width ="1.0px"
                    android:layout_height ="wrap_content"
                    android:layout_weight ="1.0"
                    android:background ="@null"
                    android:button ="@null"
                    android:checked ="false"
                    android:drawableLeft ="@drawable/checkbox_bg1"
                    android:drawablePadding ="4.0dip"
                    android:text = "静音登录"
                    android:textColor ="#ffc6e6f9"
                    android:textSize ="12.0sp" />
            </ LinearLayout>

            < LinearLayout
                android:layout_width ="fill_parent"
                android:layout_height ="wrap_content"
                android:layout_marginBottom ="18.0dip"
                android:layout_marginLeft ="30.0dip"
                android:layout_marginRight ="30.0dip"
                android:layout_marginTop ="18.0dip"
                android:orientation ="horizontal" >

                < CheckBox
                    android:id ="@+id/accept_accounts"
                    android:layout_width ="1.0px"
                    android:layout_height ="wrap_content"
                    android:layout_weight ="2.0"
                    android:background ="@null"
                    android:button ="@null"
                    android:checked ="true"
                    android:drawableLeft ="@drawable/checkbox_bg1"
                    android:drawablePadding ="4.0dip"
                    android:singleLine ="true"
                    android:text = "允许手机/电脑同时在心线"
                    android:textColor ="#ffc6e6f9"
                    android:textSize ="12.0sp" />

                < CheckBox
                    android:id ="@+id/accept_troopmsg"
                    android:layout_width ="1.0px"
                    android:layout_height ="wrap_content"
                    android:layout_weight ="1.0"
                    android:background ="@null"
                    android:button ="@null"
                    android:checked ="true"
                    android:drawableLeft ="@drawable/checkbox_bg1"
                    android:drawablePadding ="4.0dip"
                    android:text = "接受群消息"
                    android:textColor ="#ffc6e6f9"
                    android:textSize ="12.0sp" />
            </ LinearLayout>
        </ LinearLayout>
   
    </LinearLayout >

</ RelativeLayout>
 各个组件的使用没有问题,关键是如何设置他们的属性,来获得一个比较美观的效果,大家可以参考这个例子,来做一下练习,来强化UI的设计。从这个例子中就可以学到很多东西,比如ViwGroup的使用(如何枪套), background的设置,例如同时使用两个Edittext,设置 android:background  = "@null"设置为空的时候就不会产生间隔了。这个要自己多做设计,时间长了就会有感悟了。最后看一下MainActivity的代码,布局简单
package com.example.imitateqq;

import android.os.Bundle;
import android.app.Activity;
import android.app.Dialog;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;

public class QQ extends Activity implements OnClickListener{

     private Button login_Button;
     private View moreHideBottomView,input2;
     private ImageView more_imageView;
     private boolean mShowBottom = false;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_qq);
        initView();
    }

    private void initView() {
         login_Button=(Button) findViewById(R.id.buton1);
         login_Button.setOnClickListener(this);
         
         moreHideBottomView=findViewById(R.id.morehidebottom);
         more_imageView=(ImageView) findViewById(R.id.more_image);
         
         input2=findViewById(R.id.input2);
         input2.setOnClickListener( this);
     }

    public void showBottom(boolean bShow){
         if(bShow){
              moreHideBottomView.setVisibility(View.GONE);
              more_imageView.setImageResource(R.drawable.login_more_up);
              mShowBottom = true;
         }else{
              moreHideBottomView.setVisibility(View.VISIBLE);
              more_imageView.setImageResource(R.drawable.login_more);
              mShowBottom = false;
         }
    }
    
    public void onClick(View v) {     
          switch(v.getId())
          {
          case R.id.input2:
               showBottom(!mShowBottom);
               break;
          case R.id.buton1:
               showRequestDialog();
               break;
               default:
                    break;
          }
     }
    
     private Dialog mDialog = null;
     private void showRequestDialog()
     {
          if (mDialog != null)
          {
               mDialog.dismiss();
               mDialog = null;
          }
          mDialog = DialogFactory.creatRequestDialog(this, "正在验证账号...");
          mDialog.show();
     }
     
     @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_qq, menu);
        return true;
    }
}
最后效果如下:

  总结:本文可以作为一个UI练习Demo,大家可以自己独立去写,有问题的可以留下邮箱我给你发一下源码作为参考。下一篇将写主页面的实现,欢迎大家关注。
  • 30
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 153
    评论
评论 153
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值