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

 

你可能感兴趣的:([android] 切换按钮-自定义控件-拖动效果)