[android] 切换按钮-自定义控件-拖动效果

[android] 切换按钮-自定义控件-拖动效果,第1张

概述重写View的onTouchEvent()方法,传递进来MotionEvent对象 调用MotionEvent对象的getAction()方法,获取当前动作 switch判断一下当前动作 事件为Mot

 

重写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; androID.graphics.Bitmap; androID.graphics.BitmapFactory; androID.graphics.Canvas; androID.graphics.Paint; androID.util.AttributeSet; androID.vIEw.MotionEvent; androID.vIEw.VIEw; androID.vIEw.VIEw.OnClickListener;public class MyToggleBtn extends VIEw implements OnClickListener {    //背景图片    private Bitmap bitmapBackground;    按钮图片     Bitmap bitmapBtn;     Paint paint;    /**     * 布局文件中使用     * @param context     *  attrs     */    public MyToggleBtn(Context context,AttributeSet attrs) {        super(context,attrs);        initVIEw();    }         * 初始化vIEw     private voID initVIEw() {        bitmapBackground=BitmapFactory.decodeResource(getResources(),R.drawable.switch_background);        bitmapBtn=new Paint();        paint.setAntiAlias(true);        点击事件        setonClickListener(this);    }         * 计算大小     */    @OverrIDe    protected voID onMeasure(int wIDthMeasureSpec,int heightmeasureSpec) {        setMeasuredDimension(bitmapBackground.getWIDth(),bitmapBackground.getHeight());    }    当前状态    boolean currentState=false;    滑动按钮的当前left    float slIDeBtnleft=0     * 绘制vIEw      onDraw(Canvas canvas) {        绘制背景        canvas.drawBitmap(bitmapBackground,0,paint);        绘制滑动按钮        canvas.drawBitmap(bitmapBtn,slIDeBtnleft,paint);    }    boolean isDrag=     * 点击事件      onClick(VIEw v) {        解决与移动事件的冲突        if(!isDrag){            currentState = !currentState;            flushState();        }    }     lastX;         * 触摸事件      firstX;    @OverrIDe    boolean ontouchEvent(MotionEvent event) {        .ontouchEvent(event);        switch(event.getAction()){            手指按下            case MotionEvent.ACTION_DOWN:                firstX=lastX=() event.getX();                isDrag=;            break手指移动             MotionEvent.ACTION_MOVE:                解决与点击事件冲突                if(Math.abs(event.getX()-firstX)>5){                    isDrag=;                }                                int dis=(int) event.getX()-lastX;                slIDeBtnleft=slIDeBtnleft+dis;                lastX=() event.getX();            手指抬起             MotionEvent.ACTION_UP:                if(isDrag){                    int maxleft = bitmapBackground.getWIDth()                            - bitmapBtn.getWIDth();                    if (slIDeBtnleft >= maxleft / 2) {                        currentState = ;                    } else {                        currentState = ;                    }                    flushState();                }            ;        }        flushVIEw();                return ;    }         * 刷新状态      flushState() {        if (currentState == ) {            slIDeBtnleft = bitmapBackground.getWIDth()                    - bitmapBtn.getWIDth();        }  {            slIDeBtnleft = 0;        }        invalIDate();    }         * 刷新视图      flushVIEw() {        int maxleft=bitmapBackground.getWIDth()-bitmapBtn.getWIDth();        slIDeBtnleft=(slIDeBtnleft>0) ? slIDeBtnleft : 0;        slIDeBtnleft=(slIDeBtnleft<maxleft) ? slIDeBtnleft:maxleft;        invalIDate();    }}

 

总结

以上是内存溢出为你收集整理的[android] 切换按钮-自定义控件-拖动效果全部内容,希望文章能够帮你解决[android] 切换按钮-自定义控件-拖动效果所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1121184.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存