天天记录 - Android 使用view.ScrollBy实现View随手指移动

本文探讨了在Android中如何利用view.ScrollBy实现View随手指移动的效果,通过实例代码和疑问解答,揭示了Scroller类在滚动过程中的作用,指出Scroller并非直接负责视图移动,而是提供滚动速度计算辅助。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



     这篇文章的原标题是《Android 使用scroller实现View随手指移动》 真是大错特错, Scroller仅仅是一个辅助类用于根据滚动速度获取每次的偏移量而已。


一 有图有真相,先上图和例子



例子下载地址, 伪码如下:


public class CustomLinearLayout extends LinearLayout {  
      
    private int mLastX;  
    private int mLastY;  
      
    ......  
      
    @Override  
    public boolean onTouchEvent(MotionEvent event) {  
  
        final int action = event.getAction();  
  
        final int x = (int) event.getX();  
        final int y = (int) event.getY();  
  
        switch (action) {  
        case MotionEvent.ACTION_DOWN:  
  
            mLastX = x;  
            mLastY = y;  
  
            break;  
  
        case MotionEvent.ACTION_MOVE:  
              
            updateLog();  
              
            int deltaX = mLastX - x;  
            int deltaY = mLastY - y;  
  
            // 把视图移动到当前的相应偏移位置。 
            scrollBy(deltaX, deltaY);  
  
            mLastX = x;  
            mLastY = y;  
  
            break;  
  
        default:  
            break;  
        }  
  
        // 不再传递Touch事件  
        return true;  
    }  
      
    ......  
}


二 由例子引发的疑问? 

解释:此例子中的x,y值其实是view.getLeft 和 view.getTop

为什么x,y两个值没有改变,而scrollX和scrollY改变了?
   

Android的视图绘制仅针对与应用开发来说,通常经过三个步骤:
1. onMeasure 测量出所有视图的大小
2. onLayout     根据测量的值,指定视图在屏幕上的位置
3. onDraw        根据视图大小和位置,具体在屏幕上进行渲染操作,即画到屏幕上


个人看法: 提高效率
在onMeasure,onLayout,onDraw回调方法中都添加log输出,当视图随手指移动的制定仅执行onDraw方法,也就是与x,y之被改变不同不会执行前两个回调。
绘制的三个步骤仅需要执行最后一个,肯定效率高于直接修改x,y值。

三 为什么仅执行onDraw?


明天接着分析



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值