androidスライドロック解除

3919 ワード

AndroidカスタムViewで横方向のスライドロック解除を実現し、1、真ん中にスライドすると自動的に元の位置に戻り、2、底部をスライドすると自動的にロック解除され、ロック解除のコールバックがトリガーされます.まず、効果図を見てみましょう.
上記の部分は全部で3つの部分に分けられます.
  • 背景はshapeを通過する.xml実装
  • スライドのロックは1枚の画像
  • です.
  • 文字はペイントによって中央に描画され、高さは
  • カスタマイズ可能である.
    主に実現の主な部分を紹介します.
    (1)カスタム属性は次のとおりです.
       
              
            
            
          
          
    
    

    (2)ondraw()メソッドの書き換え、テキストとロックの描画:
    @Overrideprotected void onDraw(Canvas canvas) 
    {  
          canvas.getClipBounds(mTipsTextRect);   
          int cHeight = mTipsTextRect.height();    
          int cWidth = mTipsTextRect.width();   
          mPaint.setTextAlign(Paint.Align.LEFT);   
          mPaint.getTextBounds(mTipText, 0, mTipText.length(), mTipsTextRect);   
          float x = cWidth / 2f - mTipsTextRect.width() / 2f - mTipsTextRect.left;   
          float y = cHeight / 2f + mTipsTextRect.height() / 2f - mTipsTextRect.bottom;   
          canvas.drawText(mTipText, x, y, mPaint);   
          int rightMax = getWidth() - mLockRadius * 2;    
           if (mLocationX < 0) {      
                 canvas.drawBitmap(mLockBitmap, 0, 0, mPaint);   
           } else if (mLocationX > rightMax) {    
                 canvas.drawBitmap(mLockBitmap, rightMax, 0, mPaint);  
           } else {      
              canvas.drawBitmap(mLockBitmap, mLocationX, 0, mPaint); 
       }
    }
    

    (3)最も重要なステップは、タッチイベントの処理であり、1、タッチスクリーンがACTION_DOWNイベントは、計算時にロックに触れ、ロックに触れたときにのみスライドする.2、指が移動した場合、新しい位置を取得した後、新しい位置を計算し、再描画し、反対側に移動してロック解除に成功した場合、コールバック方法を実行してロック解除に成功した.3、指がスクリーンを離れた後に再びreset Viewを行い、アニメーションは初期位置に戻る:
     @Override
        public boolean onTouchEvent(MotionEvent event) {
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN: {
                    float xPos = event.getX();
                    float yPos = event.getY();
                    if (isTouchLock(xPos, yPos)) {
                        mLocationX = xPos - mLockRadius;
                        mIsDragable = true;
                        invalidate();
                    } else {
                        mIsDragable = false;
                    }
                    return true;
                }
                case MotionEvent.ACTION_MOVE: {
    
                    if (!mIsDragable) return true;
    
                    int rightMax = getWidth() - mLockRadius * 2;
                    resetLocationX(event.getX(),rightMax);
                    invalidate();
    
                    if (mLocationX >= rightMax){
                        mIsDragable = false;
                        mLocationX = 0;
                        invalidate();
                        if (mLockListener != null){
                            mLockListener.onOpenLockSuccess();
                        }
                        Log.e("AnimaterListener","    ");
                    }
    
                    return true;
                }
                case MotionEvent.ACTION_UP: {
                    if (!mIsDragable) return true;
                    resetLock();
                    break;
                }
            }
            return super.onTouchEvent(event);
        }
    

    (4)初期位置に戻るresetLockコードは以下の通りである.
        private void resetLock(){
            ValueAnimator anim = ValueAnimator.ofFloat(mLocationX,0);
            anim.setDuration(300);
            anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                @Override
                public void onAnimationUpdate(ValueAnimator valueAnimator) {
                    mLocationX = (Float) valueAnimator.getAnimatedValue();
                    invalidate();
                }
            });
            anim.start();
        }
    

    これがスライドロック解除を完了する主なステップで、最後にgithubアドレスはSlideViewにあります.