国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android自定義UI手勢(shì)密碼簡單版

2019-12-12 04:52:04
字體:
供稿:網(wǎng)友

先看看效果圖:

ImageLockActivity

package com.example.imagelock;  import com.example.view.NinePointLineView;  import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.view.View;  public class ImageLockActivity extends Activity {    @Override   public void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     View v = new NinePointLineView(this);     setContentView(v);   } } 

NinePointLineView

package com.example.view;  import com.example.imagelock.R;  import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Paint.Cap; import android.graphics.Typeface; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.widget.Toast;  public class NinePointLineView extends View {    /**    * 定義3個(gè)Paint,還有一個(gè)坐標(biāo)圓點(diǎn)圖片    */   Paint linePaint = new Paint();   Paint whiteLinePaint = new Paint();   Paint textPaint = new Paint();   Bitmap defaultBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.lock);      PointInfo[] points = new PointInfo[9];   int width, height;   //坐標(biāo)點(diǎn)的半徑長度   int defaultBitmapRadius = defaultBitmap.getWidth() / 2;    //繪制密碼時(shí)候出現(xiàn)的原點(diǎn)的直徑,半徑   Bitmap selectedBitmap = BitmapFactory.decodeResource(getResources(),       R.drawable.indicator_lock_area);   int selectedBitmapDiameter = selectedBitmap.getWidth();   int selectedBitmapRadius = selectedBitmapDiameter / 2;      StringBuffer lockString = new StringBuffer();    Context context;   /** 構(gòu)造器*********************************************/   public NinePointLineView(Context context) {     super(context);     this.context = context;     this.setBackgroundColor(Color.WHITE);     initPaint();   }    public NinePointLineView(Context context, AttributeSet attrs) {     super(context, attrs);     this.context = context;     this.setBackgroundColor(Color.WHITE);     initPaint();   }   private void initPaint() {     //線--包裹9個(gè)原點(diǎn)     linePaint.setColor(Color.RED);     linePaint.setStrokeWidth(defaultBitmap.getWidth());     linePaint.setAntiAlias(true);     linePaint.setStrokeCap(Cap.ROUND);     //線內(nèi)--比原點(diǎn)直徑少5     whiteLinePaint.setColor(Color.GREEN);     whiteLinePaint.setStrokeWidth(defaultBitmap.getWidth() - 5);     whiteLinePaint.setAntiAlias(true);     whiteLinePaint.setStrokeCap(Cap.ROUND);     //字體設(shè)置     textPaint.setTextSize(30);     textPaint.setAntiAlias(true);     textPaint.setTypeface(Typeface.MONOSPACE);   }    /**********************************************************    * 測(cè)量    */   @Override   protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {     width = getWidth();     height = getHeight();     if (width != 0 && height != 0) {       initPoints(points);     }     super.onMeasure(widthMeasureSpec, heightMeasureSpec);   }    /**    * 初始化原點(diǎn)    */   private void initPoints(PointInfo[] points) {      int len = points.length;      //2個(gè)原點(diǎn)的間距     int seletedSpacing = (width - selectedBitmapDiameter * 3) / 4;      //第1個(gè)原點(diǎn)的坐標(biāo)     int seletedX = seletedSpacing;     int seletedY = height - width + seletedSpacing;      //第1個(gè)原點(diǎn)內(nèi)部的小圓的坐標(biāo)     int defaultX = seletedX + selectedBitmapRadius - defaultBitmapRadius;     int defaultY = seletedY + selectedBitmapRadius - defaultBitmapRadius;      for (int i = 0; i < len; i++) {       //第4、7個(gè)原點(diǎn)       if (i == 3 || i == 6) {         seletedX = seletedSpacing;         //第一個(gè)原點(diǎn)y坐標(biāo)+直徑+2點(diǎn)間距離         seletedY += selectedBitmapDiameter + seletedSpacing;          defaultX = seletedX + selectedBitmapRadius             - defaultBitmapRadius;         //第一個(gè)原點(diǎn)y坐標(biāo)+直徑+2點(diǎn)間距離         defaultY += selectedBitmapDiameter + seletedSpacing;        }       points[i] = new PointInfo(i, defaultX, defaultY, seletedX, seletedY);        //原點(diǎn)坐標(biāo)xy為直徑+2點(diǎn)間距離       seletedX += selectedBitmapDiameter + seletedSpacing;       defaultX += selectedBitmapDiameter + seletedSpacing;      }   }   /*****************************************************************/   @Override   protected void onLayout(boolean changed, int left, int top, int right,       int bottom) {     super.onLayout(changed, left, top, right, bottom);   }    private int startX = 0, startY = 0;   PointInfo startPoint = null;   @Override   protected void onDraw(Canvas canvas) {      drawNinePoint(canvas);      super.onDraw(canvas);   }   /**    *    * @param canvas    */   private void drawNinePoint(Canvas canvas) {      if (startPoint != null) {       drawEachLine(canvas, startPoint);     }      for(PointInfo pointInfo : points) {       if (pointInfo!=null) {                  if (pointInfo.isSelected()) {                 canvas.drawBitmap(selectedBitmap, pointInfo.getSeletedX(),pointInfo.getSeletedY(), null);         }         canvas.drawBitmap(defaultBitmap, pointInfo.getDefaultX(),pointInfo.getDefaultY(), null);       }     }    }   private void drawEachLine(Canvas canvas, PointInfo point) {     if (point.hasNextId()) {       int n = point.getNextId();       drawLine(canvas, point.getCenterX(), point.getCenterY(),           points[n].getCenterX(), points[n].getCenterY());       drawEachLine(canvas, points[n]);     }   }    private void drawLine(Canvas canvas, float startX, float startY,       float stopX, float stopY) {     canvas.drawLine(startX, startY, stopX, stopY, linePaint);     canvas.drawLine(startX, startY, stopX, stopY, whiteLinePaint);   } /**  * ********************************************************************  */   boolean isUp = false;   int moveX, moveY;   @Override   public boolean onTouchEvent(MotionEvent event) {      boolean flag = true;     //isUp默認(rèn)是false--繪制是否完畢,此時(shí)為true     if (isUp) {       finishDraw();        Toast.makeText(context, "繪制完畢,手指離開,在點(diǎn)擊", 0).show();       flag = false;      } else {       handlingEvent(event);       flag = true;       Toast.makeText(context, "手指一旦繪制", 0).show();      }     //是否處理事件     return flag;   }   private void finishDraw() {     for (PointInfo temp : points) {       temp.setSelected(false);       temp.setNextId(temp.getId());     }     lockString.delete(0, lockString.length());     isUp = false;     invalidate();   }    private void handlingEvent(MotionEvent event) {     switch (event.getAction()) {     case MotionEvent.ACTION_MOVE:       moveX = (int) event.getX();       moveY = (int) event.getY();       for (PointInfo temp : points) {         if (temp.isInMyPlace(moveX, moveY) && temp.isSelected()==false) {           temp.setSelected(true);           startX = temp.getCenterX();           startY = temp.getCenterY();           int len = lockString.length();           if (len != 0) {             int preId = lockString.charAt(len - 1) - 48;             points[preId].setNextId(temp.getId());           }           lockString.append(temp.getId());           break;         }       }       invalidate();       break;      case MotionEvent.ACTION_DOWN:       //獲取按下的xy坐標(biāo)       int downX = (int) event.getX();       int downY = (int) event.getY();       for (PointInfo temp : points) {         //如果符合距離范圍內(nèi)         if (temp.isInMyPlace(downX, downY)) {           //將其設(shè)置為選中狀態(tài)           temp.setSelected(true);           //將選中的圓點(diǎn)設(shè)置為起始位置圓點(diǎn)           startPoint = temp;           //將其圓心作為起始點(diǎn)           startX = temp.getCenterX();           startY = temp.getCenterY();           lockString.append(temp.getId());           break;         }       }       invalidate();       break;      case MotionEvent.ACTION_UP:       startX = startY = moveX = moveY = 0;       //繪制完畢       isUp = true;       invalidate();       break;     default:       break;     }   }      /**    * 原點(diǎn)bean    */   private class PointInfo {     private boolean selected;      private int id;      private int nextId;      private int defaultX;      private int defaultY;      private int seletedX;      private int seletedY;      public PointInfo(int id, int defaultX, int defaultY, int seletedX,         int seletedY) {       this.id = id;       this.nextId = id;       this.defaultX = defaultX;       this.defaultY = defaultY;       this.seletedX = seletedX;       this.seletedY = seletedY;     }      public boolean isSelected() {       return selected;     }      public void setSelected(boolean selected) {       this.selected = selected;     }      public int getId() {       return id;     }      public int getDefaultX() {       return defaultX;     }      public int getDefaultY() {       return defaultY;     }      public int getSeletedX() {       return seletedX;     }      public int getSeletedY() {       return seletedY;     }      public int getCenterX() {       return seletedX + selectedBitmapRadius;     }      public int getCenterY() {       return seletedY + selectedBitmapRadius;     }      public boolean hasNextId() {       return nextId != id;     }      public int getNextId() {       return nextId;     }      public void setNextId(int nextId) {       this.nextId = nextId;     }      /**      * 如果某個(gè)xy值在某個(gè)原點(diǎn)的左右上下范圍內(nèi),就說明ok      */     public boolean isInMyPlace(int x, int y) {       boolean inX = x > seletedX           && x < (seletedX + selectedBitmapDiameter);       boolean inY = y > seletedY           && y < (seletedY + selectedBitmapDiameter);        return (inX && inY);     }    }  } 

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 临江市| 孙吴县| 万州区| 鄂托克旗| 青阳县| 遵化市| 东乡| 河池市| 应城市| 屏东市| 武义县| 隆昌县| 巴林左旗| 永吉县| 常德市| 安陆市| 万安县| 方正县| 台湾省| 沧州市| 东乌| 昌黎县| 滕州市| 宜兰县| 调兵山市| 乐都县| 三河市| 墨竹工卡县| 金沙县| 屯门区| 分宜县| 泰顺县| 苗栗市| 商南县| 扶沟县| 闵行区| 克什克腾旗| 义马市| 灵寿县| 肇庆市| 自治县|