继续创作,加快生长!这是我参与「日新计划 10 月更文应战」的第25天,点击查看活动详情,希望我们多多支持,帮忙点个赞,谢谢!

前言

今天的工作仍然在思考自定义view,由于需求调服务器接口,而这需求一些参数去其他地方拿,不在我调自定义view的页面,所以我希望能封装好这个自定义view,对外只要敞开相应监听接口即可,所以第一步我很快就完成了view的接触事情监听,使我的控件能满意接触的反响需求,在对竖屏和横屏适配后,我陷入了如何封装的思考中。
这是关于对控件移动边际限定的宽高获取:


@Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        // 获取宽-丈量规矩的模式和大小
        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
        int widthSize = MeasureSpec.getSize(widthMeasureSpec);
        // 获取高-丈量规矩的模式和大小
         heightMode = MeasureSpec.getMode(heightMeasureSpec);
         heightSize = MeasureSpec.getSize(heightMeasureSpec);
        //获取xml里边设置的宽高的像素
        XLog.i(TAG + " widthSize= " + widthSize + ",heightSize = " + heightSize);
    }

此外,我发现能够在上面这个丈量方法中初始化一些从外部传入的全局变量
而在onDraw()方法复写中,只要getWiidth()getHeight 即可轻松获取高和宽。

正篇

但我还没想多久,就发现自己手中的自定义view有问题,竖屏时由于固定在Dialog中的所以没有发现,而横屏就呈现了问题,有时候控件在view的边际按下时会呈现卡死在边际无法回到我预设的起始点,于是赶快看了代码:

setOnTouchListener(newOnTouchListener(){//设置触控监听
@Override
publicbooleanonTouch(Viewv,MotionEventev){
//由于本人控件为圆形的,故这样写
finalfloatxx=ev.getX() - widthSize * 0.5,yy=ev.getY()- heightSize * 0.5;

if(ev.getAction()==MotionEvent.ACTION_DOWN){
m.down(xx,yy);//按下时的操作
//m.move(xx,yy);
}
m.move(xx,yy);//移动时的操作
if(ev.getAction()==MotionEvent.ACTION_UP){
m.up();//松开时的操作
}
returntrue;//不要返回false
}
});

请教完长辈发现,有时候安卓在布局边际处的触控事情是不会触发为UP操作的,应该如下:

if(ev.getAction()==MotionEvent.ACTION_UP || ev.getAction()==MotionEvent.ACTION_CANCEL || ev.getAction()==MotionEvent.ACTION_OUTSIDE){
m.up();//松开时的操作
}

这里解释一下,ACTION_CANCEL便是对应手势被撤销了,而ACTION_OUTSIDE则是标明是触碰超出了正常的 UI 边界,而通过日志发现我的ev.getAction()返回的是3,即ACTION_CANCEL,那为什么会呈现这种状况呢?这里有一个问答就说明了这个状况发生的原因:

看清安卓自定义view中触摸事件的“盲区”
粗心便是有人问安卓中呈现ACTION_CANCEL是什么原因,下面大佬就回答道,当父级接管运动时,就会发生ACTION_CANCEL,例如,当用户在列表视图中拖动的动作过大,甚至让它行将开端翻滚,而不是让你能够按下这其中的按钮。

也便是说我对自定义view的触控过头了,导致了撤销事情发生从而呈现这个Up动作监听不到的问题。

总结

其实呈现这个问题仍是我源码阅读不够多,不能想到对策与方法,不过贵在积累,懂事而笃行。