文章目录

  • 整体思路
  • 实现方法
  • 示例代码
  • 运行效果



各位看官们大家好,上一回中咱们说的例子是"View中的事件分发机制",这一回中说的例子是"

给View添加滑动事件"。闲话休提,言归正转,让我们一起Talk Android吧!

整体思路

首先定义一个View的子类,在类中重写构造方法和事件响应方法onTouchEvent().在该方法中依据事件的类型来响应事件,我们要添加的是滑动事件,因此只需要响应滑动类型(MOVE)的事件就可以.为了演示View的滑动效果,我们让View跟着滑动事件一起变化,通俗点讲是手指在屏幕上滑动到哪里,View就是跟着移动到哪里。

实现方法

  • 1.当View上的事件按下时记录下"按下事件"当前的坐标;
  • 2.当View上的事件移动时记录下"移动事件"当前的坐标;
  • 3.移动事件的坐标与按下事件坐标差就是View的偏移位置;
  • 4.把偏移位置传递给scrollBy方法来移动View;

示例代码

public class ScrollEvent extends View {
    private Paint mPaint;
    private float downX,downY;
  
    //只列出一个构造方法,其它三种重载的构造方法与此构造方法类似,不再列出
    public ScrollEvent(Context context) {
        super(context);
        init(context);
    }


    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawRect(100,200,300,400,mPaint);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        super.onTouchEvent(event);
        switch (event.getAction()) {
            //记录按下事件的坐标
            case MotionEvent.ACTION_DOWN:
                downX = event.getX();
                downY = event.getY();
                break;
            case MotionEvent.ACTION_UP:
               break;
            //记录滑动事件的坐标,并且计算偏移值,然后是使用scrollBy方法移动View
            case MotionEvent.ACTION_MOVE:
                float offsetX,offsetY;
                offsetX = event.getX() - downX;
                offsetY = event.getY() - downY;

                //scrollBy移动的是view的内容,因此需要先获取来当前view的父布局,注意值为负值,
               ((View)getParent()).scrollBy(-(int) offsetX,-(int) offsetY);
               break;
            default:
                break;
        }

        return true;
    }

    private void init(Context context) {
        mPaint = new Paint();
        mPaint.setColor(Color.BLUE);
        mPaint.setAntiAlias(true);
        mPaint.setStyle(Paint.Style.FILL);
    }
}

在上面的代码中添加有详细的注释,相信大家都可以看明白,不过我还是要强调一下scrollBy()方法的注意事项:

  • 1.它是移动View的内容,而不是View本身,因此需要获取当前View的父View;
  • 2.它是按照偏移位置进行移动的,而且移动的方向是相当于父View的,因此移动父View中的子View时需要对偏移值取反;

运行效果

我们在自定义的View中画了一个蓝色的矩形,当手指在屏幕上移动该矩形时,矩形就会随着手指移动,手动移动到哪里矩形就移动到哪里。我在这里就不演示具体的运行效果了,大家可以自己动手去实践。

看官们,关于"给View添加滑动事件"的例子咱们就介绍到这里,欲知后面还有什么例子,且听下回分解!