From c801fa8098f031eb66034c2eee569595b6ca24cc Mon Sep 17 00:00:00 2001 From: xiaoyao Date: Mon, 22 Jan 2018 16:20:49 +0800 Subject: [PATCH 01/34] =?UTF-8?q?1=E3=80=81AnimationButton=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E5=8A=A8=E7=94=BB=E9=87=8D=E7=BD=AE=E6=96=B9=E6=B3=95?= =?UTF-8?q?=EF=BC=9B2=E3=80=81PayPsdInputView=E6=96=B0=E5=A2=9E=E6=B8=85?= =?UTF-8?q?=E7=A9=BA=E5=86=85=E5=AE=B9=E5=92=8C=E8=BE=93=E5=85=A5=E5=AE=8C?= =?UTF-8?q?=E6=AF=95=E5=9B=9E=E8=B0=83=E7=9A=84=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../activity/AnimationBtnActivity.java | 1 + .../activity/PayPsdViewActivity.java | 18 +++++++-- .../widget/AnimationButton.java | 14 +++++++ .../widget/PayPsdInputView.java | 37 ++++++++++++++++--- 4 files changed, 60 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/allen/androidcustomview/activity/AnimationBtnActivity.java b/app/src/main/java/com/allen/androidcustomview/activity/AnimationBtnActivity.java index e590df4..2c7273c 100644 --- a/app/src/main/java/com/allen/androidcustomview/activity/AnimationBtnActivity.java +++ b/app/src/main/java/com/allen/androidcustomview/activity/AnimationBtnActivity.java @@ -26,6 +26,7 @@ public void onClickListener() { public void animationFinish() { Toast.makeText(AnimationBtnActivity.this,"动画执行完毕",Toast.LENGTH_SHORT).show(); // finish(); + animationButton.reset(); } }); } diff --git a/app/src/main/java/com/allen/androidcustomview/activity/PayPsdViewActivity.java b/app/src/main/java/com/allen/androidcustomview/activity/PayPsdViewActivity.java index 21a2777..26865eb 100644 --- a/app/src/main/java/com/allen/androidcustomview/activity/PayPsdViewActivity.java +++ b/app/src/main/java/com/allen/androidcustomview/activity/PayPsdViewActivity.java @@ -17,18 +17,28 @@ protected void onCreate(Bundle savedInstanceState) { passwordInputView = (PayPsdInputView) findViewById(R.id.password); - passwordInputView.setComparePassword("123456", new PayPsdInputView.onPasswordListener() { + passwordInputView.setComparePassword( new PayPsdInputView.onPasswordListener() { + @Override - public void onDifference() { - // TODO: 2017/5/7 和上次输入的密码不一致 做相应的业务逻辑处理 - Toast.makeText(PayPsdViewActivity.this, "两次密码输入不同", Toast.LENGTH_SHORT).show(); + public void onDifference(String oldPsd, String newPsd) { + // TODO: 2018/1/22 和上次输入的密码不一致 做相应的业务逻辑处理 + Toast.makeText(PayPsdViewActivity.this, "两次密码输入不同" + oldPsd + "!=" + newPsd, Toast.LENGTH_SHORT).show(); + passwordInputView.cleanPsd(); } @Override public void onEqual(String psd) { // TODO: 2017/5/7 两次输入密码相同,那就去进行支付楼 Toast.makeText(PayPsdViewActivity.this, "密码相同" + psd, Toast.LENGTH_SHORT).show(); + passwordInputView.setComparePassword(""); + passwordInputView.cleanPsd(); + } + @Override + public void inputFinished(String inputPsd) { + // TODO: 2018/1/3 输完逻辑 + Toast.makeText(PayPsdViewActivity.this, "输入完毕:" + inputPsd, Toast.LENGTH_SHORT).show(); + passwordInputView.setComparePassword(inputPsd); } }); diff --git a/app/src/main/java/com/allen/androidcustomview/widget/AnimationButton.java b/app/src/main/java/com/allen/androidcustomview/widget/AnimationButton.java index 8ab78a1..b7deba7 100644 --- a/app/src/main/java/com/allen/androidcustomview/widget/AnimationButton.java +++ b/app/src/main/java/com/allen/androidcustomview/widget/AnimationButton.java @@ -311,6 +311,7 @@ protected void onDraw(Canvas canvas) { } + /** * 绘制长方形变成圆形 * @@ -365,6 +366,19 @@ public void start() { animatorSet.start(); } + /** + * 动画还原 + */ + public void reset() { + startDrawOk = false; + circleAngle = 0; + two_circle_distance = 0; + default_two_circle_distance = (width - height) / 2; + textPaint.setAlpha(255); + setTranslationY(getTranslationY() + move_distance); + invalidate(); + } + /** * 借口回调 */ diff --git a/app/src/main/java/com/allen/androidcustomview/widget/PayPsdInputView.java b/app/src/main/java/com/allen/androidcustomview/widget/PayPsdInputView.java index 487e040..ce27716 100644 --- a/app/src/main/java/com/allen/androidcustomview/widget/PayPsdInputView.java +++ b/app/src/main/java/com/allen/androidcustomview/widget/PayPsdInputView.java @@ -111,6 +111,7 @@ public class PayPsdInputView extends EditText { */ private String mComparePassword = null; + /** * 当前输入的位置索引 */ @@ -279,13 +280,20 @@ protected void onTextChanged(CharSequence text, int start, int lengthBefore, int this.position = start + lengthAfter; textLength = text.toString().length(); - if (mComparePassword != null && textLength == maxCount) { - if (TextUtils.equals(mComparePassword, getPasswordString())) { - mListener.onEqual(getPasswordString()); - } else { - mListener.onDifference(); + if (textLength == maxCount) { + if (mListener != null) { + if (TextUtils.isEmpty(mComparePassword)) { + mListener.inputFinished(getPasswordString()); + } else { + if (TextUtils.equals(mComparePassword, getPasswordString())) { + mListener.onEqual(getPasswordString()); + } else { + mListener.onDifference(mComparePassword, getPasswordString()); + } + } } } + invalidate(); } @@ -314,12 +322,29 @@ public void setComparePassword(String comparePassword, onPasswordListener listen mListener = listener; } + public void setComparePassword(onPasswordListener listener) { + mListener = listener; + } + + public void setComparePassword(String psd) { + mComparePassword = psd; + } + + /** + * 清空密码 + */ + public void cleanPsd() { + setText(""); + } + /** * 密码比较监听 */ public interface onPasswordListener { - void onDifference(); + void onDifference(String oldPsd, String newPsd); void onEqual(String psd); + + void inputFinished(String inputPsd); } } From 1f9c93afafc5a7c63fd73882cac9e581c00e5c25 Mon Sep 17 00:00:00 2001 From: xiaoyao Date: Wed, 31 Jan 2018 15:40:10 +0800 Subject: [PATCH 02/34] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E7=BA=BF=E6=80=A7loadi?= =?UTF-8?q?ng=20=20view?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../widget/LoadingLineView.java | 264 ++++++++++++++++++ .../main/res/layout/activity_pregress_bar.xml | 5 + 2 files changed, 269 insertions(+) create mode 100644 app/src/main/java/com/allen/androidcustomview/widget/LoadingLineView.java diff --git a/app/src/main/java/com/allen/androidcustomview/widget/LoadingLineView.java b/app/src/main/java/com/allen/androidcustomview/widget/LoadingLineView.java new file mode 100644 index 0000000..d9bce41 --- /dev/null +++ b/app/src/main/java/com/allen/androidcustomview/widget/LoadingLineView.java @@ -0,0 +1,264 @@ +package com.allen.androidcustomview.widget; + +import android.animation.ValueAnimator; +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.support.annotation.Nullable; +import android.util.AttributeSet; +import android.util.TypedValue; +import android.view.View; +import android.view.animation.LinearInterpolator; + +/** + * Created by Allen on 2018/1/31. + *

+ * 线性加载动画 + */ + +public class LoadingLineView extends View { + + private int mWidth; + private int mHeight; + + /** + * 动画起点x坐标 + */ + private int centerX; + /** + * 动画起点y坐标 + */ + private int centerY; + + /** + * 偏移距离 + */ + private float dis; + + /** + * view真实高度 + */ + private int mViewHeight; + + /** + * 背景色画笔 + */ + private Paint bgPaint; + /** + * loading画笔 + */ + private Paint loadingPaint; + + /** + * 画笔宽度(等于vie高度) + */ + private int paintWidth; + + /** + * 底色 + */ + private int bgColor = 0xFFe1e5e8; + + /** + * loading颜色 + */ + private int loadingColor = 0xFFf66b12; + + + /** + * 动画 + */ + private ValueAnimator loadingAnimator; + /** + * 动画执行时间 + */ + private int duration = 800; + /** + * 动画延时启动时间 + */ + private int startDelay = 0; + + public LoadingLineView(Context context) { + this(context, null); + } + + public LoadingLineView(Context context, @Nullable AttributeSet attrs) { + this(context, attrs, 0); + } + + public LoadingLineView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + getAtt(attrs); + init(); + } + + /** + * 想实现颜色等参数可配置,在这里实现配置即可,笔者就不多写了 + * + * @param attrs attrs + */ + private void getAtt(AttributeSet attrs) { + + } + + private void init() { + paintWidth = dp2px(2); + mViewHeight = paintWidth; + bgPaint = getPaint(paintWidth, bgColor, Paint.Style.FILL); + loadingPaint = getPaint(paintWidth, loadingColor, Paint.Style.FILL); + } + + + /** + * 统一处理paint + * + * @param strokeWidth 画笔宽度 + * @param color 颜色 + * @param style 风格 + * @return paint + */ + private Paint getPaint(int strokeWidth, int color, Paint.Style style) { + Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); + paint.setStrokeWidth(strokeWidth); + paint.setColor(color); + paint.setAntiAlias(true); + paint.setStyle(style); + return paint; + } + + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + super.onSizeChanged(w, h, oldw, oldh); + + mWidth = w; + mHeight = h; + + centerX = w / 2; + centerY = h / 2; + + initLoadingAnimation(); + startLoading(); + } + + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + int widthMode = MeasureSpec.getMode(widthMeasureSpec); + int width = MeasureSpec.getSize(widthMeasureSpec); + + int heightMode = MeasureSpec.getMode(heightMeasureSpec); + int height = MeasureSpec.getSize(heightMeasureSpec); + + setMeasuredDimension(measureWidth(widthMode, width), measureHeight(heightMode, height)); + } + + /** + * 测量宽度 + * + * @param mode + * @param width + * @return + */ + private int measureWidth(int mode, int width) { + switch (mode) { + case MeasureSpec.UNSPECIFIED: + case MeasureSpec.AT_MOST: + break; + case MeasureSpec.EXACTLY: + mWidth = width; + break; + } + return mWidth; + } + + /** + * 测量高度 + * + * @param mode + * @param height + * @return + */ + private int measureHeight(int mode, int height) { + switch (mode) { + case MeasureSpec.UNSPECIFIED: + case MeasureSpec.AT_MOST: + mHeight = mViewHeight; + break; + case MeasureSpec.EXACTLY: + mHeight = height; + break; + } + return mHeight; + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + /** + * 画底色 + */ + canvas.drawLine(0, centerY, mWidth, centerY, bgPaint); + /** + * loading向左扩散 + */ + canvas.drawLine(centerX, centerY, centerX - dis, centerY, loadingPaint); + /** + * loading向右扩散 + */ + canvas.drawLine(centerX, centerY, centerX + dis, centerY, loadingPaint); + } + + /** + * 初始化动画 + */ + private void initLoadingAnimation() { + final float loadingMoveDistance = mWidth / 2; + loadingAnimator = ValueAnimator.ofFloat(0, loadingMoveDistance); + loadingAnimator.setDuration(duration); + loadingAnimator.setStartDelay(startDelay); + loadingAnimator.setRepeatCount(ValueAnimator.INFINITE); + loadingAnimator.setInterpolator(new LinearInterpolator()); + loadingAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { + @Override + public void onAnimationUpdate(ValueAnimator valueAnimator) { + float value = (float) valueAnimator.getAnimatedValue(); + dis = value; + if (value <= loadingMoveDistance / 2) { + loadingPaint.setAlpha((int) ((255 * value) * 2 / loadingMoveDistance)); + } else { + loadingPaint.setAlpha((int) (255 - (255 * value) * 2 / loadingMoveDistance)); + } + invalidate(); + } + }); + } + + /** + * 开启动画 + */ + public void startLoading() { + if (loadingAnimator != null) { + loadingAnimator.start(); + } + } + + /** + * 结束动画 + */ + public void stopLoading() { + if (loadingAnimator != null) { + loadingAnimator.cancel(); + } + } + + + /** + * dp 2 px + * + * @param dpVal dp + */ + protected int dp2px(int dpVal) { + return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, + dpVal, getResources().getDisplayMetrics()); + } +} diff --git a/app/src/main/res/layout/activity_pregress_bar.xml b/app/src/main/res/layout/activity_pregress_bar.xml index 88a8805..df29df4 100644 --- a/app/src/main/res/layout/activity_pregress_bar.xml +++ b/app/src/main/res/layout/activity_pregress_bar.xml @@ -38,6 +38,11 @@ android:layout_height="wrap_content" android:layout_margin="20dp" /> + +