English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Introdução
Uma boa aplicação precisa de uma interface de login com uma boa experiência do usuário, atualmente, muitos aplicativos têm interfaces de login com nome de usuário, exclusão de senha com um clique, aviso de nome de usuário e senha em branco, e a função de entrada de código de verificação. Olhando para os artigos dos grandes gênios no csdn, pensando em escrever uma interface de login para aprender, muitos itens são referenciados de outros artigos, combinados. Não vamos perder tempo, vamos ver como é implementado a seguir.
ps: como sou preguiçoso para arrancar imagens, o ícone do aplicativo é muito feio.
Figura do aplicativo em execução:
Primeiro, o arquivo de layout não tem muita dificuldade.
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <ImageView android:id="@"+id/tv_login" android:src="@drawable/ic_launcher" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:gravity="center" /> <com.example.administrator.texttest.DeletableEditText android:id="@"+id/tv_user" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="30dp" android:layout_below="@id/tv_login" android:drawableLeft="@drawable/ic_launcher" android:drawableRight="@drawable/ic_launcher" android:hint="Por favor, insira o nome da conta" android:ems="10"/> <com.example.administrator.texttest.DeletableEditText android:id="@"+id/tv_psd" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="30dp" android:layout_below="@id/tv_user" android:drawableLeft="@drawable/ic_launcher" android:drawableRight="@drawable/ic_launcher" android:hint="Por favor, insira a senha" android:inputType="textPassword" android:ems="10"/> <LinearLayout android:id="@"+id/lyYanzhengma" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/tv_psd"> <LinearLayout android:id="@"+id/lyVerify" android:orientation="horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android:id="@"+id/tvHideA" android:layout_width="70dp" android:layout_height="70dp" android:visibility="gone" android:gravity="center" android:textSize="30dp" /> <TextView android:id="@"+id/tvHideB" android:layout_width="70dp" android:layout_height="70dp" android:visibility="gone" android:gravity="center" android:textSize="30dp" /> <TextView android:id="@"+id/tvHideC" android:layout_width="70dp" android:layout_height="70dp" android:visibility="gone" android:gravity="center" android:textSize="30dp" /> <TextView android:id="@"+id/tvHideD" android:layout_width="70dp" android:layout_height="70dp" android:visibility="gone" android:gravity="center" android:textSize="30dp" /> </LinearLayout> <LinearLayout android:id="@"+id/IV_num" android:orientation="horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content"> <ImageView android:layout_height="70dp" android:layout_width="50dp" android:id="@"+id/ivNumA"/> <ImageView android:layout_height="70dp" android:layout_width="50dp" android:id="@"+id/ivNumB"/> <ImageView android:layout_height="70dp" android:layout_width="50dp" android:id="@"+id/ivNumC"/> <ImageView android:layout_height="70dp" android:layout_width="50dp" android:id="@"+id/ivNumD"/> </LinearLayout> <LinearLayout android:orientation="horizontal" android:layout_height="wrap_content" android:layout_width="match_parent"> <EditText android:layout_height="wrap_content" android:layout_width="120dp" android:textSize="30dp" android:id="@"+id/etCheck" android:maxLength="4" android:singleLine="true" android:hint="验证码"/> <TextView android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="结果" android:id="@"+id/tvCheck" android:textSize="30dp" android:visibility="gone"/> </LinearLayout> </LinearLayout> <Button android:id="@"+id/bt_login" android:text="登 录" android:textSize="30dp" android:layout_below="@id/lyYanzhengma" android:layout_width="match_parent" android:layout_height="wrap_content" /> </RelativeLayout>
Em seguida, carregar alguns arquivos de layout e inicializar alguns componentes.
//Botão de login private Button btLogin; //Conta private DeletableEditText userEditText; //Senha private DeletableEditText psdEditText; //Texto numérico do código de verificação private TextView tvHideA, tvHideB, tvHideC, tvHideD; //texto de imagem do código de verificação private ImageView ivNumA,ivNumB,ivNumC,ivNumD; //texto de entrada de código de verificação private EditText etCheck; //texto de exibição de verificação do código private TextView tvCheck; //armazenamento de números de cada código private String numStrTmp = ""; //armazenamento de números do código completo private String numStr = ""; //array de códigos de verificação armazenado private int[] numArray = new int[4 //array de cores armazenado private int[] colorArray = new int[6 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); setupViews(); } private void setupViews() { btLogin = (Button) findViewById(R.id.bt_login); btLogin.setOnClickListener(new OnClickListenerImpl()); userEditText = (DeletableEditText) findViewById(R.id.tv_user); psdEditText = (DeletableEditText) findViewById(R.id.tv_psd); tvHideA = (TextView) findViewById(R.id.tvHideA); tvHideB = (TextView) findViewById(R.id.tvHideB); tvHideC = (TextView) findViewById(R.id.tvHideC); tvHideD = (TextView) findViewById(R.id.tvHideD); ivNumA = (ImageView) findViewById(R.id.ivNumA); ivNumB = (ImageView) findViewById(R.id.ivNumB); ivNumC = (ImageView) findViewById(R.id.ivNumC); ivNumD = (ImageView) findViewById(R.id.ivNumD); ivNumA.setOnClickListener(new OnClickListenerImpl()); ivNumB.setOnClickListener(new OnClickListenerImpl()); ivNumC.setOnClickListener(new OnClickListenerImpl()); ivNumD.setOnClickListener(new OnClickListenerImpl()); tvCheck = (TextView) findViewById(R.id.tvCheck); etCheck = (EditText) findViewById(R.id.etCheck); setNum();
Processo de implementação do EditText personalizado:
Thoughts:Configurar dois EidtText, cadastrar ícones neles. O ícone à esquerda é um aviso de conta e senha, e o ícone à direita é um botão de exclusão rápida. Como os ícones no EditText não têm evento onClick, para implementar o efeito de exclusão rápida ao clicar, é necessário usar o método de chamada de retorno OnTouchEvent para monitorar os eventos de clique e implementar a exclusão rápida. Quando a conta e a senha não têm caracteres, o ícone de exclusão rápida à direita é configurado para ocultar, e quando há caracteres, o ícone é configurado para mostrar. Quando clicar na faixa do ícone à direita, exclua os caracteres da linha correspondente. Assim, é implementado o efeito de exclusão rápida. Além disso, quando a conta e a senha estiverem vazias e for necessário fazer login, essas duas linhas de tremor de aviso.
Não há muito a dizer, vamos diretamente aos comentários de código que são muito claros.
package com.example.administrator.texttest; import android.content.Context; import android.graphics.drawable.Drawable; import android.text.Editable; import android.text.TextWatcher; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.view.animation.Animation; import android.view.animation.CycleInterpolator; import android.view.animation.TranslateAnimation; import android.widget.EditText; /** * Criado por Administrador em 2015-10-10. */ public class DeletableEditText extends EditText { private Drawable mRightDrawable; private boolean isHasFocus; public DeletableEditText(Context context) { this(context, null); } public DeletableEditText(Context context, AttributeSet attrs) { this(context, attrs, android.R.attr.editTextStyle); } public DeletableEditText(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); setupViews(); } private void setupViews() { //Obtém os margens superior, inferior, esquerda e direita da view Drawable[] drawables = this.getCompoundDrawables(); // Obtém o Drawable na posição right // É o que configuramos no arquivo de layout como android:drawableRight mRightDrawable = drawables[2 // configurar o ouvinte de mudança de foco this.setOnFocusChangeListener(new FocusChangeListenerImpl()); // configurar o ouvinte de mudança de texto do EditText this.addTextChangedListener(new TextWatcherImpl()); // ao inicializar, tornar o ícone de limpeza à direita invisível setClearDrawableVisible(false); } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { //ao soltar o clique, verificar a posição do clique. Aqui foi feito apenas a verificação no eixo X. case MotionEvent.ACTION_UP: //verificar se o clique foi feito na área do ícone à direita boolean isClean = (event.getX() > (getWidth() - getTotalPaddingRight())) && (event.getX() < (getWidth() - getPaddingRight())); if (isClean) { //limpar caracteres setText(""); } break; default: break; } return super.onTouchEvent(event); } private class FocusChangeListenerImpl implements OnFocusChangeListener { @Override public void onFocusChange(View v, boolean hasFocus) { isHasFocus = hasFocus; if (isHasFocus) { boolean isVisible = getText().toString().length() >= 1; setClearDrawableVisible(isVisible); } else { setClearDrawableVisible(false); } } } // ao terminar a digitação, verificar se o ícone da limpeza à direita deve ser exibido private class TextWatcherImpl implements TextWatcher { @Override public void afterTextChanged(Editable s) { //When there are characters, it is true boolean isVisible = getText().toString().length() >= 1; //Show the icon on the right setClearDrawableVisible(isVisible); } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } } // Ocultar ou mostrar o ícone clean no lado direito protected void setClearDrawableVisible(boolean isVisible) { Drawable rightDrawable; if (isVisible) { rightDrawable = mRightDrawable; } else { rightDrawable = null; } // Usar código para definir o ícone no lado direito deste controle setCompoundDrawables(getCompoundDrawables()[0], getCompoundDrawables()[1], rightDrawable, getCompoundDrawables()[3); } // Exibir animação public void setShakeAnimation() { this.startAnimation(shakeAnimation(5)); } // CycleTimes número de vezes de repetição da animação public Animation shakeAnimation(int CycleTimes) { //Definir a animação de deslocamento, onde new TranslateAnimation(0,10, 0,10) four values represent X coordinate from 0-->10, Y coordinate from 0-->10 Animation translateAnimation = new TranslateAnimation(0, 10, 0, 10); //Definir o número de vezes de animação translateAnimation.setInterpolator(new CycleInterpolator(CycleTimes)); //Definir o intervalo de animação translateAnimation.setDuration(1000); return translateAnimation; } }
O que deve ser notado:
1.Drawable[] drawables = this.getCompoundDrawables(); Obtém os drawable. getCompoundDrawables() método obtém4um objeto Drawable, correspondente aos margens esquerda, superior, direita e inferior deste View
2.boolean isClean = (event.getX() > (getWidth() - getTotalPaddingRight())) && (event.getX() < (getWidth() - getPaddingRight())); Check if the clicked area is within the right icon range. Where event.getX() is the size of the X coordinate of the clicked position. Detailed as shown in the figure below:
3.Animation translateAnimation = new TranslateAnimation(0, 10, 0, 10); Set offset animation Among them new TranslateAnimation(0,10, 0,10) four values represent X coordinate from 0-->10, Y coordinate from 0-->10
4.this.setOnFocusChangeListener(new FocusChangeListenerImpl()); The purpose of setting the focus change is to make it more user-friendly. The delete icon is displayed only when the focus is on this line and there are characters. The icon is hidden when not on this line.
5.this.addTextChangedListener(new TextWatcherImpl()); Set text change listener. new TextWatcher{} has3methods. They are:
1).public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
2).public void onTextChanged(CharSequence s, int start, int before, int count) {}
3).public void afterTextChanged(Editable s) {}
We just need to add the method to be implemented in afterTextChanged(){Editable s}{} to implement it. When text changes are detected, set the right icon to display.
TextWatcher { @Override public void afterTextChanged(Editable s) { //When there are characters, it is true boolean isVisible = getText().toString().length() >= 1; //Show the icon on the right setClearDrawableVisible(isVisible); }
CaptchaImplementation process:
Thoughts:set4ImageView. First, randomly generate4个10Numbers within are stored in arrays. And record the entire captcha. In using the Bitmap.createBitmap method to speak this4Os números são convertidos em imagens e configurados com cores aleatórias. Durante a conversão de cada imagem numérica, define-se um ângulo de rotação aleatório para que...4Os ícones numéricos inclinam-se um ângulo determinado. O código de verificação é gerado.
O processo de verificação do código de verificação é apenas uma simulação: Compara o código de verificação introduzido com o código de verificação gravado. Se coincidir, mostra correto; se não coincidir, mostra erro. E reseta o código de verificação.
Clicar na área da imagem do código de verificação também resetará o código de verificação.
Os comentários do código são muito detalhados. Vamos ao código ~~~~:
package com.example.administrator.texttest; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Matrix; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.text.TextUtils; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import java.util.Random; public class MainActivity extends AppCompatActivity { //Botão de login private Button btLogin; //Conta private DeletableEditText userEditText; //Senha private DeletableEditText psdEditText; //Texto numérico do código de verificação private TextView tvHideA, tvHideB, tvHideC, tvHideD; //texto de imagem do código de verificação private ImageView ivNumA,ivNumB,ivNumC,ivNumD; //texto de entrada de código de verificação private EditText etCheck; //texto de exibição de verificação do código private TextView tvCheck; //armazenamento de números de cada código private String numStrTmp = ""; //armazenamento de números do código completo private String numStr = ""; //array de códigos de verificação armazenado private int[] numArray = new int[4 //array de cores armazenado private int[] colorArray = new int[6 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); setupViews(); } private void setupViews() { btLogin = (Button) findViewById(R.id.bt_login); btLogin.setOnClickListener(new OnClickListenerImpl()); userEditText = (DeletableEditText) findViewById(R.id.tv_user); psdEditText = (DeletableEditText) findViewById(R.id.tv_psd); tvHideA = (TextView) findViewById(R.id.tvHideA); tvHideB = (TextView) findViewById(R.id.tvHideB); tvHideC = (TextView) findViewById(R.id.tvHideC); tvHideD = (TextView) findViewById(R.id.tvHideD); ivNumA = (ImageView) findViewById(R.id.ivNumA); ivNumB = (ImageView) findViewById(R.id.ivNumB); ivNumC = (ImageView) findViewById(R.id.ivNumC); ivNumD = (ImageView) findViewById(R.id.ivNumD); ivNumA.setOnClickListener(new OnClickListenerImpl()); ivNumB.setOnClickListener(new OnClickListenerImpl()); ivNumC.setOnClickListener(new OnClickListenerImpl()); ivNumD.setOnClickListener(new OnClickListenerImpl()); tvCheck = (TextView) findViewById(R.id.tvCheck); etCheck = (EditText) findViewById(R.id.etCheck); setNum(); } private void setNum() { initNum(); tvHideA.setText("" + numArray[0]); tvHideA.setTextColor(randomColor()); tvHideB.setText("" + numArray[1); tvHideB.setTextColor(randomColor()); tvHideC.setText("" + numArray[2); tvHideC.setTextColor(randomColor()); tvHideD.setText("" + numArray[3); tvHideD.setTextColor(randomColor()); Matrix matrixA = new Matrix(); //redefinir a matriz matrixA.reset(); matrixA.setRotate(randomAngle()); Bitmap bmNumA = Bitmap.createBitmap(getBitmapFromView(tvHideA,)20,50), 0, 0,20,50, matrixA, true); ivNumA.setImageBitmap(bmNumA); Matrix matrixB = new Matrix(); //redefinir a matriz matrixB.reset(); Bitmap bmNumB = Bitmap.createBitmap(getBitmapFromView(tvHideB,20,50), 0, 0,20,50,matrixB,true); ivNumB.setImageBitmap(bmNumB); Matrix matrixC = new Matrix(); //redefinir a matriz matrixC.reset(); Bitmap bmNumC = Bitmap.createBitmap(getBitmapFromView(tvHideC,20,50), 0, 0,20,50,matrixC,true); ivNumC.setImageBitmap(bmNumC); Matrix matrixD = new Matrix(); //redefinir a matriz matrixD.reset(); Bitmap bmNumD = Bitmap.createBitmap(getBitmapFromView(tvHideD,20,50), 0, 0,20,50,matrixD,true); ivNumD.setImageBitmap(bmNumD); } private Bitmap getBitmapFromView(View v,int width,int height ) { int widSpec = View.MeasureSpec.makeMeasureSpec(width,View.MeasureSpec.EXACTLY); int heiSpec = View.MeasureSpec.makeMeasureSpec(height,View.MeasureSpec.EXACTLY); //redesenhar o tamanho da imagem v.measure(widSpec, heiSpec); // v.layout(0, 0, width, height); Bitmap bitmap = Bitmap.createBitmap(width,height, Bitmap.Config.ARGB_8888); //desenhar a imagem Canvas canvas = new Canvas(bitmap); v.draw(canvas); return bitmap; } //definir um ângulo inclinado aleatório private int randomAngle() { return 20*(new Random().nextInt(5)-new Random().nextInt(3)); } //Gerar cor aleatoriamente private int randomColor() { colorArray[0]=0xFF000000; //BLACK colorArray[1] = 0xFFFF00FF; // MAGENTA colorArray[2] = 0xFFFF0000; // RED colorArray[3] = 0xFF00FF00; // GREEN colorArray[4] = 0xFF0000FF; // BLUE colorArray[5] = 0xFF00FFFF; // CYAN int randomColoId = new Random().nextInt(5); return colorArray[randomColoId]; } //Inicializar código de verificação private void initNum() { numStr=""; numStrTmp=""; for (int i = 0; i < numArray.length; i++) { //Gerar aleatoriamente10Número dentro int numIntTmp = new Random().nextInt(10); //Salvar cada código de verificação numStrTmp = String.valueOf(numIntTmp); //Salvar todo o código de verificação numStr = numStr+numStrTmp; numArray[i] = numIntTmp; } } private class OnClickListenerImpl implements View.OnClickListener { @Override public void onClick(View v) { //Quando clicar no botão de login if(v==btLogin){ //Verificar se o caractere da conta está vazio, if (TextUtils.isEmpty(userEditText.getText().toString())){ //Vazio ao tremular o aviso userEditText.setShakeAnimation(); Toast.makeText(MainActivity.this, "Conta ou senha não podem estar em branco", Toast.LENGTH_SHORT).show(); } //Verificar se o caractere da senha está vazio if (TextUtils.isEmpty(psdEditText.getText().toString())){ //Vazio ao tremular o aviso psdEditText.setShakeAnimation(); Toast.makeText(MainActivity.this, "Conta ou senha não podem estar em branco", Toast.LENGTH_SHORT).show(); } //Verificar se o código de verificação introduzido está correto if(etCheck.getText().toString() != null && etCheck.getText().toString().trim().length() > 0){ tvCheck.setVisibility(View.VISIBLE); if (numStr.equals(etCheck.getText().toString())){ tvCheck.setTextColor(Color.GREEN); tvCheck.setText("Código de verificação correto!"); }else{ tvCheck.setTextColor(Color.RED); tvCheck.setText("Código de verificação incorreto!"); etCheck.setText(""); setNum(); } } //Se o OnClick não for o botão de login, restará apenas a imagem de código de verificação com evento de escuta. É equivalente a clicar na imagem de código de verificação. Alterar o código de verificação. }else { setNum(); tvCheck.setVisibility(View.GONE); } } } }
Ponto de atenção:
1.Bitmap.createBitmap(getBitmapFromView(tvHideA,20,50), 0, 0,20,50, matrixA, true);
Bitmap.createBitmap(Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter)
Bitmap source: Bitmap original a partir do qual será feita a captura de tela
int x: Coordenada x de início
int y: Coordenada y de início
int width: Largura da imagem a ser cortada
int height: Altura da imagem a ser cortada
boolean filter Quando a transformação não é apenas de deslocamento, o parâmetro filter é true para permitir o processamento de filtragem, o que ajuda a melhorar a qualidade da nova imagem; false, o computador não faz processamento de filtragem.
2.intwidSpec = View.MeasureSpec.makeMeasureSpec(width, View.MeasureSpec.EXACTLY);
int heiSpec = View.MeasureSpec.makeMeasureSpec(height,View.MeasureSpec.EXACTLY);
Definir a largura e a altura do View. View.MeasureSpec.EXACTLY significa definir o tamanho real do View. Ou seja, o quanto o width(height) é grande, tanto quanto é grande.
3.Bitmap.createBitmap(width,height, Bitmap.Config.ARGB_8888); Criar um ícone.
4.Canvas canvas =newCanvas(bitmap);
.v.draw(canvas); Desenhar a imagem
5.v.measure(widSpec, heiSpec);
//v.layout(0,0, width, height); Redefinir o tamanho da imagem.
A seguir está a imagem de execução:
Quando há entrada, o ícone de exclusão rápida no lado direito é exibido, ao perder o foco, o ícone de exclusão rápida é escondido, clique para atualizar o código de verificação:
As seguintes figuras não serão detalhadas.
Download do código-fonte:http://xiazai.jb51.net/201610/yuanma/Androidlogin(jb51.net).rar
Isso é tudo o que há no artigo, esperamos que ajude na sua aprendizagem e que você apoie mais o tutorial Gritos.
Declaração: o conteúdo deste artigo é extraído da internet, pertencente ao respectivo detentor dos direitos autorais, o conteúdo é contribuído e carregado pelos usuários da internet, o site não possui direitos de propriedade, não foi editado manualmente e não assume responsabilidades legais relacionadas. Se você encontrar conteúdo suspeito de violação de direitos autorais, por favor, envie e-mail para: notice#oldtoolbag.com (ao enviar e-mail, substitua # por @ para denunciar e forneça provas relevantes. Atingida, o site deletará imediatamente o conteúdo suspeito de violação de direitos autorais.)