java比较炫的登录界面_教你写一个炫酷的Material Design 风格的登录和注册页面

每个人都会喜欢漂亮的登录界面,一个App 给人们的第一印象是非常重要的。

这篇文章将教你使用谷歌材料设计规范(Material design spec )和谷歌的新的设计支持库( design support library)来创建一个炫酷的登录和注册界面。设计支持库实现了材料设计规范的一部分,它包含了一部分炫酷的UI 部件,让你的Android 应用给人一种优雅的感觉。

对事物的设计和布局方面,如何做到让人感觉到屏幕上的内容是赏心悦目的,这里是我们要权衡的重点,我们会在顶部状态栏添加精细的触摸事件,并使用设计支持库的floating labels (实现自TextInputLayout)。

几乎所有的事情都都已经照顾到你。

完整的代码和样例托管在Github

当接口锁定时,防止后退按钮显示在登录Activity 上。

自定义 ProgressDialog来显示加载的状态。

符合材料设计规范。

悬浮标签(floating labels)(来自设计支持库)

用户表单输入校验

自定义状态栏样式

在每一个Activity 测试模仿验证的方法。

剩下的就是实现自己的身份验证逻辑。

登录Activity

让我们来设置登录Activity,通常是开始你的应用程序,会显示给用户的第一个要启动的Activity。

65e7d23d60a4b0aab7f778aae3cb8254.png

如果你想要添加社交登录按钮,请继续,但是当前在这个文章范围内,只给你基本的代码,让你有一个坚固的起点去构建你的验证流程。

需要注意的是 onBackPressed 方法将会被重写,这样将会防止用户关闭登录Activity。

LoginActivity.java

package com.sourcey.materiallogindemo;

import android.app.ProgressDialog;

import android.os.Bundle;

import android.support.v7.app.AppCompatActivity;

import android.util.Log;

import android.content.Intent;

import android.view.View;

import android.widget.Button;

import android.widget.EditText;

import android.widget.TextView;

import android.widget.Toast;

import butterknife.ButterKnife;

import butterknife.InjectView;

public class LoginActivity extends AppCompatActivity {

private static final String TAG = "LoginActivity";

private static final int REQUEST_SIGNUP = 0;

@Bind(R.id.input_email) EditText _emailText;

@Bind(R.id.input_password) EditText _passwordText;

@Bind(R.id.btn_login) Button _loginButton;

@Bind(R.id.link_signup) TextView _signupLink;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_login);

ButterKnife.inject(this);

_loginButton.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

login();

}

});

_signupLink.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

// Start the Signup activity

Intent intent = new Intent(getApplicationContext(), SignupActivity.class);

startActivityForResult(intent, REQUEST_SIGNUP);

}

});

}

public void login() {

Log.d(TAG, "Login");

if (!validate()) {

onLoginFailed();

return;

}

_loginButton.setEnabled(false);

final ProgressDialog progressDialog = new ProgressDialog(LoginActivity.this,

R.style.AppTheme_Dark_Dialog);

progressDialog.setIndeterminate(true);

progressDialog.setMessage("Authenticating...");

progressDialog.show();

String email = _emailText.getText().toString();

String password = _passwordText.getText().toString();

// TODO: Implement your own authentication logic here.

new android.os.Handler().postDelayed(

new Runnable() {

public void run() {

// On complete call either onLoginSuccess or onLoginFailed

onLoginSuccess();

// onLoginFailed();

progressDialog.dismiss();

}

}, 3000);

}

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

if (requestCode == REQUEST_SIGNUP) {

if (resultCode == RESULT_OK) {

// TODO: Implement successful signup logic here

// By default we just finish the Activity and log them in automatically

this.finish();

}

}

}

@Override

public void onBackPressed() {

// disable going back to the MainActivity

moveTaskToBack(true);

}

public void onLoginSuccess() {

_loginButton.setEnabled(true);

finish();

}

public void onLoginFailed() {

Toast.makeText(getBaseContext(), "Login failed", Toast.LENGTH_LONG).show();

_loginButton.setEnabled(true);

}

public boolean validate() {

boolean valid = true;

String email = _emailText.getText().toString();

String password = _passwordText.getText().toString();

if (email.isEmpty() || !android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches()) {

_emailText.setError("enter a valid email address");

valid = false;

} else {

_emailText.setError(null);

}

if (password.isEmpty() || password.length() < 4 || password.length() > 10) {

_passwordText.setError("between 4 and 10 alphanumeric characters");

valid = false;

} else {

_passwordText.setError(null);

}

return valid;

}

}

res/layout/activity_login.xml

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:fitsSystemWindows="true">

android:orientation="vertical"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:paddingTop="56dp"

android:paddingLeft="24dp"

android:paddingRight="24dp">

android:layout_width="wrap_content"

android:layout_height="72dp"

android:layout_marginBottom="24dp"

android:layout_gravity="center_horizontal" />

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_marginTop="8dp"

android:layout_marginBottom="8dp">

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:inputType="textEmailAddress"

android:hint="Email" />

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_marginTop="8dp"

android:layout_marginBottom="8dp">

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:inputType="textPassword"

android:hint="Password"/>

android:id="@+id/btn_login"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:layout_marginTop="24dp"

android:layout_marginBottom="24dp"

android:padding="12dp"

android:text="Login"/>

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:layout_marginBottom="24dp"

android:text="No account yet? Create one"

android:gravity="center"

android:textSize="16dip"/>

注册 Activity

需要注意的是当用户注册成功时我们会设置一个RESULT_OK 的结果值,这个结果将会在登录Activity 中的 onActivityResult 方法中调用,并且确定注册成功是如何处理的。当前逻辑是很简单的,当用户注册成功时我们会马上做一个记录。当然你想要实现邮箱验证,你需要自己来实现。

SignupActivity.java

package com.sourcey.materiallogindemo;

import android.app.ProgressDialog;

import android.os.Bundle;

import android.support.v7.app.AppCompatActivity;

import android.util.Log;

import android.view.View;

import android.widget.Button;

import android.widget.EditText;

import android.widget.TextView;

import android.widget.Toast;

import butterknife.ButterKnife;

import butterknife.InjectView;

public class SignupActivity extends AppCompatActivity {

private static final String TAG = "SignupActivity";

@Bind(R.id.input_name) EditText _nameText;

@Bind(R.id.input_email) EditText _emailText;

@Bind(R.id.input_password) EditText _passwordText;

@Bind(R.id.btn_signup) Button _signupButton;

@Bind(R.id.link_login) TextView _loginLink;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_signup);

ButterKnife.inject(this);

_signupButton.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

signup();

}

});

_loginLink.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

// Finish the registration screen and return to the Login activity

finish();

}

});

}

public void signup() {

Log.d(TAG, "Signup");

if (!validate()) {

onSignupFailed();

return;

}

_signupButton.setEnabled(false);

final ProgressDialog progressDialog = new ProgressDialog(SignupActivity.this,

R.style.AppTheme_Dark_Dialog);

progressDialog.setIndeterminate(true);

progressDialog.setMessage("Creating Account...");

progressDialog.show();

String name = _nameText.getText().toString();

String email = _emailText.getText().toString();

String password = _passwordText.getText().toString();

// TODO: Implement your own signup logic here.

new android.os.Handler().postDelayed(

new Runnable() {

public void run() {

// On complete call either onSignupSuccess or onSignupFailed

// depending on success

onSignupSuccess();

// onSignupFailed();

progressDialog.dismiss();

}

}, 3000);

}

public void onSignupSuccess() {

_signupButton.setEnabled(true);

setResult(RESULT_OK, null);

finish();

}

public void onSignupFailed() {

Toast.makeText(getBaseContext(), "Login failed", Toast.LENGTH_LONG).show();

_signupButton.setEnabled(true);

}

public boolean validate() {

boolean valid = true;

String name = _nameText.getText().toString();

String email = _emailText.getText().toString();

String password = _passwordText.getText().toString();

if (name.isEmpty() || name.length() < 3) {

_nameText.setError("at least 3 characters");

valid = false;

} else {

_nameText.setError(null);

}

if (email.isEmpty() || !android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches()) {

_emailText.setError("enter a valid email address");

valid = false;

} else {

_emailText.setError(null);

}

if (password.isEmpty() || password.length() < 4 || password.length() > 10) {

_passwordText.setError("between 4 and 10 alphanumeric characters");

valid = false;

} else {

_passwordText.setError(null);

}

return valid;

}

}

res/layout/activity_signup.xml

xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:fitsSystemWindows="true">

android:orientation="vertical"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:paddingTop="56dp"

android:paddingLeft="24dp"

android:paddingRight="24dp">

android:layout_width="wrap_content"

android:layout_height="72dp"

android:layout_marginBottom="24dp"

android:layout_gravity="center_horizontal" />

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_marginTop="8dp"

android:layout_marginBottom="8dp">

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:inputType="textCapWords"

android:hint="Name" />

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_marginTop="8dp"

android:layout_marginBottom="8dp">

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:inputType="textEmailAddress"

android:hint="Email" />

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_marginTop="8dp"

android:layout_marginBottom="8dp">

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:inputType="textPassword"

android:hint="Password"/>

android:id="@+id/btn_signup"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:layout_marginTop="24dp"

android:layout_marginBottom="24dp"

android:padding="12dp"

android:text="Create Account"/>

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:layout_marginBottom="24dp"

android:text="Already a member? Login"

android:gravity="center"

android:textSize="16dip"/>

配置

为了让程序一切正常工作,我们在需要在 app 目录下的 build.gradle 中添加一些依赖,ButterKnife 是可选的,当然我们更喜欢用它让我们的Java 代码更加整洁一些。

dependencies {

compile fileTree(dir: 'libs', include: ['*.jar'])

compile 'com.android.support:appcompat-v7:22.2.0'

compile 'com.android.support:design:22.2.0'

compile 'com.jakewharton:butterknife:7.0.1'

}

还有一个我们必须要在AndroidManifest 中添加声明Activity。我已经把AndroidManifest 清晰完整的代码贴了出来。

package="com.sourcey.materiallogindemo" >

android:allowBackup="true"

android:icon="@mipmap/ic_launcher"

android:label="@string/app_name"

android:theme="@style/AppTheme" >

android:name=".MainActivity"

android:label="@string/app_name" >

希望这篇文章对你是有帮助的,如果这篇文章真的节约你宝贵的开发时间,请给我留言。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 我可以为你提供一个满足material design设计风格的文件上传控件,它可以帮助你在网页上快速、便捷地上传文件。它具有简洁明了的界面,支持本地文件上传,也可以从网络上轻松访问文件。同时,它也允许用户对上传文件进行预览、编辑和分享等操作。 ### 回答2: Material Design是一种由Google提出的设计语言,旨在提供一种直观和一致的用户体验。为了满足Material Design的设计风格,我们可以创建一个简洁而具有现代感的文件上传控件。 首先,该控件应具有明确的界面元素,包括一个上传图标、一个提示文字和一个选择文件按钮。上传图标应该是一个符合Material Design的图标,比如一个云朵形状的图标,以表示文件上传的概念。提示文字应该清晰地指示用户应该点击哪里进行文件上传操作。选择文件按钮则应被设计成一个点击区域较大且有明显反馈的按钮,以确保用户体验。 在用户点击选择文件按钮后,控件应该呈现一个方便用户进行文件选择的界面。这个界面应该有一个文件浏览器的图标和一个文字,提示用户选择一个或多个文件。此外,为了符合Material Design的概念,我们可以使用一些动画效果来增强用户体验,比如按钮点击后有一个微妙的涟漪效果。 在用户成功选择文件后,控件应当显示一个符合Material Design的反馈,比如一个勾号图标和一个“文件已上传”的文字。这一部分可以用一个动画来突出显示,以增加用户的交互感。 最后,在用户上传文件的过程中,控件应该提供一个进度条或者一个加载动画,来显示上传进度和给用户一个可见的反馈。这将有助于用户了解文件上传的进程以及剩余时间,以便更好地控制和计划他们的操作。 总的来说,一个满足Material Design设计风格的文件上传控件应该注重界面元素的明确性和可交互性,使用合适的图标和动画来增强用户体验,并提供明确的反馈和进度展示来帮助用户了解上传过程。 ### 回答3: 满足Material Design设计风格的文件上传控件应该具有以下几个特点: 1. 界面设计:控件整体界面应简洁清晰,采用扁平化设计风格,使用明亮的色彩和简洁的图标。上传按钮应该有明显的矩形边框,并使用Material Design中的浮动按钮的样式。 2. 文件选择:用户点击上传按钮后,应弹出文件选择对话框。在选择文件时,对话框应该采用卡片的形式展示文件信息,每个文件卡片上应包含文件名、文件大小和文件类型等信息,并使用Material Design中的阴影效果进行修饰。 3. 进度展示:在文件上传过程中,应该有一个水平进度条显示上传进度。进度条应采用Material Design中的波纹效果,并在顶部显示上传进度的百分比。 4. 上传结果:在文件上传完成后,需要给用户一个明显的反馈。可以在界面上显示一个提示消息,告知用户文件上传成功,并显示文件的上传路径或者下载链接。 5. 错误处理:当文件上传过程中出现错误时,应该给用户适当的提示。可以使用红色的错误信息提示框,提示用户上传失败的原因,并提供重新上传按钮。 6. 用户体验:控件应该具有良好的用户体验,能够适应不同尺寸的屏幕和设备。在移动设备上,可以使用折叠面板的形式来展示文件选择对话框,以节约空间。 综上所述,满足Material Design设计风格的文件上传控件应具备上述特点,通过简洁明快的界面设计、明确的用户反馈和良好的用户体验,能够提供便捷的文件上传功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值