zoukankan      html  css  js  c++  java
  • [android] 切换按钮-自定义控件-拖动效果

    重写ViewonTouchEvent()方法,传递进来MotionEvent对象

    调用MotionEvent对象的getAction()方法,获取当前动作

    switch判断一下当前动作

    事件为MotionEvent.ACTION_DOWN是手指第一次触摸屏幕

    事件为MotionEvent.ACTION_MOVE是手指在屏幕上移动

    事件为MotionEvent.ACTION_UP是手指离开屏幕

    当手指触摸到屏幕

    定义手指最后的坐标lastX

    调用MotionEvent对象的getX() 方法,得到lastX的值

    当手指在屏幕上移动

    定义手指横向移动的距离dis

    调用getX()-lastX就是移动的距离

    定义滑动按钮的左边就是这个移动的距离

    判断slideBtnLeft位于合理的位置,0到背景图的宽度-滑动按钮的宽度

    调用invalidate()方法,刷新视图

    onClick事件和onTouchEvent是有冲突

    定义一个标志isDrag变量,如果有拖动发生,就把这个变量赋值true

    onCllick()方法里面对这个变量进行判断

    当手指抬起的时候

    判断当前slideBtnLeft来确定当前按钮是开还是关的状态

    slideBtnLeft比较 maxLeft的一半就能判断当前状态

    package com.tsh.myswitchbtn;
    
    import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.Canvas;
    import android.graphics.Paint;
    import android.util.AttributeSet;
    import android.view.MotionEvent;
    import android.view.View;
    import android.view.View.OnClickListener;
    
    public class MyToggleBtn extends View implements OnClickListener {
        //背景图片
        private Bitmap bitmapBackground;
        //按钮图片
        private Bitmap bitmapBtn;
        private Paint paint;
        /**
         * 布局文件中使用
         * @param context
         * @param attrs
         */
        public MyToggleBtn(Context context, AttributeSet attrs) {
            super(context, attrs);
            initView();
        }
        /**
         * 初始化view
         */
        private void initView() {
            bitmapBackground=BitmapFactory.decodeResource(getResources(), R.drawable.switch_background);
            bitmapBtn=BitmapFactory.decodeResource(getResources(), R.drawable.slide_button);
            paint=new Paint();
            paint.setAntiAlias(true);
            //点击事件
            setOnClickListener(this);
        }
        /**
         * 计算大小
         */
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            setMeasuredDimension(bitmapBackground.getWidth(), bitmapBackground.getHeight());
        }
        //当前状态
        private boolean currentState=false;
        //滑动按钮的当前left
        private float slideBtnLeft=0;
        /**
         * 绘制view
         */
        @Override
        protected void onDraw(Canvas canvas) {
            //绘制背景
            canvas.drawBitmap(bitmapBackground, 0, 0, paint);
            //绘制滑动按钮
            canvas.drawBitmap(bitmapBtn, slideBtnLeft, 0, paint);
        }
        private boolean isDrag=false;
        /**
         * 点击事件
         */
        @Override
        public void onClick(View v) {
            //解决与移动事件的冲突
            if(!isDrag){
                currentState = !currentState;
                flushState();
            }
    
        }
    
        private int lastX;
        /**
         * 触摸事件
         */
        private int firstX;
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            super.onTouchEvent(event);
            switch(event.getAction()){
                //手指按下
                case MotionEvent.ACTION_DOWN:
                    firstX=lastX=(int) event.getX();
                    isDrag=false;
                break;
                //手指移动
                case MotionEvent.ACTION_MOVE:
                    //解决与点击事件冲突
                    if(Math.abs(event.getX()-firstX)>5){
                        isDrag=true;
                    }
                    
                    int dis=(int) event.getX()-lastX;
                    slideBtnLeft=slideBtnLeft+dis;
                    lastX=(int) event.getX();
                break;
                //手指抬起
                case MotionEvent.ACTION_UP:
                    if(isDrag){
                        int maxLeft = bitmapBackground.getWidth()
                                - bitmapBtn.getWidth();
                        if (slideBtnLeft >= maxLeft / 2) {
                            currentState = true;
                        } else {
                            currentState = false;
                        }
                        flushState();
                    }
                break;
            }
            flushView();
            
            return true;
        }
        /**
         * 刷新状态
         */
        private void flushState() {
            if (currentState == true) {
                slideBtnLeft = bitmapBackground.getWidth()
                        - bitmapBtn.getWidth();
            } else {
                slideBtnLeft = 0;
            }
            invalidate();
        }
        /**
         * 刷新视图
         */
        private void flushView() {
            int maxLeft=bitmapBackground.getWidth()-bitmapBtn.getWidth();
            slideBtnLeft=(slideBtnLeft>0) ? slideBtnLeft : 0;
            slideBtnLeft=(slideBtnLeft<maxLeft) ? slideBtnLeft:maxLeft;
            invalidate();
        }
    }
  • 相关阅读:
    圆形按钮窗口控制-不断减少的圆圈
    图像按钮和模拟Windows媒体播放器UI
    圆形按钮
    本机Win32主题感知所有者绘制控件没有MFC
    CRegionButton -一个多向按钮
    Iconits
    CxShadeButton
    管道符 |
    gedit
    more/less
  • 原文地址:https://www.cnblogs.com/taoshihan/p/5456925.html
Copyright © 2011-2022 走看看