[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(); 
    } 
}

 

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/tech/app/5401.html

(0)
上一篇 2021年7月16日 23:47
下一篇 2021年7月16日 23:47

相关推荐

发表回复

登录后才能评论