Android攻城狮ScrollView
ScrollView 滚动视图 滚动视图是指当前拥有很多内容,屏幕显示不完整时,需要通过滚动来显示完整的视图。 ----------------------------- ScrollBar分两种: HorizontalScrollView: 水平滚动视图 ScrollView: 垂直滚动视图 ----------------------------- 隐藏滚动条有两种方式: 一种是在标签中设置: android:scrollbars="none" 另一种是在代码中设置: setHorizontalScrollBarEnable(false); 隐藏横向ScrollView setVerticalScrollBarEnable(false); 隐藏纵向ScrollView
switch (event.getAction()){ case MotionEvent.ACTION_MOVE: /** * 1.getScrollY()----滚动条滑动的距离 * 2.getMeasuredHeight() * 3.getHeight() */ //顶部状态 if(scrollView.getScrollY()<=0){ Log.i("Main","顶部"); } //底部状态 //scrollView.getChild(0) 表示 scrollView的第一个子View,这里就是TextView。 //TextView的总高度=屏幕的高度+滚动条的最大滑动距离 //这里的条件是TextView的总高度<=屏幕的高度+滚动条的滑动距离,一旦达成条件,就说明滚动条已经达到最大距离,也就是到底了。 if(scrollView.getChildAt(0).getMeasuredHeight()<=scrollView.getHeight()+scrollView.getScrollY()){ Log.i("Main","滑动到底部"); Log.i("Main","scrollView.getChildAt(0).getMeasuredHeight()="+scrollView.getChildAt(0).getMeasuredHeight()+" scrollView.getHeight()="+scrollView.getHeight()+ "scrollView.getScrollY()="+scrollView.getScrollY()); textView.append(getResources().getString(R.string.content2)); } break;
ScrollView的监听器——setOnTouchLiatener的使用 应用案例:判断 ScrollView 何时滑动到底部 类似于 ListView的下拉更新,但这里使用的是 TextView+ScrollView。 监听事件中含有 onTouch()方法,和上一章的 Flipper的 onTouchEvent类似。 ----------------------------------- getScrollY()----滚动条滑动的距离 getMeasuredHeight() 视图的真实高度(隐藏部分+显示部分) getHeight() 视图显示部分的高度 -------------------------------------- 摘自评论区: <ScrollView>里边只能有一个元素,如果使用多个元素,需要把元素都放在<LinearLayout>等布局标签中,然后把布局标签在放在<ScrollView>否则放多个元素会报错。 -------------------------------------- 摘自评论区: 那个滚动到底部或顶部的判断,放在MotionEvent.ACTION_MOVE不合适,那里会执行很多次操作;放在MotionEvent.ACTION_UP比较适合,手指松开再去执行。
scrollTo 和 scrollBy区别
scrollTo: 相对于滚动视图的起始位置,去滚动相应的距离,所以只能滑动一次。
scrollBy: 相对于当前位置,去滚动相应的距离,每滚动一次就会更新当前位置,所以能不断滚动。
scrollBy的源码:
public void scrollBy(int x,int y){
scrollTo(mScrollX + x , mScrollY + y);
}
其中,mScrollX 和 mScrollY 表示当前坐标。
----------------------------------
应用案例:控制ScrollView视图的位置
实际案例:小说阅读,想要回到上次看的地方,如果采取手势滑动,要不停地滑,会比较麻烦,而现在采取按钮的方式代替手势滑动,可以直接定位到你上次浏览的地方,实现方法是记录上一次退出的位置,下次浏览时使用 scrollTo 或者 scrollBy 去恢复到上次浏览到的位置。
-------------------------------------
通过按钮滑动视图的步骤
1. 在 main.xml 中添加两个 Button,分别表示向上和向下(这里是垂直的ScrollView)。
2. 在 MainActivity中初始化这两个Button。令 MainActivity 实现接口 OnClickListener。
3. 对两个按钮设置监听器。
4. 重写 onClick():
(1)使用switch,通过view.getId()判断是哪个按钮点击。
(2)使用 scrollTo(int x,int y) 或者 scrollBy(int x,int y)实现滑动。
1 // ScrollView嵌套TextView,实现滚动条 滚动效果 2 //实现监听,对顶部和底部的判断 3 //控制滚动条滚动的位置,向上滚动或者向下滚动指定距离 4 public class MainActivity extends Activity implements OnClickListener { 5 private TextView textView; 6 private ScrollView scrollView; 7 private Button up, down; 8 9 @Override 10 protected void onCreate(Bundle savedInstanceState) { 11 super.onCreate(savedInstanceState); 12 setContentView(R.layout.main); 13 up = (Button) findViewById(R.id.up); 14 down = (Button) findViewById(R.id.down); 15 up.setOnClickListener(this); 16 down.setOnClickListener(this); 17 textView = (TextView) findViewById(R.id.content); 18 textView.setText(getResources().getString(R.string.content)); 19 scrollView = (ScrollView) findViewById(R.id.scrollview1); 20 //实现监听 21 scrollView.setOnTouchListener(new OnTouchListener() { 22 23 @Override 24 public boolean onTouch(View v, MotionEvent event) { 25 // TODO Auto-generated method stub 26 switch (event.getAction()) { 27 case MotionEvent.ACTION_UP: {break;} 28 case MotionEvent.ACTION_DOWN: {break;} 29 case MotionEvent.ACTION_MOVE: { 30 // 1.getScrollY()滚动条滑动的距离 31 // 2.getMeasureHeight() 总的长度 32 // 3.getHeight()一屏的内容高度 33 34 // 顶部状态 35 if (scrollView.getScrollY() <= 0) { 36 Log.i("main", "滑动到顶部"); 37 } 38 // 底部状态 39 // textview的总高度《=屏幕高度+滚动条的滚动距离 40 if (scrollView.getChildAt(0).getMeasuredHeight() <= scrollView 41 .getHeight() + scrollView.getScrollY()) { 42 Log.i("main", "滑动到底部咯"); 43 //继续添加数据 44 textView.append(getResources().getString( 45 R.string.content)); 46 } 47 break; 48 } 49 50 } 51 return false; 52 } 53 }); 54 55 } 56 //控制滚动条滚动的位置 57 @Override 58 public void onClick(View v) { 59 // TODO Auto-generated method stub 60 switch (v.getId()) { 61 // scrollView.scrollTo 以滚动视图起始位置计算 62 // scrollView.scrollBy 相对前一次位置滚动对应的距离 63 case R.id.up: { 64 scrollView.scrollTo(0, -30); 65 break; 66 } 67 case R.id.down: { 68 scrollView.scrollBy(0, 30); 69 break; 70 } 71 } 72 } 73 74 }