Scroller

本文详细介绍了Android中Scroller类的使用方法及其实现View平滑滚动的过程。通过实例演示了如何利用Scroller进行自定义View的滚动操作。

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

Android里Scroller类是为了实现View平滑滚动的一个Helper 类。通常在自定义的View时使用,在View中定义一个私有成员mScroller = new Scroller(context)。设置mScroller滚动的位置时,并不会导致View的滚动,通常是用mScroller记录/计算View滚动的位置,再重写View的computeScroll(),完成实际的滚动。

相关API介绍如下

  1. mScroller.getCurrX() //获取mScroller当前水平滚动的位置   
  2. mScroller.getCurrY() //获取mScroller当前竖直滚动的位置   
  3. mScroller.getFinalX() //获取mScroller最终停止的水平位置   
  4. mScroller.getFinalY() //获取mScroller最终停止的竖直位置   
  5. mScroller.setFinalX(int newX) //设置mScroller最终停留的水平位置,没有动画效果,直接跳到目标位置   
  6. mScroller.setFinalY(int newY) //设置mScroller最终停留的竖直位置,没有动画效果,直接跳到目标位置   
  7.    
  8. //滚动,startX, startY为开始滚动的位置,dx,dy为滚动的偏移量, duration为完成滚动的时间   
  9. mScroller.startScroll(int startX, int startY, int dx, int dy) //使用默认完成时间250ms   
  10. mScroller.startScroll(int startX, int startY, int dx, int dy, int duration)   
  11.    
  12. mScroller.computeScrollOffset() //返回值为boolean,true说明滚动尚未完成,false说明滚动已经完成。这是一个很重要的方法,通常放在View.computeScroll()中,用来判断是否滚动是否结束。   

举例说明,自定义一个CustomView,使用Scroller实现滚动:

  1. import android.content.Context;   
  2. import android.util.AttributeSet;   
  3. import android.util.Log;   
  4. import android.view.View;   
  5. import android.widget.LinearLayout;   
  6. import android.widget.Scroller;   
  7.    
  8. public class CustomView extends LinearLayout {   
  9.    
  10.     private static final String TAG = "Scroller";   
  11.    
  12.     private Scroller mScroller;   
  13.    
  14.     public CustomView(Context context, AttributeSet attrs) {   
  15.         super(context, attrs);   
  16.         mScroller = new Scroller(context);   
  17.     }   
  18.    
  19.     //调用此方法滚动到目标位置   
  20.     public void smoothScrollTo(int fx, int fy) {   
  21.         int dx = fx - mScroller.getFinalX();   
  22.         int dy = fy - mScroller.getFinalY();   
  23.         smoothScrollBy(dx, dy);   
  24.     }   
  25.    
  26.     //调用此方法设置滚动的相对偏移   
  27.     public void smoothScrollBy(int dx, int dy) {   
  28.    
  29.         //设置mScroller的滚动偏移量   
  30.         mScroller.startScroll(mScroller.getFinalX(), mScroller.getFinalY(), dx, dy);   
  31.         invalidate();//这里必须调用invalidate()才能保证computeScroll()会被调用,否则不一定会刷新界面,看不到滚动效果   
  32.     }   
  33.        
  34.     @Override   
  35.     public void computeScroll() {   
  36.        
  37.         //先判断mScroller滚动是否完成   
  38.         if (mScroller.computeScrollOffset()) {   
  39.            
  40.             //这里调用View的scrollTo()完成实际的滚动   
  41.             scrollTo(mScroller.getCurrX(), mScroller.getCurrY());   
  42.                
  43.             //必须调用该方法,否则不一定能看到滚动效果   
  44.             postInvalidate();   
  45.         }   
  46.         super.computeScroll();   
  47.     }   

转载 http://mobile.51cto.com/aprogram-442905.htm

### 多个默认网关的工作原理 在网络环境中,路由器通过默认网关来转发目标地址不在本地子网的数据包。通常情况下,一台设备只配置一个默认网关,但如果存在多个默认网关,则可能涉及负载均衡或冗余备份的功能[^1]。 #### 单一网络冗余时的配置限制 在单一网络中配置多个默认网关的主要目的是为了提供冗余路径,防止单点故障。然而,这种配置可能会带来一些限制: - **路由冲突**:操作系统或路由器无法有效判断哪个默认网关是最优路径,可能导致数据包丢失或延迟增加。 - **ARP缓存问题**:如果两个默认网关指向不同的物理接口,而系统的ARP缓存未能及时更新,可能会导致通信失败。 - **DHCP分配局限性**:大多数DHCP服务器只会分配一个默认网关给客户端,因此手动配置额外的默认网关可能是必要的[^2]。 以下是实现多默认网关的一种常见方法——使用策略路由(Policy-Based Routing, PBR)。PBR允许根据特定条件(如源IP、协议类型等)选择不同的出口网关。 ```bash # Linux环境下的策略路由示例 ip rule add from 192.168.1.0/24 table main pref 100 ip route add default via 192.168.1.1 dev eth0 table main ip rule add from 192.168.2.0/24 table secondary pref 200 ip route add default via 192.168.2.1 dev eth1 table secondary ``` #### 不同分离网络上的兼容性问题 对于内部网络Intranet)和外部互联网(Internet)这样的分离网络,配置多个默认网关需要特别注意以下几点: - **安全隔离需求**:企业通常希望严格区分内外部流量,避免敏感信息泄露。在这种场景下,建议分别设置独立的防火墙规则集以及NAT转换策略。 - **DNS解析优先级**:当同时接入内网和公网时,应确保域名查询顺序合理,先尝试查找公司私有的DNS记录再转向公共DNS服务提供商[^2]。 ### 结论 虽然理论上可以通过复杂的路由策略解决上述提到的各种挑战,但在实际部署过程中还是推荐遵循最佳实践指南,比如尽量减少不必要的复杂度,并定期测试连通性和性能指标以验证方案的有效性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值