How to make slide to unlock button in android

前端 未结 11 563
心在旅途
心在旅途 2020-12-23 18:05

Hi I want a button that should work as \'slide to unlock\' button of IOS

in short I want a button that has no click effect but can slide left to right while drag and

11条回答
  •  春和景丽
    2020-12-23 18:40

    I Hope below Ans is work,

        public class UnlockSliderView extends FrameLayout {
        @BindView(R2.id.tv_unlock_slider)
        TextView tvUnlockSlider;
    
        @BindView(R2.id.iv_circle_slide)
        ImageView ivCircleSlide;
    
        private View parentCircle;
    
        private float xOrigin = 0;
        private float xOriginCircle = 0;
        private boolean circleTouched = false;
    
        public UnlockSliderView(Context context) {
            super(context);
            init();
        }
    
        public UnlockSliderView(Context context, AttributeSet attrs) {
            super(context, attrs);
            init();
        }
    
        public UnlockSliderView(Context context, AttributeSet attr, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            init();
        }
    
        private void init() {
            inflate(getContext(), R.layout.layout_unlock_slider_view, this);
            ButterKnife.bind(this);
    
            parentCircle = (View) ivCircleSlide.getParent();
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                eventActionDown(event);
            } else if (event.getAction() == MotionEvent.ACTION_MOVE) {
                eventActionMove(event);
            } else if (event.getAction() == MotionEvent.ACTION_UP) {
                unlockFinish();
            }
            return true;
        }
    
        private void eventActionDown(MotionEvent event) {
            if ((event.getX() >= ivCircleSlide.getX() && event.getX() <= ivCircleSlide.getX() + ivCircleSlide.getWidth())
                    && (event.getY() >= ivCircleSlide.getY() && event.getY() <= ivCircleSlide.getY() + ivCircleSlide.getHeight())) {
                xOrigin = event.getX();
                xOriginCircle = ivCircleSlide.getX();
                circleTouched = true;
            } else {
                circleTouched = false;
            }
        }
    
        private void eventActionMove(MotionEvent event) {
            if (circleTouched) {
                float newXCircle = xOriginCircle + (event.getX() - xOrigin);
                newXCircle = (newXCircle < xOriginCircle) ? xOriginCircle : newXCircle;
                newXCircle = (newXCircle > parentCircle.getWidth() - ivCircleSlide.getWidth() - xOriginCircle) ? parentCircle.getWidth() - ivCircleSlide.getWidth() - xOriginCircle : newXCircle;
                float alpha = 1 - ((newXCircle - xOriginCircle) / (parentCircle.getWidth() - ivCircleSlide.getWidth() - (xOriginCircle * 2)));
                tvUnlockSlider.setAlpha(alpha);
                ivCircleSlide.setX(newXCircle);
                if (newXCircle == parentCircle.getWidth() - ivCircleSlide.getWidth() - xOriginCircle) {
                    unlockFinish();
                    if (mListener != null) mListener.onUnlock();
                }
            }
        }
    
        private void unlockFinish() {
            if (circleTouched) {
                ivCircleSlide.animate().x(xOriginCircle).setDuration(400).start();
                tvUnlockSlider.animate().alpha(1).setDuration(400).start();
                circleTouched = false;
            }
        }
    
    
    
    
       and the xml is,
    
      
       
    
        
    
        
    
    
    

提交回复
热议问题