程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程綜合問答 >> java-android ScrollView實現原理,求助!

java-android ScrollView實現原理,求助!

編輯:編程綜合問答
android ScrollView實現原理,求助!

能解釋下ScrollView滾動顯示的原理嗎?就比如說你的ScollView有LinearLayout然後LinearLayout內有100個Button(id=1,2,3,4......),創建初,屏幕顯示id=1~10的Button,當你向下拖的時候如何重新繪制控件,顯示id=3~12的Button,我看ScrollView的源代碼,並沒有找到這部分功能,不知道能否解釋下到底是怎麼實現的,在哪裡實現的?多謝!!

最佳回答:


01.package com.ql.view;

02.

03.import android.content.Context;

04.import android.os.Handler;

05.import android.os.Message;

06.import android.util.AttributeSet;

07.import android.view.MotionEvent;

08.import android.view.View;

09.import android.widget.ScrollView;

10.

11.public class LazyScrollView extends ScrollView{

12. private static final String tag="LazyScrollView";

13. private Handler handler;

14. private View view;

15. public LazyScrollView(Context context) {

16. super(context);

17. // TODO Auto-generated constructor stub

18. }

19. public LazyScrollView(Context context, AttributeSet attrs) {

20. super(context, attrs);

21. // TODO Auto-generated constructor stub

22. }

23. public LazyScrollView(Context context, AttributeSet attrs, int defStyle) {

24. super(context, attrs, defStyle);

25. // TODO Auto-generated constructor stub

26. }

27. //這個獲得總的高度

28. public int computeVerticalScrollRange(){

29. return super.computeHorizontalScrollRange();

30. }

31. public int computeVerticalScrollOffset(){

32. return super.computeVerticalScrollOffset();

33. }

34. private void init(){

35.

36. this.setOnTouchListener(onTouchListener);

37. handler=new Handler(){

38. @Override

39. public void handleMessage(Message msg) {

40. // process incoming messages here

41. super.handleMessage(msg);

42. switch(msg.what){

43. case 1:

44. if(view.getMeasuredHeight() <= getScrollY() + getHeight()) {

45. if(onScrollListener!=null){

46. onScrollListener.onBottom();

47. }

48.

49. }else if(getScrollY()==0){

50. if(onScrollListener!=null){

51. onScrollListener.onTop();

52. }

53. }

54. else{

55. if(onScrollListener!=null){

56. onScrollListener.onScroll();

57. }

58. }

59. break;

60. default:

61. break;

62. }

63. }

64. };

65.

66. }

67.

68. OnTouchListener onTouchListener=new OnTouchListener(){

69.

70. @Override

71. public boolean onTouch(View v, MotionEvent event) {

72. // TODO Auto-generated method stub

73. switch (event.getAction()) {

74. case MotionEvent.ACTION_DOWN:

75. break;

76. case MotionEvent.ACTION_UP:

77. if(view!=null&&onScrollListener!=null){

78. handler.sendMessageDelayed(handler.obtainMessage(1), 200);

79. }

80. break;

81.

82. default:

83. break;

84. }

85. return false;

86. }

87.

88. };

89.

90. /**
91. * 獲得參考的View,主要是為了獲得它的MeasuredHeight,然後和滾動條的ScrollY+getHeight作比較。
92. /

93. public void getView(){

94. this.view=getChildAt(0);

95. if(view!=null){

96. init();

97. }

98. }

99.

100. /
*
101. * 定義接口
102. * @author admin
103. *
104. */

105. public interface OnScrollListener{

106. void onBottom();

107. void onTop();

108. void onScroll();

109. }

110. private OnScrollListener onScrollListener;

111. public void setOnScrollListener(OnScrollListener onScrollListener){

112. this.onScrollListener=onScrollListener;

113. }

114.}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved