电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Android Scroller的使用方法

瀏覽:4日期:2022-09-18 16:14:05

本文實例為大家分享了Android Scroller的使用方法,供大家參考,具體內容如下

1、scrollTo和ScrollBy

View類定義了兩個用于滾動View內容的方法:scrollTo和scrollBy:

/** * Set the scrolled position of your view. This will cause a call to * {@link #onScrollChanged(int, int, int, int)} and the view will be * invalidated. * @param x the x position to scroll to * @param y the y position to scroll to */public void scrollTo(int x, int y) { if (mScrollX != x || mScrollY != y) {int oldX = mScrollX;int oldY = mScrollY;mScrollX = x;mScrollY = y;invalidateParentCaches();onScrollChanged(mScrollX, mScrollY, oldX, oldY);if (!awakenScrollBars()) { postInvalidateOnAnimation();} }}/** * Move the scrolled position of your view. This will cause a call to * {@link #onScrollChanged(int, int, int, int)} and the view will be * invalidated. * @param x the amount of pixels to scroll by horizontally * @param y the amount of pixels to scroll by vertically */public void scrollBy(int x, int y) { scrollTo(mScrollX + x, mScrollY + y);}

可以看到scrollBy傳入的x和y參數實際上是X方向和Y方向的滾動距離的增量,最終還是調用了scrollTo方法。而scrollTo方法中做了一些刷新和通知操作,最重要的是對mScrollX和mScrollY進行了賦值。

在View的draw方法中,我們可以看到如下代碼:

int sx = 0;int sy = 0;if (!drawingWithRenderNode) { computeScroll(); sx = mScrollX; sy = mScrollY;}...if (offsetForScroll) { canvas.translate(mLeft - sx, mTop - sy);}

也就是說,mScrollX和mScrollY最終是用在了內容繪制的地方,其mLeft和mTop本身都沒有因為scrollTo發生變化。scrollTo作用在View的內容上,而不是View本身。

2、 computeScroll

在上面的View的draw方法的節選中我們看到在對mScrollX和mScrollY取值之前,調用了computeScroll方法。computeScroll方法聲明如下:

/** * Called by a parent to request that a child update its values for mScrollX * and mScrollY if necessary. This will typically be done if the child is * animating a scroll using a {@link android.widget.Scroller Scroller} * object. */public void computeScroll() {}

根據注釋,computeScroll的典型用法是與Scroller結合使用實現內容/字節點的滾動動畫。

3、Scroller的使用

Scroller事實上并不直接操作View的滾動,而是根據設置來計算當前X和Y方向的距離。Scroller的一般使用步驟:

1、初始化Scroller,可以指定插值器,不指定則使用默認的ViscousFluidInterpolator2、調用Scroller#startScroll方法,開始在一段時間內不斷計算X和Y方向的滾動3、通知View刷新4、在View#computeScroll中通過scrollTo實現真正的滾動操作5、通知View刷新

其中在滾動執行完成之前4和5會不斷地循環,直至scroller.computeScrollOffset()返回false。

class ScrollableLinearLayout @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : LinearLayout(context, attrs, defStyleAttr) { private val scroller = Scroller(context, BounceInterpolator()) override fun computeScroll() {if(scroller.computeScrollOffset()) { // 真正實現滾動操作的地方 scrollTo(scroller.currX, scroller.currY) // 刷新 invalidate()} } fun scroll() {// 調用Scroller的startScrollif(scrollX == 0) { scroller.startScroll(scrollX, scrollY, /*dx*/ -500, /*dy*/ 0, /*duration*/ 300)} else { scroller.startScroll(scrollX, scrollY, 500, 0, 300)}// 刷新invalidate() }}

xml布局:

<?xml version='1.0' encoding='utf-8'?><LinearLayout xmlns:android='http://schemas.android.com/apk/res/android' xmlns:app='http://schemas.android.com/apk/res-auto' xmlns:tools='http://schemas.android.com/tools' android:layout_width='match_parent' android:layout_height='match_parent' android:orientation='vertical' tools:context='.scroller.activity.ScrollerSampleActivity'> <com.sahooz.customviewdemo.scroller.view.ScrollableLinearLayoutandroid: android:layout_width='match_parent'android:layout_height='200dp'android:gravity='center_vertical'android:orientation='vertical'android:background='#FFAAAA'><Button android: android:layout_width='wrap_content' android:layout_height='wrap_content' android:text='Scroll' /> </com.sahooz.customviewdemo.scroller.view.ScrollableLinearLayout></LinearLayout>

Activity

class ScrollerSampleActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_scroller_sample)val btnScroll = findViewById<Button>(R.id.btnScroll)btnScroll.setOnClickListener { findViewById<ScrollableLinearLayout>(R.id.sll).scroll()} }}

運行結果:

Android Scroller的使用方法

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Android
相關文章:
主站蜘蛛池模板: 升降炉_真空气氛炉_管式电阻炉厂家-山东中辰电炉有限公司 | 食品机械专用传感器-落料放大器-低价接近开关-菲德自控技术(天津)有限公司 | CPSE安博会| 包装机传感器-搅拌站传感器-山东称重传感器厂家-济南泰钦电气 | 电销卡_北京电销卡_包月电话卡-豪付网络 | 酒万铺-酒水招商-酒水代理 | 广州各区危化证办理_危险化学品经营许可证代办 | 网络推广公司_网络营销方案策划_企业网络推广外包平台-上海澜推网络 | 金刚网,金刚网窗纱,不锈钢网,金刚网厂家- 河北萨邦丝网制品有限公司 | 耙式干燥机_真空耙式干燥机厂家-无锡鹏茂化工装备有限公司 | 搪瓷反应釜厂家,淄博搪瓷反应釜-淄博卓耀 | 考勤系统_考勤管理系统_网络考勤软件_政企|集团|工厂复杂考勤工时统计排班管理系统_天时考勤 | 昆山PCB加工_SMT贴片_PCB抄板_线路板焊接加工-昆山腾宸电子科技有限公司 | 盘式曝气器-微孔曝气器-管式曝气器-曝气盘-斜管填料 | 郑州市前程水处理有限公司 | 丹尼克尔拧紧枪_自动送钉机_智能电批_柔性振动盘_螺丝供料器品牌 | 棕刚玉-白刚玉厂家价格_巩义市东翔净水材料厂 | 牛奶检测仪-乳成分分析仪-北京海谊| 双能x射线骨密度检测仪_dxa骨密度仪_双能x线骨密度仪_品牌厂家【品源医疗】 | PU树脂_水性聚氨酯树脂_聚氨酯固化剂_聚氨酯树脂厂家_宝景化工 | 四川成都干燥设备_回转筒干燥机_脉冲除尘器_输送设备_热风炉_成都川工星科机电设备有限公司 | 河南正规膏药生产厂家-膏药贴牌-膏药代加工-修康药业集团官网 | 示波器高压差分探头-国产电流探头厂家-南京桑润斯电子科技有限公司 | 阳光1号桔柚_无核沃柑_柑橘新品种枝条苗木批发 - 苧金网 | 数控车床-立式加工中心-多功能机床-小型车床-山东临沂金星机床有限公司 | 防腐储罐_塑料储罐_PE储罐厂家_淄博富邦滚塑防腐设备科技有限公司 | 拉曼光谱仪_便携式|激光|显微共焦拉曼光谱仪-北京卓立汉光仪器有限公司 | 螺钉式热电偶_便携式温度传感器_压簧式热电偶|无锡联泰仪表有限公司|首页 | 钢绞线万能材料试验机-全自动恒应力两用机-混凝土恒应力压力试验机-北京科达京威科技发展有限公司 | 球磨机 选矿球磨机 棒磨机 浮选机 分级机 选矿设备厂家 | 牛奶检测仪-乳成分分析仪-北京海谊 | 医学动画公司-制作3d医学动画视频-医疗医学演示动画制作-医学三维动画制作公司 | 变压器配件,变压器吸湿器,武强县吉口变压器配件有限公司 | 客服外包专业服务商_客服外包中心_网萌科技 | PC构件-PC预制构件-构件设计-建筑预制构件-PC构件厂-锦萧新材料科技(浙江)股份有限公司 | 成都离婚律师|成都结婚律师|成都离婚财产分割律师|成都律师-成都离婚律师网 | 一体化污水处理设备-一体化净水设备-「山东梦之洁水处理」 | 污水提升器,污水提升泵,污水提升装置-德国泽德(zehnder)水泵系统有限公司 | 事迹材料_个人事迹名人励志故事| 色谱柱-淋洗液罐-巴罗克试剂槽-巴氏吸管-5ml样品瓶-SBS液氮冻存管-上海希言科学仪器有限公司 | 东莞市天进机械有限公司-钉箱机-粘箱机-糊箱机-打钉机认准东莞天进机械-厂家直供更放心! | 罐体电伴热工程-消防管道电伴热带厂家-山东沃安电气 |