LinearSmoothScroller.smali 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654
  1. .class public abstract Landroid/support/v7/widget/LinearSmoothScroller;
  2. .super Landroid/support/v7/widget/RecyclerView$SmoothScroller;
  3. .source ""
  4. # static fields
  5. .field private static final DEBUG:Z = false
  6. .field private static final MILLISECONDS_PER_INCH:F = 25.0f
  7. .field public static final SNAP_TO_ANY:I = 0x0
  8. .field public static final SNAP_TO_END:I = 0x1
  9. .field public static final SNAP_TO_START:I = -0x1
  10. .field private static final TAG:Ljava/lang/String; = "LinearSmoothScroller"
  11. .field private static final TARGET_SEEK_EXTRA_SCROLL_RATIO:F = 1.2f
  12. .field private static final TARGET_SEEK_SCROLL_DISTANCE_PX:I = 0x2710
  13. # instance fields
  14. .field private final MILLISECONDS_PER_PX:F
  15. .field protected final mDecelerateInterpolator:Landroid/view/animation/DecelerateInterpolator;
  16. .field protected mInterimTargetDx:I
  17. .field protected mInterimTargetDy:I
  18. .field protected final mLinearInterpolator:Landroid/view/animation/LinearInterpolator;
  19. .field protected mTargetVector:Landroid/graphics/PointF;
  20. # direct methods
  21. .method public constructor <init>(Landroid/content/Context;)V
  22. .locals 1
  23. invoke-direct {p0}, Landroid/support/v7/widget/RecyclerView$SmoothScroller;-><init>()V
  24. new-instance v0, Landroid/view/animation/LinearInterpolator;
  25. invoke-direct {v0}, Landroid/view/animation/LinearInterpolator;-><init>()V
  26. iput-object v0, p0, Landroid/support/v7/widget/LinearSmoothScroller;->mLinearInterpolator:Landroid/view/animation/LinearInterpolator;
  27. new-instance v0, Landroid/view/animation/DecelerateInterpolator;
  28. invoke-direct {v0}, Landroid/view/animation/DecelerateInterpolator;-><init>()V
  29. iput-object v0, p0, Landroid/support/v7/widget/LinearSmoothScroller;->mDecelerateInterpolator:Landroid/view/animation/DecelerateInterpolator;
  30. const/4 v0, 0x0
  31. iput v0, p0, Landroid/support/v7/widget/LinearSmoothScroller;->mInterimTargetDx:I
  32. iput v0, p0, Landroid/support/v7/widget/LinearSmoothScroller;->mInterimTargetDy:I
  33. invoke-virtual {p1}, Landroid/content/Context;->getResources()Landroid/content/res/Resources;
  34. move-result-object p1
  35. invoke-virtual {p1}, Landroid/content/res/Resources;->getDisplayMetrics()Landroid/util/DisplayMetrics;
  36. move-result-object p1
  37. invoke-virtual {p0, p1}, Landroid/support/v7/widget/LinearSmoothScroller;->calculateSpeedPerPixel(Landroid/util/DisplayMetrics;)F
  38. move-result p1
  39. iput p1, p0, Landroid/support/v7/widget/LinearSmoothScroller;->MILLISECONDS_PER_PX:F
  40. return-void
  41. .end method
  42. .method private clampApplyScroll(II)I
  43. .locals 0
  44. sub-int p2, p1, p2
  45. mul-int p1, p1, p2
  46. if-gtz p1, :cond_0
  47. const/4 p1, 0x0
  48. return p1
  49. :cond_0
  50. return p2
  51. .end method
  52. # virtual methods
  53. .method public calculateDtToFit(IIIII)I
  54. .locals 1
  55. const/4 v0, -0x1
  56. if-eq p5, v0, :cond_4
  57. if-eqz p5, :cond_1
  58. const/4 p1, 0x1
  59. if-ne p5, p1, :cond_0
  60. sub-int/2addr p4, p2
  61. return p4
  62. :cond_0
  63. new-instance p1, Ljava/lang/IllegalArgumentException;
  64. const-string p2, "snap preference should be one of the constants defined in SmoothScroller, starting with SNAP_"
  65. invoke-direct {p1, p2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V
  66. throw p1
  67. :cond_1
  68. sub-int/2addr p3, p1
  69. if-lez p3, :cond_2
  70. return p3
  71. :cond_2
  72. sub-int/2addr p4, p2
  73. if-gez p4, :cond_3
  74. return p4
  75. :cond_3
  76. const/4 p1, 0x0
  77. return p1
  78. :cond_4
  79. sub-int/2addr p3, p1
  80. return p3
  81. .end method
  82. .method public calculateDxToMakeVisible(Landroid/view/View;I)I
  83. .locals 10
  84. invoke-virtual {p0}, Landroid/support/v7/widget/RecyclerView$SmoothScroller;->getLayoutManager()Landroid/support/v7/widget/RecyclerView$LayoutManager;
  85. move-result-object v0
  86. if-eqz v0, :cond_1
  87. invoke-virtual {v0}, Landroid/support/v7/widget/RecyclerView$LayoutManager;->canScrollHorizontally()Z
  88. move-result v1
  89. if-nez v1, :cond_0
  90. goto :goto_0
  91. :cond_0
  92. invoke-virtual {p1}, Landroid/view/View;->getLayoutParams()Landroid/view/ViewGroup$LayoutParams;
  93. move-result-object v1
  94. check-cast v1, Landroid/support/v7/widget/RecyclerView$LayoutParams;
  95. invoke-virtual {v0, p1}, Landroid/support/v7/widget/RecyclerView$LayoutManager;->getDecoratedLeft(Landroid/view/View;)I
  96. move-result v2
  97. iget v3, v1, Landroid/view/ViewGroup$MarginLayoutParams;->leftMargin:I
  98. sub-int v5, v2, v3
  99. invoke-virtual {v0, p1}, Landroid/support/v7/widget/RecyclerView$LayoutManager;->getDecoratedRight(Landroid/view/View;)I
  100. move-result p1
  101. iget v1, v1, Landroid/view/ViewGroup$MarginLayoutParams;->rightMargin:I
  102. add-int v6, p1, v1
  103. invoke-virtual {v0}, Landroid/support/v7/widget/RecyclerView$LayoutManager;->getPaddingLeft()I
  104. move-result v7
  105. invoke-virtual {v0}, Landroid/support/v7/widget/RecyclerView$LayoutManager;->getWidth()I
  106. move-result p1
  107. invoke-virtual {v0}, Landroid/support/v7/widget/RecyclerView$LayoutManager;->getPaddingRight()I
  108. move-result v0
  109. sub-int v8, p1, v0
  110. move-object v4, p0
  111. move v9, p2
  112. invoke-virtual/range {v4 .. v9}, Landroid/support/v7/widget/LinearSmoothScroller;->calculateDtToFit(IIIII)I
  113. move-result p1
  114. return p1
  115. :cond_1
  116. :goto_0
  117. const/4 p1, 0x0
  118. return p1
  119. .end method
  120. .method public calculateDyToMakeVisible(Landroid/view/View;I)I
  121. .locals 10
  122. invoke-virtual {p0}, Landroid/support/v7/widget/RecyclerView$SmoothScroller;->getLayoutManager()Landroid/support/v7/widget/RecyclerView$LayoutManager;
  123. move-result-object v0
  124. if-eqz v0, :cond_1
  125. invoke-virtual {v0}, Landroid/support/v7/widget/RecyclerView$LayoutManager;->canScrollVertically()Z
  126. move-result v1
  127. if-nez v1, :cond_0
  128. goto :goto_0
  129. :cond_0
  130. invoke-virtual {p1}, Landroid/view/View;->getLayoutParams()Landroid/view/ViewGroup$LayoutParams;
  131. move-result-object v1
  132. check-cast v1, Landroid/support/v7/widget/RecyclerView$LayoutParams;
  133. invoke-virtual {v0, p1}, Landroid/support/v7/widget/RecyclerView$LayoutManager;->getDecoratedTop(Landroid/view/View;)I
  134. move-result v2
  135. iget v3, v1, Landroid/view/ViewGroup$MarginLayoutParams;->topMargin:I
  136. sub-int v5, v2, v3
  137. invoke-virtual {v0, p1}, Landroid/support/v7/widget/RecyclerView$LayoutManager;->getDecoratedBottom(Landroid/view/View;)I
  138. move-result p1
  139. iget v1, v1, Landroid/view/ViewGroup$MarginLayoutParams;->bottomMargin:I
  140. add-int v6, p1, v1
  141. invoke-virtual {v0}, Landroid/support/v7/widget/RecyclerView$LayoutManager;->getPaddingTop()I
  142. move-result v7
  143. invoke-virtual {v0}, Landroid/support/v7/widget/RecyclerView$LayoutManager;->getHeight()I
  144. move-result p1
  145. invoke-virtual {v0}, Landroid/support/v7/widget/RecyclerView$LayoutManager;->getPaddingBottom()I
  146. move-result v0
  147. sub-int v8, p1, v0
  148. move-object v4, p0
  149. move v9, p2
  150. invoke-virtual/range {v4 .. v9}, Landroid/support/v7/widget/LinearSmoothScroller;->calculateDtToFit(IIIII)I
  151. move-result p1
  152. return p1
  153. :cond_1
  154. :goto_0
  155. const/4 p1, 0x0
  156. return p1
  157. .end method
  158. .method protected calculateSpeedPerPixel(Landroid/util/DisplayMetrics;)F
  159. .locals 1
  160. iget p1, p1, Landroid/util/DisplayMetrics;->densityDpi:I
  161. int-to-float p1, p1
  162. const/high16 v0, 0x41c80000 # 25.0f
  163. div-float/2addr v0, p1
  164. return v0
  165. .end method
  166. .method protected calculateTimeForDeceleration(I)I
  167. .locals 4
  168. invoke-virtual {p0, p1}, Landroid/support/v7/widget/LinearSmoothScroller;->calculateTimeForScrolling(I)I
  169. move-result p1
  170. int-to-double v0, p1
  171. const-wide v2, 0x3fd57a786c22680aL # 0.3356
  172. div-double/2addr v0, v2
  173. invoke-static {v0, v1}, Ljava/lang/Math;->ceil(D)D
  174. move-result-wide v0
  175. double-to-int p1, v0
  176. return p1
  177. .end method
  178. .method protected calculateTimeForScrolling(I)I
  179. .locals 2
  180. invoke-static {p1}, Ljava/lang/Math;->abs(I)I
  181. move-result p1
  182. int-to-float p1, p1
  183. iget v0, p0, Landroid/support/v7/widget/LinearSmoothScroller;->MILLISECONDS_PER_PX:F
  184. mul-float p1, p1, v0
  185. float-to-double v0, p1
  186. invoke-static {v0, v1}, Ljava/lang/Math;->ceil(D)D
  187. move-result-wide v0
  188. double-to-int p1, v0
  189. return p1
  190. .end method
  191. .method public abstract computeScrollVectorForPosition(I)Landroid/graphics/PointF;
  192. .end method
  193. .method protected getHorizontalSnapPreference()I
  194. .locals 3
  195. iget-object v0, p0, Landroid/support/v7/widget/LinearSmoothScroller;->mTargetVector:Landroid/graphics/PointF;
  196. if-eqz v0, :cond_2
  197. iget v0, v0, Landroid/graphics/PointF;->x:F
  198. const/4 v1, 0x0
  199. cmpl-float v2, v0, v1
  200. if-nez v2, :cond_0
  201. goto :goto_0
  202. :cond_0
  203. cmpl-float v0, v0, v1
  204. if-lez v0, :cond_1
  205. const/4 v0, 0x1
  206. goto :goto_1
  207. :cond_1
  208. const/4 v0, -0x1
  209. goto :goto_1
  210. :cond_2
  211. :goto_0
  212. const/4 v0, 0x0
  213. :goto_1
  214. return v0
  215. .end method
  216. .method protected getVerticalSnapPreference()I
  217. .locals 3
  218. iget-object v0, p0, Landroid/support/v7/widget/LinearSmoothScroller;->mTargetVector:Landroid/graphics/PointF;
  219. if-eqz v0, :cond_2
  220. iget v0, v0, Landroid/graphics/PointF;->y:F
  221. const/4 v1, 0x0
  222. cmpl-float v2, v0, v1
  223. if-nez v2, :cond_0
  224. goto :goto_0
  225. :cond_0
  226. cmpl-float v0, v0, v1
  227. if-lez v0, :cond_1
  228. const/4 v0, 0x1
  229. goto :goto_1
  230. :cond_1
  231. const/4 v0, -0x1
  232. goto :goto_1
  233. :cond_2
  234. :goto_0
  235. const/4 v0, 0x0
  236. :goto_1
  237. return v0
  238. .end method
  239. .method protected onSeekTargetStep(IILandroid/support/v7/widget/RecyclerView$State;Landroid/support/v7/widget/RecyclerView$SmoothScroller$Action;)V
  240. .locals 0
  241. invoke-virtual {p0}, Landroid/support/v7/widget/RecyclerView$SmoothScroller;->getChildCount()I
  242. move-result p3
  243. if-nez p3, :cond_0
  244. invoke-virtual {p0}, Landroid/support/v7/widget/RecyclerView$SmoothScroller;->stop()V
  245. return-void
  246. :cond_0
  247. iget p3, p0, Landroid/support/v7/widget/LinearSmoothScroller;->mInterimTargetDx:I
  248. invoke-direct {p0, p3, p1}, Landroid/support/v7/widget/LinearSmoothScroller;->clampApplyScroll(II)I
  249. move-result p1
  250. iput p1, p0, Landroid/support/v7/widget/LinearSmoothScroller;->mInterimTargetDx:I
  251. iget p1, p0, Landroid/support/v7/widget/LinearSmoothScroller;->mInterimTargetDy:I
  252. invoke-direct {p0, p1, p2}, Landroid/support/v7/widget/LinearSmoothScroller;->clampApplyScroll(II)I
  253. move-result p1
  254. iput p1, p0, Landroid/support/v7/widget/LinearSmoothScroller;->mInterimTargetDy:I
  255. iget p1, p0, Landroid/support/v7/widget/LinearSmoothScroller;->mInterimTargetDx:I
  256. if-nez p1, :cond_1
  257. iget p1, p0, Landroid/support/v7/widget/LinearSmoothScroller;->mInterimTargetDy:I
  258. if-nez p1, :cond_1
  259. invoke-virtual {p0, p4}, Landroid/support/v7/widget/LinearSmoothScroller;->updateActionForInterimTarget(Landroid/support/v7/widget/RecyclerView$SmoothScroller$Action;)V
  260. :cond_1
  261. return-void
  262. .end method
  263. .method protected onStart()V
  264. .locals 0
  265. return-void
  266. .end method
  267. .method protected onStop()V
  268. .locals 1
  269. const/4 v0, 0x0
  270. iput v0, p0, Landroid/support/v7/widget/LinearSmoothScroller;->mInterimTargetDy:I
  271. iput v0, p0, Landroid/support/v7/widget/LinearSmoothScroller;->mInterimTargetDx:I
  272. const/4 v0, 0x0
  273. iput-object v0, p0, Landroid/support/v7/widget/LinearSmoothScroller;->mTargetVector:Landroid/graphics/PointF;
  274. return-void
  275. .end method
  276. .method protected onTargetFound(Landroid/view/View;Landroid/support/v7/widget/RecyclerView$State;Landroid/support/v7/widget/RecyclerView$SmoothScroller$Action;)V
  277. .locals 2
  278. invoke-virtual {p0}, Landroid/support/v7/widget/LinearSmoothScroller;->getHorizontalSnapPreference()I
  279. move-result p2
  280. invoke-virtual {p0, p1, p2}, Landroid/support/v7/widget/LinearSmoothScroller;->calculateDxToMakeVisible(Landroid/view/View;I)I
  281. move-result p2
  282. invoke-virtual {p0}, Landroid/support/v7/widget/LinearSmoothScroller;->getVerticalSnapPreference()I
  283. move-result v0
  284. invoke-virtual {p0, p1, v0}, Landroid/support/v7/widget/LinearSmoothScroller;->calculateDyToMakeVisible(Landroid/view/View;I)I
  285. move-result p1
  286. mul-int v0, p2, p2
  287. mul-int v1, p1, p1
  288. add-int/2addr v0, v1
  289. int-to-double v0, v0
  290. invoke-static {v0, v1}, Ljava/lang/Math;->sqrt(D)D
  291. move-result-wide v0
  292. double-to-int v0, v0
  293. invoke-virtual {p0, v0}, Landroid/support/v7/widget/LinearSmoothScroller;->calculateTimeForDeceleration(I)I
  294. move-result v0
  295. if-lez v0, :cond_0
  296. neg-int p2, p2
  297. neg-int p1, p1
  298. iget-object v1, p0, Landroid/support/v7/widget/LinearSmoothScroller;->mDecelerateInterpolator:Landroid/view/animation/DecelerateInterpolator;
  299. invoke-virtual {p3, p2, p1, v0, v1}, Landroid/support/v7/widget/RecyclerView$SmoothScroller$Action;->update(IIILandroid/view/animation/Interpolator;)V
  300. :cond_0
  301. return-void
  302. .end method
  303. .method protected updateActionForInterimTarget(Landroid/support/v7/widget/RecyclerView$SmoothScroller$Action;)V
  304. .locals 4
  305. invoke-virtual {p0}, Landroid/support/v7/widget/RecyclerView$SmoothScroller;->getTargetPosition()I
  306. move-result v0
  307. invoke-virtual {p0, v0}, Landroid/support/v7/widget/LinearSmoothScroller;->computeScrollVectorForPosition(I)Landroid/graphics/PointF;
  308. move-result-object v0
  309. if-eqz v0, :cond_1
  310. iget v1, v0, Landroid/graphics/PointF;->x:F
  311. const/4 v2, 0x0
  312. cmpl-float v1, v1, v2
  313. if-nez v1, :cond_0
  314. iget v1, v0, Landroid/graphics/PointF;->y:F
  315. cmpl-float v1, v1, v2
  316. if-nez v1, :cond_0
  317. goto :goto_0
  318. :cond_0
  319. invoke-virtual {p0, v0}, Landroid/support/v7/widget/RecyclerView$SmoothScroller;->normalize(Landroid/graphics/PointF;)V
  320. iput-object v0, p0, Landroid/support/v7/widget/LinearSmoothScroller;->mTargetVector:Landroid/graphics/PointF;
  321. iget v1, v0, Landroid/graphics/PointF;->x:F
  322. const v2, 0x461c4000 # 10000.0f
  323. mul-float v1, v1, v2
  324. float-to-int v1, v1
  325. iput v1, p0, Landroid/support/v7/widget/LinearSmoothScroller;->mInterimTargetDx:I
  326. iget v0, v0, Landroid/graphics/PointF;->y:F
  327. mul-float v0, v0, v2
  328. float-to-int v0, v0
  329. iput v0, p0, Landroid/support/v7/widget/LinearSmoothScroller;->mInterimTargetDy:I
  330. const/16 v0, 0x2710
  331. invoke-virtual {p0, v0}, Landroid/support/v7/widget/LinearSmoothScroller;->calculateTimeForScrolling(I)I
  332. move-result v0
  333. iget v1, p0, Landroid/support/v7/widget/LinearSmoothScroller;->mInterimTargetDx:I
  334. int-to-float v1, v1
  335. const v2, 0x3f99999a # 1.2f
  336. mul-float v1, v1, v2
  337. float-to-int v1, v1
  338. iget v3, p0, Landroid/support/v7/widget/LinearSmoothScroller;->mInterimTargetDy:I
  339. int-to-float v3, v3
  340. mul-float v3, v3, v2
  341. float-to-int v3, v3
  342. int-to-float v0, v0
  343. mul-float v0, v0, v2
  344. float-to-int v0, v0
  345. iget-object v2, p0, Landroid/support/v7/widget/LinearSmoothScroller;->mLinearInterpolator:Landroid/view/animation/LinearInterpolator;
  346. invoke-virtual {p1, v1, v3, v0, v2}, Landroid/support/v7/widget/RecyclerView$SmoothScroller$Action;->update(IIILandroid/view/animation/Interpolator;)V
  347. return-void
  348. :cond_1
  349. :goto_0
  350. const-string v0, "LinearSmoothScroller"
  351. const-string v1, "To support smooth scrolling, you should override \nLayoutManager#computeScrollVectorForPosition.\nFalling back to instant scroll"
  352. invoke-static {v0, v1}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I
  353. invoke-virtual {p0}, Landroid/support/v7/widget/RecyclerView$SmoothScroller;->getTargetPosition()I
  354. move-result v0
  355. invoke-virtual {p1, v0}, Landroid/support/v7/widget/RecyclerView$SmoothScroller$Action;->jumpTo(I)V
  356. invoke-virtual {p0}, Landroid/support/v7/widget/RecyclerView$SmoothScroller;->stop()V
  357. return-void
  358. .end method