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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM