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 + +