diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 11c9688a7..b22dacbea 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -433,6 +433,17 @@
android:label="登录界面"
android:launchMode="singleTop"
android:screenOrientation="portrait" />
+
+
+
= view.getX() && event.getRawX() <= view.getX() + view.getWidth() && event.getRawY() >= view.getY() && event.getRawY() <= view.getY() + view.getHeight()) {
+ isPressEdit = true;
+ }
+ }
+ if (!isPressEdit) {
+ hideIME();
+ }
+ return super.onTouchEvent(event);
+
+ }
+}
diff --git a/app/src/main/java/com/yizhuan/erban/ui/login/LoginVertificationActivity.java b/app/src/main/java/com/yizhuan/erban/ui/login/LoginVertificationActivity.java
new file mode 100644
index 000000000..df93d9328
--- /dev/null
+++ b/app/src/main/java/com/yizhuan/erban/ui/login/LoginVertificationActivity.java
@@ -0,0 +1,115 @@
+package com.yizhuan.erban.ui.login;
+
+import android.annotation.SuppressLint;
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.text.Editable;
+import android.text.Html;
+import android.text.TextUtils;
+import android.text.TextWatcher;
+import android.view.MotionEvent;
+import android.view.View;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.TextView;
+
+import com.yizhuan.erban.R;
+import com.yizhuan.erban.base.BaseActivity;
+import com.yizhuan.erban.ui.login.ui.CodeEditText;
+import com.yizhuan.xchat_android_library.utils.TextWatcherWrapper;
+
+/**
+ * @author zhouxiangfeng
+ * @date 17/2/26
+ */
+public class LoginVertificationActivity extends BaseActivity {
+
+ private static final String TAG = "LoginVertificationActivity";
+
+ private com.yizhuan.erban.ui.login.ui.CodeEditText codeEt;
+ private TextView tvGetCode,tvDesc,tvSecond;
+ private String mPhone;
+
+ public static void start(Context context,String phone) {
+ Intent intent = new Intent(context, LoginVertificationActivity.class);
+ intent.putExtra("phone",phone);
+ context.startActivity(intent);
+ }
+
+ public static void startForResult(Activity context, int requestCode) {
+ Intent intent = new Intent(context, LoginVertificationActivity.class);
+ context.startActivityForResult(intent, requestCode); // startActivityForResult会导致singletop,singletask失效
+ }
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_login_vertification);
+ initTitleBar("");
+ onFindViews();
+ initData();
+ onSetListener();
+ }
+
+ @SuppressLint("SetTextI18n")
+ private void initData() {
+ mPhone = getIntent().getStringExtra("phone");
+ tvDesc.setText(getString(R.string.str_send_code_success)+mPhone);
+
+
+ tvSecond.setText("60");
+ tvGetCode.setText(Html.fromHtml("s " + "后可重新获取验证码"));
+ }
+
+ @Override
+ protected void setStatusBar() {
+ StatusBarLightModes(true);
+ }
+
+ private void onFindViews() {
+ codeEt = findViewById(R.id.et_code);
+ tvGetCode = findViewById(R.id.tv_get_code);
+ tvDesc = findViewById(R.id.tv_desc);
+ tvSecond = findViewById(R.id.tv_second);
+ }
+
+ private void onSetListener() {
+ codeEt.setOnTextFinishListener(new CodeEditText.OnTextFinishListener() {
+ @Override
+ public void onTextFinish(CharSequence text, int length) {
+
+ }
+ });
+ }
+
+ @Override
+ protected boolean needSteepStateBar() {
+ return true;
+ }
+
+
+ @Override
+ protected void onDestroy() {
+ codeEt = null;
+ super.onDestroy();
+ }
+
+
+ @Override
+ public boolean onTouchEvent(MotionEvent event) {
+ View view = getCurrentFocus();
+ boolean isPressEdit = false;
+ if (view instanceof EditText) {
+ if (event.getRawX() >= view.getX() && event.getRawX() <= view.getX() + view.getWidth() && event.getRawY() >= view.getY() && event.getRawY() <= view.getY() + view.getHeight()) {
+ isPressEdit = true;
+ }
+ }
+ if (!isPressEdit) {
+ hideIME();
+ }
+ return super.onTouchEvent(event);
+
+ }
+}
diff --git a/app/src/main/java/com/yizhuan/erban/ui/login/ui/CodeEditText.java b/app/src/main/java/com/yizhuan/erban/ui/login/ui/CodeEditText.java
new file mode 100644
index 000000000..78c3d75da
--- /dev/null
+++ b/app/src/main/java/com/yizhuan/erban/ui/login/ui/CodeEditText.java
@@ -0,0 +1,238 @@
+package com.yizhuan.erban.ui.login.ui;
+
+import android.animation.ValueAnimator;
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.text.InputFilter;
+import android.text.TextPaint;
+import android.util.AttributeSet;
+import android.util.TypedValue;
+import android.view.inputmethod.InputMethodManager;
+
+import com.yizhuan.erban.R;
+
+/**
+ * 验证码输入框,重写EditText的绘制方法实现。
+ * @author RAE
+ */
+public class CodeEditText extends android.support.v7.widget.AppCompatEditText {
+
+
+ private int mTextColor;
+
+ public interface OnTextFinishListener {
+
+ void onTextFinish(CharSequence text, int length);
+ }
+
+ // 输入的最大长度
+ private int mMaxLength = 4;
+ // 边框宽度
+ private int mStrokeWidth;
+ // 边框高度
+ private int mStrokeHeight;
+ // 边框之间的距离
+ private int mStrokePadding = 20;
+
+
+ private final Rect mRect = new Rect();
+
+
+ /**
+ * 输入结束监听
+ */
+ private OnTextFinishListener mOnInputFinishListener;
+
+ // 方框的背景
+ private Drawable mStrokeDrawable;
+
+ /**
+ * 构造方法
+ *
+ */
+ public CodeEditText(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CodeEditText);
+ int indexCount = typedArray.getIndexCount();
+ for (int i = 0; i < indexCount; i++) {
+ int index = typedArray.getIndex(i);
+ if (index == R.styleable.CodeEditText_strokeHeight) {
+ this.mStrokeHeight = (int) typedArray.getDimension(index, 60);
+ } else if (index == R.styleable.CodeEditText_strokeWidth) {
+ this.mStrokeWidth = (int) typedArray.getDimension(index, 60);
+
+ } else if (index == R.styleable.CodeEditText_strokePadding) {
+ this.mStrokePadding = (int) typedArray.getDimension(index, 20);
+
+ } else if (index == R.styleable.CodeEditText_strokeBackground) {
+ this.mStrokeDrawable = typedArray.getDrawable(index);
+
+ } else if (index == R.styleable.CodeEditText_strokeLength) {
+ this.mMaxLength = typedArray.getInteger(index, 4);
+ }
+ }
+ typedArray.recycle();
+
+ if (mStrokeDrawable == null) {
+ throw new NullPointerException("stroke drawable not allowed to be null!");
+ }
+
+ setMaxLength(mMaxLength);
+ setLongClickable(false);
+ // 去掉背景颜色
+ setBackgroundColor(Color.TRANSPARENT);
+ // 不显示光标
+ setCursorVisible(false);
+ }
+
+ @Override
+ public boolean onTextContextMenuItem(int id) {
+ return false;
+ }
+
+// private int px(int size) {
+// return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, size, getResources().getDisplayMetrics());
+// }
+
+ /**
+ * 设置最大长度
+ */
+ private void setMaxLength(int maxLength) {
+ if (maxLength >= 0) {
+ setFilters(new InputFilter[]{new InputFilter.LengthFilter(maxLength)});
+ } else {
+ setFilters(new InputFilter[0]);
+ }
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+
+ int width = getMeasuredWidth();
+ int height = getMeasuredHeight();
+ int widthMode = MeasureSpec.getMode(widthMeasureSpec);
+ int heightMode = MeasureSpec.getMode(heightMeasureSpec);
+
+ // 判断高度是否小于推荐高度
+ if (height < mStrokeHeight) {
+ height = mStrokeHeight;
+ }
+
+ // 判断高度是否小于推荐宽度
+ int recommendWidth = mStrokeWidth * mMaxLength + mStrokePadding * (mMaxLength - 1);
+ if (width < recommendWidth) {
+ width = recommendWidth;
+ }
+
+ widthMeasureSpec = MeasureSpec.makeMeasureSpec(width, widthMode);
+ heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, heightMode);
+ setMeasuredDimension(widthMeasureSpec, heightMeasureSpec);
+
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ mTextColor = getCurrentTextColor();
+ setTextColor(Color.TRANSPARENT);
+ super.onDraw(canvas);
+ setTextColor(mTextColor);
+ // 重绘背景颜色
+ drawStrokeBackground(canvas);
+ // 重绘文本
+ drawText(canvas);
+ }
+
+
+ /**
+ * 重绘背景
+ */
+ private void drawStrokeBackground(Canvas canvas) {
+ // 绘制方框背景颜色
+ mRect.left = 0;
+ mRect.top = 0;
+ mRect.right = mStrokeWidth;
+ mRect.bottom = mStrokeHeight;
+ int count = canvas.getSaveCount();
+ canvas.save();
+ for (int i = 0; i < mMaxLength; i++) {
+ mStrokeDrawable.setBounds(mRect);
+ mStrokeDrawable.setState(new int[]{android.R.attr.state_enabled});
+ mStrokeDrawable.draw(canvas);
+ float dx = mRect.right + mStrokePadding;
+ // 移动画布
+ canvas.save();
+ canvas.translate(dx, 0);
+ }
+ canvas.restoreToCount(count);
+ canvas.translate(0, 0);
+
+ // 绘制激活状态的边框
+ // 当前激活的索引
+ int activatedIndex = Math.max(0, getEditableText().length());
+ mRect.left = mStrokeWidth * activatedIndex + mStrokePadding * activatedIndex;
+ mRect.right = mRect.left + mStrokeWidth;
+ mStrokeDrawable.setState(new int[]{android.R.attr.state_focused});
+ mStrokeDrawable.setBounds(mRect);
+ mStrokeDrawable.draw(canvas);
+
+ }
+
+
+ /**
+ * 重绘文本
+ */
+ private void drawText(Canvas canvas) {
+ int count = canvas.getSaveCount();
+ canvas.translate(0, 0);
+ int length = getEditableText().length();
+ for (int i = 0; i < length; i++) {
+ String text = String.valueOf(getEditableText().charAt(i));
+ TextPaint textPaint = getPaint();
+ textPaint.setColor(mTextColor);
+ // 获取文本大小
+ textPaint.getTextBounds(text, 0, 1, mRect);
+ // 计算(x,y) 坐标
+ int x = mStrokeWidth / 2 + (mStrokeWidth + mStrokePadding) * i - (mRect.centerX());
+ int y = canvas.getHeight() / 2 + mRect.height() / 2;
+ canvas.drawText(text, x, y, textPaint);
+ }
+ canvas.restoreToCount(count);
+ }
+
+ @Override
+ protected void onTextChanged(CharSequence text, int start,
+ int lengthBefore, int lengthAfter) {
+ super.onTextChanged(text, start, lengthBefore, lengthAfter);
+
+ // 当前文本长度
+ int textLength = getEditableText().length();
+
+ if (textLength == mMaxLength) {
+ hideSoftInput();
+ if (mOnInputFinishListener != null) {
+ mOnInputFinishListener.onTextFinish(getEditableText().toString(), mMaxLength);
+ }
+ }
+
+ }
+
+
+ public void hideSoftInput() {
+ InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
+ if (imm != null)
+ imm.hideSoftInputFromWindow(getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
+ }
+
+ /**
+ * 设置输入完成监听
+ */
+ public void setOnTextFinishListener(OnTextFinishListener onInputFinishListener) {
+ this.mOnInputFinishListener = onInputFinishListener;
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable-xhdpi/ic_login_next_disable.png b/app/src/main/res/drawable-xhdpi/ic_login_next_disable.png
new file mode 100644
index 000000000..9af016edf
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_login_next_disable.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_login_next_enable.png b/app/src/main/res/drawable-xhdpi/ic_login_next_enable.png
new file mode 100644
index 000000000..3c0b4d3a5
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_login_next_enable.png differ
diff --git a/app/src/main/res/drawable/bg_code_edit.xml b/app/src/main/res/drawable/bg_code_edit.xml
new file mode 100644
index 000000000..ebf9be298
--- /dev/null
+++ b/app/src/main/res/drawable/bg_code_edit.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/selector_login_phone_next.xml b/app/src/main/res/drawable/selector_login_phone_next.xml
new file mode 100644
index 000000000..ef27c2b0a
--- /dev/null
+++ b/app/src/main/res/drawable/selector_login_phone_next.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml
index 56e10615e..79c1a29a6 100644
--- a/app/src/main/res/values/attrs.xml
+++ b/app/src/main/res/values/attrs.xml
@@ -325,4 +325,12 @@
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index 60d2407f5..5ee75fb6c 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -529,6 +529,7 @@
#1CE9E7
#45F1E5
#ABAAB2
+ #F770FF
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 9e8a2a5d6..19acf2e34 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -14,7 +14,7 @@
ScrollingActivity
- 请输入您的手机号/66陪玩ID
+ 手机号
请输入您的手机号/兔兔ID
请输入您的密码
请输入密码
@@ -868,6 +868,7 @@
我的房间
收藏房间
榜单
+ 验证码已发送至
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index ed604a430..63e0eb611 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -510,6 +510,10 @@
- @color/color_333333
+
+