如何实现PIN码屏幕

10

如何编写这种密码屏幕设计,当输入密码后,圆圈应该更改或ImageView应该更改..??

Login.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="20dp"
    android:orientation="vertical">
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:background="@color/light_grey"
    >
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Enter MPIN"
        android:textStyle="bold"
        android:textSize="18dp"
        android:layout_margin="10dp"
        android:layout_gravity="center_horizontal"
        />
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_gravity="center_horizontal"
        >
        <ImageView
            android:id="@+id/imageview_circle1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="6dp"
            android:src="@drawable/circle"
            />
        <ImageView
            android:id="@+id/imageview_circle2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="6dp"
            android:src="@drawable/circle"
            />
        <ImageView
            android:id="@+id/imageview_circle3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="6dp"
            android:src="@drawable/circle"
            />
        <ImageView
            android:id="@+id/imageview_circle4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="6dp"
            android:src="@drawable/circle"
            />
    </LinearLayout>
</LinearLayout>
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:background="@color/light_grey2"
    >
    <EditText
        android:id="@+id/editText_enter_mpin"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:inputType="number"
        android:maxLength="4"
        android:visibility="visible" >
    </EditText>
</LinearLayout>
</LinearLayout>
</LinearLayout>

LoginActivity.java

登录活动的Java文件。
public class LoginActivity extends AppCompatActivity {

private static final String TAG = "LoginActivity";
EditText enter_mpin;
ImageView i1, i2, i3, i4;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);

    i1 = (ImageView) findViewById(R.id.imageview_circle1);
    i2 = (ImageView) findViewById(R.id.imageview_circle2);
    i3 = (ImageView) findViewById(R.id.imageview_circle3);
    i4 = (ImageView) findViewById(R.id.imageview_circle4);

    enter_mpin = (EditText) findViewById(R.id.editText_enter_mpin);
    enter_mpin.requestFocus();
    enter_mpin.setInputType(InputType.TYPE_CLASS_NUMBER);
    enter_mpin.setFocusableInTouchMode(true);

    enter_mpin.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
        }

        @Override
        public void afterTextChanged(Editable s) {
            Log.d(TAG, "onKey: screen key pressed");
            i1.setImageResource(R.drawable.circle2);
        }
    });
}
}

circle.xml

<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<stroke
    android:width="2dp"
    android:color="#6ab17b" />
<size
    android:width="25dp"
    android:height="25dp" />
</shape>

circle2.xml

<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid
    android:color="#505253"/>
<size
    android:width="25dp"
    android:height="25dp" />
</shape>

在这里输入图片描述


你有一些代码要展示吗?给按钮添加一个点击监听器以及知道已经输入了多少个值应该很简单。 - OneCricketeer
你可以使用空白的可绘制对象作为背景来创建圆形,然后当用户输入时,再加载黑色的圆形作为可绘制对象。你应该先尝试一下,如果遇到问题,可以针对你具体的问题发布问题。 - ishmaelMakitla
@cricket_007发布了一些代码供查看。 - shrishyl47
5个回答

15

使用LolliPin

一个支持指纹的材料设计Android PIN码库。

enter image description here

<com.github.orangegangsters.lollipin.lib.views.PinCodeRoundView
                android:id="@+id/pin_code_round_view"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="@dimen/pin_code_round_top_margin"
                android:layout_marginBottom="@dimen/pin_code_elements_margin"
                app:lp_empty_pin_dot="@drawable/pin_empty_dot"
                app:lp_full_pin_dot="@drawable/pin_full_dot"/>

如何更改标题文本。请给我建议。 - SAndroidD
1
如果您正在使用此库,则进入AppLockActivity抽象类中的getStepText()方法,现在只需更改文本pin_code_step_disable或直接使用string.xml更改这些文本@SAndroidD。 - Amit Vaghela
谢谢伙计,这对我很有帮助。 - SAndroidD
KeyTextColor是否属于KeyboardView?但它似乎不起作用。 - SAndroidD
1
这个库不再维护,当设备缺少指纹扫描仪时会出现崩溃。 - Kevin
显示剩余2条评论

4
当我在项目中添加Lollipop时,遇到了一些错误。然后我发现了一些很棒的库。请查看以下内容:
  1. PinLockView
  2. BlurLockView
请记住这些是视图,因此它们可以更加自定义。祝编码愉快 :)

4

使用TextWatcher中的以下代码:

            @Override
            public void afterTextChanged(Editable s) {
                switch (s.length()) {
                    case 4:
                        i4.setImageResource(R.drawable.circle2);
                        break;
                    case 3:
                        i4.setImageResource(R.drawable.circle);
                        i3.setImageResource(R.drawable.circle2);
                        break;
                    case 2:
                        i3.setImageResource(R.drawable.circle);
                        i2.setImageResource(R.drawable.circle2);
                        break;
                    case 1:
                        i2.setImageResource(R.drawable.circle);
                        i1.setImageResource(R.drawable.circle2);
                        break;
                    default:
                        i1.setImageResource(R.drawable.circle);
                }
            } 

1
你可以让代码更简单、模块化,使用我写的这个教程:https://medium.com/@Lev_Sharone/create-your-own-customized-pin-code-layout-in-3-simple-steps-e36d560689f8 - Sharone Lev

1

看看这个JAVA class。如果您需要多个PIN视图,每行只需创建一个对象即可。例如,在注册页面上。


0
在你的build.gradle文件中添加implementation 'com.alimuzaffar.lib:pinentryedittext:1.3.10'到你的依赖项中,并在你的登录布局中保留以下代码。
<com.alimuzaffar.lib.pin.PinEntryEditText
    android:id="+id/pass" 
    android:layout_width="250dp"    
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:maxLength="6"
    android:inputType="numberPassword" />

在此输入图片描述 #xml #android


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接