Password Validation Animation - Android
Bài đăng này đã không được cập nhật trong 5 năm
Xin chào mọi người, trong bài viết này mình sẽ chia sẻ cách để tạo ra 1 cách valicate 1 Edittext với animation trông đẹp mắt hơn !
Mình sẽ làm tương tự như ví dụ sau:
Bắt đầu nhé !!
Tạo giao diện
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_marginTop="30dp"
android:layout_marginStart="5dp"
android:background="@drawable/big_circle"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<ImageView
android:rotation="-7"
android:layout_marginTop="150dp"
android:layout_marginStart="20dp"
android:src="@drawable/lock_icon"
android:layout_width="50dp"
android:layout_height="50dp" />
<android.support.v7.widget.CardView
app:cardBackgroundColor="@color/colorAccent"
app:cardCornerRadius="8dp"
android:elevation="5dp"
android:rotation="3"
android:layout_marginStart="55dp"
android:layout_marginTop="50dp"
android:layout_marginEnd="50dp"
android:layout_width="match_parent"
android:layout_height="170dp">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_marginTop="15dp"
android:layout_marginStart="15dp"
android:layout_marginBottom="5dp"
android:background="@drawable/circle"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:layout_marginTop="10dp"
android:layout_marginStart="15dp"
android:layout_marginBottom="5dp"
android:background="@drawable/circle"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:layout_marginTop="10dp"
android:layout_marginStart="15dp"
android:layout_marginBottom="5dp"
android:background="@drawable/circle"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:layout_marginTop="10dp"
android:layout_marginStart="15dp"
android:background="@drawable/circle"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</android.support.v7.widget.CardView>
<android.support.v7.widget.CardView
android:id="@+id/validationCardview"
android:rotation="-2"
android:elevation="10dp"
app:cardCornerRadius="8dp"
app:contentPadding="3dp"
android:layout_marginStart="90dp"
android:layout_marginEnd="30dp"
android:layout_marginTop="50dp"
android:background="@color/cardview_light_background"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="2dp"
android:layout_height="match_parent"
android:orientation="horizontal"
android:layout_marginStart="30dp"
android:background="@android:color/holo_red_light"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<lib.mozidev.me.extextview.ExTextView
android:id="@+id/validation1TextView"
android:layout_margin="5dp"
android:textSize="20sp"
android:gravity="center"
android:textColor="@android:color/black"
android:text="@string/validation1"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="1dp"
android:orientation="horizontal"
android:background="@android:color/holo_blue_light" />
<lib.mozidev.me.extextview.ExTextView
android:id="@+id/validation2TextView"
android:layout_margin="5dp"
android:textSize="20sp"
android:gravity="center"
android:textColor="@android:color/black"
android:text="@string/validation2"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="1dp"
android:orientation="horizontal"
android:background="@android:color/holo_blue_light" />
<lib.mozidev.me.extextview.ExTextView
android:id="@+id/validation3TextView"
android:layout_margin="5dp"
android:textSize="20sp"
android:gravity="center"
android:text="@string/validation3"
android:textColor="@android:color/black"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="1dp"
android:orientation="horizontal"
android:background="@android:color/holo_blue_light" />
<lib.mozidev.me.extextview.ExTextView
android:id="@+id/validation4TextView"
android:layout_margin="5dp"
android:textSize="20sp"
android:gravity="center"
android:textColor="@android:color/black"
android:text="@string/validation4"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
</android.support.v7.widget.CardView>
<ImageView
android:id="@+id/allDoneImageView"
android:visibility="invisible"
android:elevation="15dp"
android:layout_marginTop="160dp"
android:layout_marginEnd="30dp"
android:layout_gravity="end"
android:src="@drawable/check_icon"
android:layout_width="40dp"
android:layout_height="40dp" />
</FrameLayout>
Password Validation
Ta sẽ tạo ra 3 regular expressions như sau để xử lý việc validate password:
String specialCharRegex= ".*[@#!$%^&+=].*";
String UpperCaseRegex= ".*[A-Z].*";
String NumberRegex= ".*[0-9].*";
Sau đó ta sẽ check các điều kiện để thoả mãn chuỗi regex này:
if(password.matches(specialCharRegex)){
//special char present
}
Xử lý animations
Để xử lý animation gạch text, ta sẽ sử dụng thư viện sau : https://github.com/zijing07/ExTextView
1. StrikeThroughText Animation
StrikeThroughPainting strikeThroughPainting = new StrikeThroughPainting(CustomTextView);
// Basic Usage
strikeThroughPainting.strikeThrough();
// All Options
strikeThroughPainting
.cutTextEdge(cutEdge)
.color(strokeColor)
.strokeWidth(strokeWidth)
.mode(StrikeThroughPainting.MODE_DEFAULT)
.linePosition(0.7F)
.firstLinePosition(0.6F)
.totalTime(10_000L)
.callback(new StrikeThroughPainting.StrikeThroughPaintingCallback() {
@Override
public void onStrikeThroughEnd() {
Snackbar.make(findViewById(R.id.container),
"Callback after animation", Snackbar.LENGTH_LONG).show();
}
})
// do the draw!
.strikeThrough();
// Clear Strike Through
strikeThroughPainting.clearStrikeThrough();
2. Translation from left to right
TranslateAnimation animation = new TranslateAnimation(0.0f, 75.0f,
0.0f, 0.0f);
animation.setDuration(200); // animation duration
animation.setRepeatCount(1); // animation repeat count
animation.setRepeatMode(2);
validation1TextView.startAnimation(animation); //animate from left to right and back
3. AllDone Image Popup
Chúng ta cần tạo file scale_up và scale_down animations trong XML ( res-> thư mục anim )
Scale_up:
<set xmlns:android="http://schemas.android.com/apk/res/android">
<scale
android:duration="200"
android:fromXScale="0"
android:fromYScale="0"
android:pivotX="50%"
android:pivotY="50%"
android:toXScale="1.0"
android:toYScale="1.0" />
</set>
Scale_down :
<set xmlns:android="http://schemas.android.com/apk/res/android">
<scale
android:duration="200"
android:fromXScale="1.0"
android:fromYScale="1.0"
android:pivotX="50%"
android:pivotY="50%"
android:toXScale="0"
android:toYScale="0" />
</set>
Chúng ta sẽ xử lý logic ẩn hiện ảnh như sau:
Animation imageScaleUp = AnimationUtils.loadAnimation(this, R.anim.scale_up);
allDoneImageView.startAnimation(imageScaleUp);
allDoneImageView.setVisibility(View.VISIBLE);
Animation imageScaleDown = AnimationUtils.loadAnimation(this, R.anim.scale_down);
allDoneImageView.startAnimation(imageScaleDown);
allDoneImageView.setVisibility(View.VISIBLE);
Cũng khá đơn giản đúng không ạ , chỉ vài đoạn code nhỏ, chúng ta đã tạo ra được 1 hiệu ứng khá đẹp dùng để validation !
Bài viết được tham khảo từ: https://android.jlelse.eu/password-validation-animation-android-cb6585e26b65
Các bạn có thể thao khảo code tại : https://github.com/shashankchandak/Password_Validation_Animation
All rights reserved