最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

功能強(qiáng)大的登錄界面Android實(shí)現(xiàn)代碼

 更新時間:2016年10月28日 17:15:52   作者:Mario_oo  
這篇文章主要為大家分享了功能強(qiáng)大的登錄界面Android實(shí)現(xiàn)代碼,驗(yàn)證碼制作方法,自帶一鍵刪除功能,用戶名密碼為空時抖動提示效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下

前言

     一個好的應(yīng)用需要一個有良好的用戶體驗(yàn)的登錄界面,現(xiàn)如今,許多應(yīng)用的的登錄界面都有著用戶名,密碼一鍵刪除,用戶名,密碼為空提示,以及需要輸入驗(yàn)證碼的功能??粗鴆sdn上的大牛們的文章,心里想著也寫一個登錄界面學(xué)習(xí)學(xué)習(xí),許多東西都是參考別的文章,綜合起來的。廢話少說,接下來看看是如何實(shí)現(xiàn)的。 

ps:由于懶得摳圖。所以程序的圖標(biāo)很難看。
程序運(yùn)行時的圖示:

首先是布局文件沒有什么難度。

<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="請輸入賬戶" 
 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="請輸入密碼" 
 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="驗(yàn)證碼"/> 
  <TextView 
  android:layout_height="wrap_content" 
  android:layout_width="wrap_content" 
  android:text="結(jié)果" 
  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> 

然后是加載一些布局文件,和一些控件的初始化

//登錄按鈕 
 private Button btLogin; 
 //賬戶 
 private DeletableEditText userEditText; 
 //密碼 
 private DeletableEditText psdEditText; 
 
 
 //驗(yàn)證碼的數(shù)字文本 
 private TextView tvHideA,tvHideB,tvHideC,tvHideD; 
 
 //驗(yàn)證碼的圖片文本 
 private ImageView ivNumA,ivNumB,ivNumC,ivNumD; 
 //驗(yàn)證碼輸入文本 
 private EditText etCheck; 
 //驗(yàn)證碼的檢測顯示文本 
 private TextView tvCheck; 
 
 //存儲每個驗(yàn)證碼的數(shù)字 
 private String numStrTmp = ""; 
 //存儲整個驗(yàn)證碼的數(shù)字 
 private String numStr = ""; 
 
 //存儲驗(yàn)證碼的數(shù)組 
 private int[] numArray = new int[4]; 
 //存儲顏色的數(shù)組 
 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(); 

自定義EditText的實(shí)現(xiàn)過程:

思路:設(shè)置兩個EidtText,在這個EditText中各設(shè)置圖標(biāo)。左邊圖標(biāo)為賬戶和密碼的圖標(biāo)提示,右邊圖標(biāo)為一鍵刪除 。因?yàn)镋ditText中的圖標(biāo)沒有onClick事件,為了實(shí)現(xiàn)點(diǎn)擊一鍵刪除效果所以要使用OnTouchEvent回調(diào)方法,監(jiān)聽點(diǎn)擊事件來判斷實(shí)現(xiàn)一鍵刪除。當(dāng)賬戶和密碼沒有字符時,右邊的一鍵刪除圖標(biāo)設(shè)置隱藏,當(dāng)有字符時,設(shè)置圖標(biāo)顯示。當(dāng)點(diǎn)擊到右邊圖標(biāo)范圍時,刪除所在行的字符。從而實(shí)現(xiàn)一鍵刪除。 此外,當(dāng)賬戶和密碼為空而要登錄時。這兩行抖動提示。
廢話不多說,直接上代碼注釋很清楚。

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; 
 
/** 
 * Created by Administrator on 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() { 
 
 //取的view的上下左右邊距 
 Drawable[] drawables = this.getCompoundDrawables(); 
 
 // 取得right位置的Drawable 
 // 即我們在布局文件中設(shè)置的android:drawableRight 
 mRightDrawable = drawables[2]; 
 
 // 設(shè)置焦點(diǎn)變化的監(jiān)聽 
 this.setOnFocusChangeListener(new FocusChangeListenerImpl()); 
 // 設(shè)置EditText文字變化的監(jiān)聽 
 this.addTextChangedListener(new TextWatcherImpl()); 
 // 初始化時讓右邊clean圖標(biāo)不可見 
 setClearDrawableVisible(false); 
 
 
 
 } 
 @Override 
 public boolean onTouchEvent(MotionEvent event) { 
 switch (event.getAction()) { 
  //當(dāng)點(diǎn)擊松開時判斷點(diǎn)擊的位置。這里只進(jìn)行了X軸方向的判斷。 
  case MotionEvent.ACTION_UP: 
  //判斷是否點(diǎn)擊到了右邊的圖標(biāo)區(qū)域 
  boolean isClean = (event.getX() > (getWidth() - getTotalPaddingRight())) 
   && (event.getX() < (getWidth() - getPaddingRight())); 
  if (isClean) { 
   //清除字符 
   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); 
  } 
 } 
 
 } 
 
 // 當(dāng)輸入結(jié)束后判斷是否顯示右邊clean的圖標(biāo) 
 private class TextWatcherImpl implements TextWatcher { 
 @Override 
 public void afterTextChanged(Editable s) { 
  //當(dāng)有字符時為true 
  boolean isVisible = getText().toString().length() >= 1; 
  //顯示右邊的圖標(biāo) 
  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) { 
 
 } 
 
 } 
 
 // 隱藏或顯示右邊clean的圖標(biāo) 
 protected void setClearDrawableVisible(boolean isVisible) { 
 Drawable rightDrawable; 
 if (isVisible) { 
  rightDrawable = mRightDrawable; 
 } else { 
  rightDrawable = null; 
 } 
 // 使用代碼設(shè)置該控件right處的圖標(biāo) 
 setCompoundDrawables(getCompoundDrawables()[0], 
  getCompoundDrawables()[1], rightDrawable, 
  getCompoundDrawables()[3]); 
 } 
 
 // 顯示動畫 
 public void setShakeAnimation() { 
 this.startAnimation(shakeAnimation(5)); 
 
 } 
 
 // CycleTimes動畫重復(fù)的次數(shù) 
 public Animation shakeAnimation(int CycleTimes) { 
 //設(shè)置偏移動畫 其中new TranslateAnimation(0,10,0,10)四個值表示為 X坐標(biāo)從0-->10,Y坐標(biāo)從0-->10 
 Animation translateAnimation = new TranslateAnimation(0, 10, 0, 10); 
 //設(shè)置動畫次數(shù) 
 translateAnimation.setInterpolator(new CycleInterpolator(CycleTimes)); 
 //設(shè)置動畫間隔 
 translateAnimation.setDuration(1000); 
 return translateAnimation; 
 } 
 
} 

其中需要注意的知識:

  1.Drawable[] drawables = this.getCompoundDrawables(); 得到此View的 drawable. getCompoundDrawables()方法得到的有4個Drawable對象,分別對應(yīng)此View的左,上,右,下的邊距

  2.boolean isClean = (event.getX() > (getWidth() - getTotalPaddingRight()))&& (event.getX() < (getWidth() - getPaddingRight()));  判斷點(diǎn)擊的區(qū)域是否為右邊圖標(biāo)范圍。其中event.getX()為點(diǎn)擊的位置的X坐標(biāo)大小。詳細(xì)如下圖所示:


 3.Animation translateAnimation = new TranslateAnimation(0, 10, 0, 10); 設(shè)置偏移動畫 其中new TranslateAnimation(0,10,0,10)四個值表示為 X坐標(biāo)從0-->10,Y坐標(biāo)從0-->10

 4.this.setOnFocusChangeListener(new FocusChangeListenerImpl());設(shè)置焦點(diǎn)變化的目的是為了更人性化。當(dāng)焦點(diǎn)在此行并且有字符時才顯示一鍵刪除圖標(biāo)。不在此行時圖標(biāo)隱藏。

 5.this.addTextChangedListener(new TextWatcherImpl()); 設(shè)置text變化監(jiān)聽。new TextWatcher{}中有3個方法。分別是:

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) {}
我們只需要在afterTextChanged(){Editable s}{}中添加要實(shí)現(xiàn)的方法即可。當(dāng)監(jiān)聽到text變化時,設(shè)置右邊圖標(biāo)顯示。

TextWatcher {
 @Override
 public void afterTextChanged(Editable s) {
 //當(dāng)有字符時為true
 boolean isVisible = getText().toString().length() >= 1;
 //顯示右邊的圖標(biāo)
 setClearDrawableVisible(isVisible);
 }

驗(yàn)證碼的實(shí)現(xiàn)過程:

思路:設(shè)置4個ImageView。 首先隨機(jī)生成4個10以內(nèi)的數(shù)字存儲在數(shù)組里。并且記錄整個驗(yàn)證碼。在利用Bitmap.createBitmap方法講這4個數(shù)字轉(zhuǎn)化為圖片并且設(shè)置隨機(jī)顏色。每個數(shù)字圖片轉(zhuǎn)化的時候在隨機(jī)設(shè)置旋轉(zhuǎn)角度使這4個數(shù)字圖標(biāo)傾斜一定的角度。 驗(yàn)證碼就生成了。

驗(yàn)證驗(yàn)證碼的過程只是模擬下: 將輸入的驗(yàn)證碼跟記錄的驗(yàn)證碼作比較。相同 提示正確,不同提示錯誤。并且重置驗(yàn)證碼。

點(diǎn)擊驗(yàn)證碼圖片區(qū)域也會重置驗(yàn)證碼。
代碼的注釋很詳細(xì)。上代碼~~~~: 

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 { 
 //登錄按鈕 
 private Button btLogin; 
 //賬戶 
 private DeletableEditText userEditText; 
 //密碼 
 private DeletableEditText psdEditText; 
 
 
 //驗(yàn)證碼的數(shù)字文本 
 private TextView tvHideA,tvHideB,tvHideC,tvHideD; 
 
 //驗(yàn)證碼的圖片文本 
 private ImageView ivNumA,ivNumB,ivNumC,ivNumD; 
 //驗(yàn)證碼輸入文本 
 private EditText etCheck; 
 //驗(yàn)證碼的檢測顯示文本 
 private TextView tvCheck; 
 
 //存儲每個驗(yàn)證碼的數(shù)字 
 private String numStrTmp = ""; 
 //存儲整個驗(yàn)證碼的數(shù)字 
 private String numStr = ""; 
 
 //存儲驗(yàn)證碼的數(shù)組 
 private int[] numArray = new int[4]; 
 //存儲顏色的數(shù)組 
 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(); 
 //重設(shè)矩陣 
 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(); 
 //重設(shè)矩陣 
 matrixB.reset(); 
 matrixB.setRotate(randomAngle()); 
 Bitmap bmNumB = Bitmap.createBitmap(getBitmapFromView(tvHideB,20,50),0,0,20,50,matrixB,true); 
 ivNumB.setImageBitmap(bmNumB); 
 
 Matrix matrixC = new Matrix(); 
 //重設(shè)矩陣 
 matrixC.reset(); 
 matrixC.setRotate(randomAngle()); 
 Bitmap bmNumC = Bitmap.createBitmap(getBitmapFromView(tvHideC,20,50),0,0,20,50,matrixC,true); 
 ivNumC.setImageBitmap(bmNumC); 
 
 Matrix matrixD = new Matrix(); 
 //重設(shè)矩陣 
 matrixD.reset(); 
 matrixD.setRotate(randomAngle()); 
 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); 
 //重新繪制圖片大小 
 v.measure(widSpec, heiSpec); 
 // 
 v.layout(0, 0, width, height); 
 Bitmap bitmap = Bitmap.createBitmap(width,height, Bitmap.Config.ARGB_8888); 
 
 //畫出圖片 
 Canvas canvas = new Canvas(bitmap); 
 v.draw(canvas); 
 
 return bitmap; 
 
 } 
 
 
 //設(shè)置隨機(jī)傾斜的角度 
 private int randomAngle() { 
 
 
 return 20*(new Random().nextInt(5)-new Random().nextInt(3)); 
 } 
 
 
 
 //隨機(jī)生成顏色 
 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]; 
 
 
 
 
 } 
 //初始化驗(yàn)證碼 
 private void initNum() { 
 numStr=""; 
 numStrTmp=""; 
 for (int i = 0; i < numArray.length; i++) { 
  //隨機(jī)生成10以內(nèi)數(shù)字 
  int numIntTmp = new Random().nextInt(10); 
  //保存各個驗(yàn)證碼 
  numStrTmp = String.valueOf(numIntTmp); 
  //保存整個驗(yàn)證碼 
  numStr = numStr+numStrTmp; 
  numArray[i] = numIntTmp; 
 } 
 
 } 
 
 private class OnClickListenerImpl implements View.OnClickListener { 
 @Override 
 public void onClick(View v) { 
  //當(dāng)點(diǎn)擊的為登錄按鈕時 
  if(v==btLogin){ 
  //判斷賬戶字符是否為空, 
  if (TextUtils.isEmpty(userEditText.getText().toString())){ 
   //為空時抖動提示 
   userEditText.setShakeAnimation(); 
   Toast.makeText(MainActivity.this,"賬戶或密碼不能為空",Toast.LENGTH_SHORT).show(); 
  } 
  //判斷密碼字符是否為空 
  if (TextUtils.isEmpty(psdEditText.getText().toString())){ 
   //為空時抖動提示 
   psdEditText.setShakeAnimation(); 
   Toast.makeText(MainActivity.this,"賬戶或密碼不能為空",Toast.LENGTH_SHORT).show(); 
  } 
 
  //驗(yàn)證輸入的驗(yàn)證碼是否正確 
  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("驗(yàn)證碼正確!"); 
   }else{ 
   tvCheck.setTextColor(Color.RED); 
   tvCheck.setText("驗(yàn)證碼錯誤!"); 
   etCheck.setText(""); 
   setNum(); 
   } 
  } 
  //如果OnClick不是登錄按鈕時只剩下驗(yàn)證碼圖片有監(jiān)聽事件。等同于點(diǎn)擊驗(yàn)證碼圖片。改變驗(yàn)證碼。 
  }else { 
  setNum(); 
  tvCheck.setVisibility(View.GONE); 
  } 
 
 
 } 
 } 
} 

需要注意的知識:
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:要從中截圖的原始位圖
int x:  起始x坐標(biāo)
int y:起始y坐標(biāo)
int width:  要截的圖的寬度
int height:要截的圖的高度
boolean filter 當(dāng)進(jìn)行的不只是平移變換時,filter參數(shù)為true可以進(jìn)行濾波處理,有助于改善新圖像質(zhì)量;flase時,計算機(jī)不做過濾處理。 

2.intwidSpec = View.MeasureSpec.makeMeasureSpec(width,View.MeasureSpec.EXACTLY);
  int heiSpec = View.MeasureSpec.makeMeasureSpec(height,View.MeasureSpec.EXACTLY);
 設(shè)置View的寬和高。View.MeasureSpec.EXACTLY 指的是設(shè)置為實(shí)際View的大小。即前面的width(height)為多大就為多大。

3.Bitmap.createBitmap(width,height, Bitmap.Config.ARGB_8888); create一個圖標(biāo)。 

4.Canvas canvas =newCanvas(bitmap);
v.draw(canvas);  畫出圖片

5.v.measure(widSpec, heiSpec);
//v.layout(0,0, width, height);  重新繪制圖片的大小。 

后面是運(yùn)行時的圖片:

當(dāng)有輸入時右邊的一鍵刪除圖標(biāo)顯示、當(dāng)失去焦點(diǎn)時一鍵刪除圖標(biāo)隱藏、點(diǎn)擊驗(yàn)證碼更新驗(yàn)證碼:

后面的就不詳細(xì)圖示了。

源碼下載:http://xiazai.jb51.net/201610/yuanma/Androidlogin(jb51.net).rar

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 簡介Android 中的AsyncTask

    簡介Android 中的AsyncTask

    AsyncTask是一個很常用的API,尤其異步處理數(shù)據(jù)并將數(shù)據(jù)應(yīng)用到視圖的操作場合。接下來通過本文給大家介紹Android 中的AsyncTask,感興趣的朋友一起學(xué)習(xí)吧
    2016-03-03
  • Android入門之畫圖詳解

    Android入門之畫圖詳解

    這篇文章主要介紹了Android入門之畫圖,對Android初學(xué)者有很好的學(xué)習(xí)借鑒價值,需要的朋友可以參考下
    2014-08-08
  • Android?Activity啟動流程刨析

    Android?Activity啟動流程刨析

    Activity作為Android四大組件之一,他的啟動絕對沒有那么簡單。這里涉及到了系統(tǒng)服務(wù)進(jìn)程,啟動過程細(xì)節(jié)很多,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值
    2022-08-08
  • Android PullToRefreshLayout下拉刷新控件的終結(jié)者

    Android PullToRefreshLayout下拉刷新控件的終結(jié)者

    這篇文章主要介紹了Android自定義控件實(shí)戰(zhàn)中下拉刷新控件終結(jié)者PullToRefreshLayout的實(shí)現(xiàn)方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-03-03
  • Android MediaPlayer實(shí)現(xiàn)音樂播放器實(shí)例代碼

    Android MediaPlayer實(shí)現(xiàn)音樂播放器實(shí)例代碼

    這篇文章主要介紹了Android MediaPlayer實(shí)現(xiàn)音樂播放器實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • Android控件View的文字周圍添加圖標(biāo)

    Android控件View的文字周圍添加圖標(biāo)

    這篇文章主要為大家詳細(xì)介紹了Android控件View的文字周圍添加圖標(biāo),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • android 仿微信demo——微信通訊錄界面功能實(shí)現(xiàn)(移動端,服務(wù)端)

    android 仿微信demo——微信通訊錄界面功能實(shí)現(xiàn)(移動端,服務(wù)端)

    本系列文章主要介紹了微信小程序-閱讀小程序?qū)嵗╠emo),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望能給你們提供幫助
    2021-06-06
  • Android 高仿微信語音聊天頁面高斯模糊(毛玻璃效果)

    Android 高仿微信語音聊天頁面高斯模糊(毛玻璃效果)

    大家在使用微信聊天的時候有沒有注意到微信語言聊天用的是高斯模糊效果,基于代碼是如何實(shí)現(xiàn)的呢?下面小編給大家?guī)砹薃ndroid 高仿微信語音聊天頁面高斯模糊(毛玻璃效果),感興趣的朋友一起看下吧
    2016-08-08
  • Android控件View打造完美的自定義側(cè)滑菜單

    Android控件View打造完美的自定義側(cè)滑菜單

    這篇文章主要介紹了Android控件View打造完美的自定義側(cè)滑菜單的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • Android信息界面編輯及組合控件的封裝

    Android信息界面編輯及組合控件的封裝

    這篇文章主要為大家詳細(xì)介紹了Android信息界面的編輯,及組合控件的封裝,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-04-04

最新評論

怀柔区| 永济市| 阿拉善盟| 美姑县| 宁德市| 文成县| 宁远县| 乐至县| 闸北区| 武隆县| 准格尔旗| 丘北县| 丹阳市| 景德镇市| 敦化市| 辉县市| 长沙市| 日土县| 仙游县| 和静县| 鞍山市| 南宫市| 科技| 安岳县| 台北县| 昌乐县| 怀柔区| 大名县| 鄂州市| 雷波县| 两当县| 辰溪县| 大足县| 普定县| 南木林县| 徐汇区| 花莲县| 基隆市| 怀远县| 沙雅县| 岳普湖县|