English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Código de Implementação do Interface de Login Potente do Android

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.)

Você Também Pode Gostar