欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

(一)使用自定义组合控件+ValueAnimator制作一个可自增页数的页码View

程序员文章站 2022-05-04 23:35:01
...

1.继承关系

继承自FrameLayout 和实现点击,长按和触摸事件的接口
其实已经自己写了点击和长按事件还要继承这些接口是为了调用方便 …
其实是起名字太烦了 滑稽…

	public class PageNumberView extends FrameLayout implements View.OnClickListener,View.OnTouchListener ,View.OnLongClickListener 
2.LayoutInflater加载xml
	LayoutInflater.from(context).inflate(R.layout.page_number_view, this, true);
3.postDelayed发送一段延时执行代码实现长按事件

由于需要监听长按抬起时的事件所以这里自己实现了长按和点击的效果

 mLongPressRunnable = new Runnable() {
            @Override
            public void run() {
                performLongClick();
                if (view!=null){
                    isLongClick=true;
                    onLongClick(view);
                }
            }
        };
4.核心Touch事件处理和动画实现自增效果

这里逻辑众多我已经写好了注释

@Override
    public boolean onTouch(View v, MotionEvent event) {
        int x = (int) event.getX();
        int y = (int) event.getY();
        
        switch(event.getAction()) {
            case MotionEvent.ACTION_DOWN:
//              记录按下坐标
                mX = x;
                mY = y;
//              初始化操作符
                isMoved = false;
                isLongClick=false;
                isDown=true;
//              记录按下的view
                view=v;
                postDelayed(mLongPressRunnable, ViewConfiguration.getLongPressTimeout());
                break;
            case MotionEvent.ACTION_MOVE:
                if(isMoved) break;
                if(Math.abs(mX -x) > TOUCH_MOVE || Math.abs(mY -y) > TOUCH_MOVE) {
                    //移动超过阈值,则表示移动了
                    isMoved = true;
                    removeCallbacks(mLongPressRunnable);
                    view=null;
                }
                break;
            case MotionEvent.ACTION_UP:
                //释放
                removeCallbacks(mLongPressRunnable);
                if (isDown&&!isLongClick&&!isMoved)onClick(v);
                if (anim!=null)anim.cancel();
                isDown=false;
                view=null;
                isMoved=false;
                break;
        }
        return true;
    }

动画这里使用ValueAnimator的ofInt方法并设置监听回调

private void startAnim(int start, int end ) {

        anim = ValueAnimator.ofInt(start, end);
        anim.setDuration(3000);
//        数值动画回调监听
        anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator valueAnimator) {
                if (isDown){
                    number =(int) valueAnimator.getAnimatedValue();
                    tvCenter.setText(number+"/"+maxNumber);
                }else {
                    listener.OnLongStopping(number);
                    if (anim!=null){
                        anim.cancel();
                    }
                }
            }
        });
        anim.start();
    }

第一次写博客可能写的不太清楚如果有需求大家可以去我的git仓库