一起Talk Android吧(第四百五十三回:给View添加滑动事件二)

Posted talk_8

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一起Talk Android吧(第四百五十三回:给View添加滑动事件二)相关的知识,希望对你有一定的参考价值。

文章目录

各位看官们大家好,上一回中咱们说的例子是"给View添加滑动事件",这一回中继续说该例子。闲话休提,言归正转,让我们一起Talk android吧!

整体思路

还使用上一章回中自定义的View,添加滑动事件的方式也不变。添加滑动事件后View会跟着滑动事件一起变化,通俗点讲是手指在屏幕上滑动到哪里,View就是跟着移动到哪里。总之,整体思路和上一章回中的内容保持一致。

实现方法

  • 1.当View上的事件按下时记录下"按下事件"当前的坐标;
  • 2.当View上的事件移动时记录下"移动事件"当前的坐标;
  • 3.移动事件的坐标与按下事件坐标差就是View的偏移位置;
  • 4.通过偏移位置计算出滑动后View的新坐标;
  • 5.把新坐标传递给layout()方法来重新计算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;
            //记录滑动事件的坐标,并且计算偏移值,然后是使用layout方法移动View
            case MotionEvent.ACTION_MOVE:
                float offsetX,offsetY,l,t,r,b;
                offsetX = event.getX() - downX;
                offsetY = event.getY() - downY;

                //计算View滑动后的新坐标
                l = getLeft()+offsetX;
                t = getTop()+offsetY;
                r = getRight()+offsetX;
                b = getBottom()+offsetY;
                //使用三种方法来移动view:layout重新布局,scrollBy(scrollTo)不可以,修改布局参数
                layout((int)l ,(int) t,(int)r,(int)b);
               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);
    

在上面的代码中添加有详细的注释,相信大家都可以看明白,这里的代码整体上与上一章回中的代码相同,不同之处在于移动View时使用layout()方法,该方法会重新计算view的坐标,然后对view进行重绘,重绘时View的坐标与之前的坐标不同,view就会发生移动。这便是该方法移动view的原理。

此外,代码使用了获取View坐标的方法,比如getLeft().我们在很早之前的博客中介绍过,如果有看官忘记了,可以点击这里查看。

运行效果

我们在自定义的View中画了一个蓝色的矩形,当手指在屏幕上移动该矩形时,矩形就会随着手指移动,手动移动到哪里矩形就移动到哪里。我在这里就不演示具体的运行效果了,大家可以自己动手去实践。总之程序的运行效果和上一章回中的完全一样,大家可以理解为使用不同的方法实现了相同的效果。

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

以上是关于一起Talk Android吧(第四百五十三回:给View添加滑动事件二)的主要内容,如果未能解决你的问题,请参考以下文章

一起Talk Android吧(第四百二十三回:给图片添加阴影)

一起Talk Android吧(第四百五十回:绘制彩虹)

一起Talk Android吧(第四百五十五回:给View添加手势事件一)

一起Talk Android吧(第四百五十六回:给View添加手势事件二)

一起Talk Android吧(第四百五十四回:计算View的滑动距离)

一起Talk Android吧(第三百五十三回:Gson库解析JSON数组一)