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

Código de implementación de una interfaz de inicio de sesión potente para Android

Introducción

     Una buena aplicación necesita una interfaz de inicio de sesión con una buena experiencia de usuario, ahora, muchas interfaces de inicio de sesión de aplicaciones tienen funciones como eliminación de nombre de usuario y contraseña con un solo clic, advertencia si el nombre de usuario y la contraseña están en blanco, y la necesidad de ingresar un código de verificación. Después de leer los artículos de los grandes maestros en csdn, pensé en escribir una interfaz de inicio de sesión para aprender, muchos aspectos se han referido a otros artículos y se han combinado. Sin más preámbulos, ahora veremos cómo se realiza. 

ps: como no quiero buscar imágenes, el ícono del programa es muy feo.
Ilustración durante la ejecución del programa:

Primero, el archivo de diseño no tiene dificultad.

<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, ingrese el nombre de usuario" 
 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, ingrese la contraseña" 
 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="Código de verificación"/> 
  <TextView 
  android:layout_height="wrap_content" 
  android:layout_width="wrap_content" 
  android:text="Resultado" 
  android:id="@"+id/tvCheck" 
  android:textSize="30dp" 
  android:visibility="gone"/> 
 </LinearLayout> 
 </LinearLayout> 
 <Button 
 android:id="@"+id/bt_login" 
 android:text="Iniciar sesión" 
 android:textSize="30dp" 
 android:layout_below="@id/lyYanzhengma" 
 android:layout_width="match_parent" 
 android:layout_height="wrap_content" /> 
</RelativeLayout> 

Luego es cargar algunos archivos de diseño y la inicialización de algunos控件

//botón de inicio de sesión 
 private Button btLogin; 
 //cuenta 
 private DeletableEditText userEditText; 
 //contraseña 
 private DeletableEditText psdEditText; 
 //texto numérico del captcha 
 private TextView tvHideA, tvHideB, tvHideC, tvHideD; 
 //texto de imagen del código de verificación 
 private ImageView ivNumA,ivNumB,ivNumC,ivNumD; 
 //texto de entrada del código de verificación 
 private EditText etCheck; 
 //texto de visualización de detección del código de verificación 
 private TextView tvCheck; 
 //almacenamiento de los números de cada código de verificación 
 private String numStrTmp = ""; 
 //almacenamiento de los números del código de verificación completo 
 private String numStr = ""; 
 //almacenamiento del array de códigos de verificación 
 private int[] numArray = new int[4; 
 //almacenamiento del array de colores 
 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(); 

El proceso de implementación de EditText personalizado:

Thinking:Configurar dos EidtText, en este EidtText configurar cada icono. El icono a la izquierda es el icono de sugerencia de cuenta y contraseña, y el icono a la derecha es uno de eliminación con un solo clic. Debido a que los iconos en el EidtText no tienen evento onClick, para lograr el efecto de eliminación con un solo clic se debe usar el método de devolución de llamada OnTouchEvent, para escuchar eventos de clic y lograr la eliminación con un solo clic. Cuando la cuenta y la contraseña no tienen caracteres, el icono de eliminación con un solo clic a la derecha se configura para que sea invisible, y cuando hay caracteres, se configura el icono para que sea visible. Al hacer clic en el rango del icono a la derecha, se elimina el carácter de la línea actual. De esta manera, se logra la eliminación con un solo clic. Además, cuando la cuenta y la contraseña están vacías y se desea iniciar sesión, se producen estos dos mensajes de vibración.
No quiero perder tiempo, aquí tienes los comentarios de código, muy 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; 
/** 
 * Creado por el administrador el 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() { 
 //Obtener los márgenes superior, inferior, izquierdo y derecho de la vista 
 Drawable[] drawables = this.getCompoundDrawables(); 
 // Obtener el Drawable en la posición de right 
 // Es decir, lo que hemos configurado en el archivo de disposición como android:drawableRight 
 mRightDrawable = drawables[2; 
 // configurar el escucha de cambio de foco 
 this.setOnFocusChangeListener(new FocusChangeListenerImpl()); 
 // configurar el escucha de cambios de texto de EditText 
 this.addTextChangedListener(new TextWatcherImpl()); 
 // al inicializar, hacer que el icono de limpiar de la derecha sea invisible 
 setClearDrawableVisible(false); 
 } 
 @Override 
 public boolean onTouchEvent(MotionEvent event) { 
 switch (event.getAction()) { 
  //cuando se suelta el clic, determinar la ubicación del clic. Aquí solo se realiza el juicio en la dirección X. 
  case MotionEvent.ACTION_UP: 
  //determinar si se ha hecho clic en el área del icono de la derecha 
  boolean isClean = (event.getX() > (getWidth() - getTotalPaddingRight())) 
   && (event.getX() < (getWidth() - getPaddingRight())); 
  if (isClean) { 
   //eliminar 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); 
  } 
 } 
 } 
 // cuando el texto se haya introducido, determinar si debe mostrarse el icono de limpiar en la derecha 
 private class TextWatcherImpl implements TextWatcher { 
 @Override 
 public void afterTextChanged(Editable s) { 
  //true when there are characters 
  boolean isVisible = getText().toString().length() >= 1; 
  //Display 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 o mostrar el icono de清洁 en la derecha 
 protected void setClearDrawableVisible(boolean isVisible) { 
 Drawable rightDrawable; 
 if (isVisible) { 
  rightDrawable = mRightDrawable; 
 } else { 
  rightDrawable = null; 
 } 
 // usar código para establecer el icono en la posición derecha de este controlador 
 setCompoundDrawables(getCompoundDrawables()[0], 
  getCompoundDrawables()[1], rightDrawable, 
  getCompoundDrawables()[3]); 
 } 
 // mostrar la animación 
 public void setShakeAnimation() { 
 this.startAnimation(shakeAnimation(5)); 
 } 
 // CycleTimes, el número de veces que se repetirá la animación 
 public Animation shakeAnimation(int CycleTimes) { 
 //establecer la animación de desplazamiento. 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); 
 //establecer la cantidad de veces que se repetirá la animación 
 translateAnimation.setInterpolator(new CycleInterpolator(CycleTimes)); 
 //establecer el intervalo de animación 
 translateAnimation.setDuration(1000); 
 return translateAnimation; 
 } 
} 

Dentro de lo que se debe tener en cuenta:

  1.Drawable[] drawables = this.getCompoundDrawables(); se obtiene el drawable de este View. El método getCompoundDrawables() devuelve4un objeto Drawable, que corresponde a los márgenes izquierdo, superior, derecho e inferior de este View

  2.boolean isClean = (event.getX() > (getWidth() - getTotalPaddingRight())) && (event.getX() < (getWidth() - getPaddingRight())); Check if the clicked area is within the range of the right icon. 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 where 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 it is not on this line.

 5.this.addTextChangedListener(new TextWatcherImpl()); Set text change listener. There is a new TextWatcher{} in3methods. 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 it. When text changes are detected, set the right icon to display.

TextWatcher {
 @Override
 public void afterTextChanged(Editable s) {
 //true when there are characters
 boolean isVisible = getText().toString().length() >= 1;
 //Display the icon on the right
 setClearDrawableVisible(isVisible);
 }

CaptchaImplementation process:

Thinking:set4ImageView. First, randomly generate4this10The numbers within are stored in an array. And the entire captcha is recorded. Using the Bitmap.createBitmap method to4Los números se convierten en imágenes y se establece un color aleatorio. Cada vez que se convierte una imagen de número, se establece aleatoriamente un ángulo de rotación para que4Los iconos numéricos se inclinan en un ángulo determinado. El captcha se ha generado.

El proceso de verificación del captcha es solo una simulación: compara el captcha ingresado con el captcha registrado. Si son iguales, sugiere que es correcto; si no, sugiere que es incorrecto. Y luego restablece el captcha.

Al hacer clic en el área de la imagen del captcha también se restablece el captcha.
Los comentarios del código son muy detallados. Aquí va el 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ón de inicio de sesión 
 private Button btLogin; 
 //cuenta 
 private DeletableEditText userEditText; 
 //contraseña 
 private DeletableEditText psdEditText; 
 //texto numérico del captcha 
 private TextView tvHideA, tvHideB, tvHideC, tvHideD; 
 //texto de imagen del código de verificación 
 private ImageView ivNumA,ivNumB,ivNumC,ivNumD; 
 //texto de entrada del código de verificación 
 private EditText etCheck; 
 //texto de visualización de detección del código de verificación 
 private TextView tvCheck; 
 //almacenamiento de los números de cada código de verificación 
 private String numStrTmp = ""; 
 //almacenamiento de los números del código de verificación completo 
 private String numStr = ""; 
 //almacenamiento del array de códigos de verificación 
 private int[] numArray = new int[4; 
 //almacenamiento del array de colores 
 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(); 
 //reestablecer la 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(); 
 //reestablecer la matriz 
 matrixB.reset(); 
  
 Bitmap bmNumB = Bitmap.createBitmap(getBitmapFromView(tvHideB,20,50), 0, 0,20,50,matrixB,true); 
 ivNumB.setImageBitmap(bmNumB); 
 Matrix matrixC = new Matrix(); 
 //reestablecer la matriz 
 matrixC.reset(); 
  
 Bitmap bmNumC = Bitmap.createBitmap(getBitmapFromView(tvHideC,20,50), 0, 0,20,50,matrixC,true); 
 ivNumC.setImageBitmap(bmNumC); 
 Matrix matrixD = new Matrix(); 
 //reestablecer la 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); 
 //redibujar el tamaño de la imagen 
 v.measure(widSpec, heiSpec); 
 // 
 v.layout(0, 0, width, height); 
 Bitmap bitmap = Bitmap.createBitmap(width,height, Bitmap.Config.ARGB_8888); 
 //dibujar la imagen 
 Canvas canvas = new Canvas(bitmap); 
 v.draw(canvas); 
 return bitmap; 
 } 
 //establecer el ángulo de inclinación aleatorio 
 private int randomAngle() { 
 return 20*(new Random().nextInt(5)-new Random().nextInt(3)); 
 } 
 //随机生成颜色 
 private int randomColor() { 
 colorArray[0]=0xFF000000; //NEGRO 
 colorArray[1] = 0xFFFF00FF; // MAGENTA 
 colorArray[2] = 0xFFFF0000; // ROJO 
 colorArray[3] = 0xFF00FF00; // VERDE 
 colorArray[4] = 0xFF0000FF; // AZUL 
 colorArray[5] = 0xFF00FFFF; // AZUL 
 int randomColoId = new Random().nextInt(5); 
 return colorArray[randomColoId]; 
 } 
 //初始化验证码 
 private void initNum() { 
 numStr=""; 
 numStrTmp=""; 
 for (int i = 0; i < numArray.length; i++) { 
  //随机生成10以内数字 
  int numIntTmp = new Random().nextInt(10); 
  //保存各个验证码 
  numStrTmp = String.valueOf(numIntTmp); 
  //保存整个验证码 
  numStr = numStr+numStrTmp; 
  numArray[i] = numIntTmp; 
 } 
 } 
 private class OnClickListenerImpl implements View.OnClickListener { 
 @Override 
 public void onClick(View v) { 
  //当点击的为登录按钮时 
  if(v==btLogin){ 
  //判断账户字符是否为空, 
  if (TextUtils.isEmpty(userEditText.getText().toString())){ 
   //当为空时抖动提示 
   userEditText.setShakeAnimation(); 
   Toast.makeText(MainActivity.this, "La cuenta o la contraseña no pueden estar vacías", Toast.LENGTH_SHORT).show(); 
  } 
  //判断密码字符是否为空 
  if (TextUtils.isEmpty(psdEditText.getText().toString())){ 
   //当为空时抖动提示 
   psdEditText.setShakeAnimation(); 
   Toast.makeText(MainActivity.this, "La cuenta o la contraseña no pueden estar vacías", Toast.LENGTH_SHORT).show(); 
  } 
  //Verificar si el código de verificación ingresado es correcto 
  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("¡Verificación de código correcta!"); 
   } else { 
   tvCheck.setTextColor(Color.RED); 
   tvCheck.setText("¡Verificación de código incorrecta!"); 
   etCheck.setText(""); 
   setNum(); 
   } 
  } 
  //Si el OnClick no es el botón de inicio de sesión, solo la imagen de verificación tiene eventos de escucha. Equivale a hacer clic en la imagen de verificación. Cambiar la verificación. 
  } else { 
  setNum(); 
  tvCheck.setVisibility(View.GONE); 
  } 
 } 
 } 
} 

Conocimientos a tener en cuenta:
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: el bitmap original del que se cortará la imagen
int x: la coordenada x de inicio
int y: la coordenada y de inicio
int width: la anchura de la imagen que se cortará
int height: la altura de la imagen que se cortará
boolean filter al realizar no solo transformaciones de desplazamiento, si filter es true se realiza un procesamiento de filtro, lo que ayuda a mejorar la calidad de la nueva imagen; si es false, el ordenador no realiza procesamiento de filtro. 

2.intwidSpec = View.MeasureSpec.makeMeasureSpec(width, View.MeasureSpec.EXACTLY);
  int heiSpec = View.MeasureSpec.makeMeasureSpec(height,View.MeasureSpec.EXACTLY);
 Establecer el ancho y la altura del View. View.MeasureSpec.EXACTLY significa establecer el tamaño real del View. Es decir, el tamaño de width(height) anterior es cuánto tanto.

3.Bitmap.createBitmap(width,height, Bitmap.Config.ARGB_8888); Crear un ícono. 

4.Canvas canvas =newCanvas(bitmap);
.v.draw(canvas); Dibujar la imagen

5.v.measure(widSpec, heiSpec);
//v.layout(0,0, width, height); Redibujar el tamaño de la imagen. 

A continuación se muestra la imagen en tiempo de ejecución:

Cuando hay entrada, el icono de eliminación automática en la derecha se muestra, cuando pierde el enfoque, el icono de eliminación automática se oculta, haga clic en actualizar el código de verificación para actualizar el código de verificación:

El siguiente no se detallará gráficamente.

Descarga del código fuente:http://xiazai.jb51.net/201610/yuanma/Androidlogin(jb51.net).rar

Esto es todo el contenido de este artículo, espero que sea útil para su aprendizaje y que todos los demás lo apoyen y alienten a Tutorial.

Declaración: El contenido de este artículo se ha obtenido de la red, pertenece al propietario original, el contenido se ha contribuido y subido por los usuarios de Internet de manera autónoma. Este sitio no posee los derechos de propiedad, no ha sido editado por humanos y no asume ninguna responsabilidad legal relacionada. Si encuentra contenido sospechoso de copyright, por favor envíe un correo electrónico a: notice#oldtoolbag.com (al enviar un correo electrónico, reemplace # con @) para denunciar y proporcionar evidencia relevante. Una vez verificada, este sitio eliminará inmediatamente el contenido sospechoso de infracción.

Te gustará