ScrollViewswiper container高度在滑动的时候如果上边超过屏幕的高度就报错

ScrollView,当显示的长度,超过了屏幕高度
[问题点数:40分]
ScrollView,当显示的长度,超过了屏幕高度
[问题点数:40分]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2014年8月 移动开发大版内专家分月排行榜第三
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。&&国之画&&&&&&
&& &&&&&&&&&&&&&&&&&&
鲁ICP备号-4
打开技术之扣,分享程序人生!问题:android页面内容超过屏幕高度,实现上下滑动查看隐藏内容
描述: 新建Activity布局使用RelativeLayout,页面内容超出了屏幕的高度,怎么实现上下滑动查看隐藏内容?
有类似Web的滚动条的效果吗? 解决方案1:使用ScrollView
解决方案2:好像RelativeLayout默认支持滚动的,刚开始研究安卓有许多不懂解决方案3:顶层加个
ScrollView&
以上介绍了“android页面内容超过屏幕高度,实现上下滑动查看隐藏内容”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:/itwd/1270545.html
上一篇: 下一篇:ScrollView的高度如何设置。_百度知道  这是一个很简单的功能,作为新手,做一下笔记。也给其它有需要的人提供一个参考。  首先HorizontalScrollView都知道用途了。它可以实现类似&桌面程序&左右切换页的效果。一般情况下里面的页数都是固定的,但是也有可能遇到不固定页数的,比如动态加载照片,或者像我这次需要实现的情况。  实现功能:实现日历的&日视图&。一页表示某一天的情况,向右翻页可翻到下一天,向左翻到上一天。而且可以随意翻到任意一天。每一页记录有当天的待办事项(这个就另外写了,这里只实现无限左右翻页)。  由于每天作为一页,把所有天数都加载到ScrollView中是不现实的。考虑到内存占用问题,ScrollView中肯定不要放太多东西的好。所以只放3页。如下图所示:  HorizontalScrollView中仅有3页。在第0页,向左翻的时候,松手的一瞬间,1页消失,-2页加载,然后smoothScroll到 -1页。向右亦然。因此可以保证不占用过多内存,又可以无限翻页。&  实现的时候还遇到一点小问题,顺便也一起写下来。  一开始我很自然地想到重写HorizontalScrollView。即代码中的KamHorizontalScrollView。主要是重写onTouchEvent方法,用于处理用户手指滑动事件。由于每个子View占一屏,不可以出现两个View各占一半的现象,需要有一个将子View分页化的方法。在我的代码中就是public boolean scrollToPage(int);该方法传入的是页码,可以保证滑动到正确的位置,而不会滑一半。还有一点要注意,翻页的时候,为了保证ScrollView只有3页,需要增加删除子View。在末尾增删没有问题,但在首部增加,所有的子View会向后移动,在首部删除,所有的子View会向前移动,因此这两个操作需要立即改变ScrollView的scroll值以保证屏幕显示顺滑。这一点在方法public boolean addLeft(View);和public boolean removeLeft();中均有体现。&  接下来是我写代码过程中出现的一些问题:  1、重写HorizontalScrollView后,我在构造函数中进行初始化,添加三个初始的子View,报错。  解决:构造函数调用的时候,ScrollView还没有实例化,因此这个时候不能添加子View。应该等实例化之后再添加。重写protected void onFinishInflate();方法即可得到实例化完成的时机,在该方法下初始化。  2、左右滑动的时候,我调用的是scrollToPage(1);但是总是滑动到第2页或第0页。就是不能定在第1页。  解决:这个问题我花了不少时间(其实如果我去认真看看API就能很快搞定的)。通过Log,发现addView之后,新的View的Left值仍是0。或者说addView之后的一瞬间,layout中的所有子View还是保持原有的状态。过了一阵子才又重新排列的。所以我需要获得他们重新排列的时机,才能scroll到正确位置。之前写JavaSE的自定义布局有重写过排列布局的方法,所以这个也有。说白了就是onLayout方法(我以为是onMeasure,试了不行很纠结)。onLayout方法中,应该就是对所有子View进行重新排列了。(这一点可以自己去试试,先addView,然后立刻获取刚才这个View的位置和尺寸,会发现都是0。然后你可以通过按键事件再获取一次,会发现得到正确值了。因为从addView到按键这段时间足够他重新排列了。)  所以通过LinearLayout.addOnLayoutChangeListener(listener);就可以监听重新排列的时机。但是该方法需要APILevel 11及以上。刚好我在用我的G12测试,APILevel10。虽然很纠结,我也只能重写了LinearLayout,即代码中的KamLinearLayout,还有自定义监听器kamLayoutChangeListener。重写仅仅是为了在Android2.3监听onLayout。&  另外加了一点小细节,翻页的机制除了手指滑动的距离,还有手指滑动的速度。自己写的SpeedChange三个方法。测试了一下感觉效果挺不错。&  最后把源码附上,注释写了比较详细的,希望能帮助到初学者。不要像我走太多弯路。(注意改包名)&KamHorizontalScrollView.java 1 package com.kam.horizontalscrollviewtest. 2
3 import com.kam.horizontalscrollviewtest.R; 4
5 import android.content.C 6 import android.graphics.C 7 import android.util.AttributeS 8 import android.util.DisplayM 9 import android.util.L 10 import android.view.G 11 import android.view.MotionE 12 import android.view.V 13 import android.view.ViewG 14 import android.widget.HorizontalScrollV 15 import android.widget.LinearL 16 import android.widget.TextV 17 import android.widget.FrameLayout.LayoutP 18 /*如果不需要支持Android2.3,可以将代码中所有KamLinearLayout替换为ViewGroup*/ 19 public class KamHorizontalScrollView extends HorizontalScrollView { 20
private static String tag = "KamHorizontalScrollView"; 21
private C 22
/*记录当前的页数标识(做日视图的时候可以和该值今日的日期作差)*/ 24
private int PageNo=0; 25
/*保存ScrollView中的ViewGroup,如果不需要支持Android2.3,可以将KamLinearLayout替换为ViewGroup*/ 27
private KamLinearLayout childGroup = 28
/*这是判断左右滑动用的(个人喜好,其实不需要这么麻烦)*/ 30
private int poscache[] = new int[4]; 31
public KamHorizontalScrollView(Context context, AttributeSet attrs, 34
int defStyle) { 35
super(context, attrs, defStyle); 36
// TODO Auto-generated constructor stub 37
this.context= 38
public KamHorizontalScrollView(Context context, AttributeSet attrs) { 40
super(context, attrs); 41
// TODO Auto-generated constructor stub 42
this.context= 43
public KamHorizontalScrollView(Context context) { 45
super(context); 46
// TODO Auto-generated constructor stub 47
this.context= 48
/*重写触摸事件,判断左右滑动*/ 51
@Override 52
public boolean onTouchEvent(MotionEvent ev) { 53
switch (ev.getAction()) { 54
case MotionEvent.ACTION_DOWN: 55
startpos = (int) ev.getX(); 56
/*用于判断触摸滑动的速度*/ 57
initSpeedChange((int) ev.getX()); 58 59
case MotionEvent.ACTION_MOVE: { 60
/*更新触摸速度信息*/ 61
movingSpeedChange((int) ev.getX()); 62
case MotionEvent.ACTION_UP: 65
case MotionEvent.ACTION_CANCEL: { 66
/*先根据速度来判断向左或向右*/ 67
int speed = releaseSpeedChange((int) ev.getX()); 68
if(speed&0){ 69
nextPage(); 70 71
if(speed&0){ 73
prevPage(); 74 75
/*这里是根据触摸起始和结束位置来判断向左或向右*/ 78
if (Math.abs((ev.getX() - startpos)) & getWidth() / 4) { 79
if (ev.getX() - startpos & 0) { 80
/*向左*/ 81
prevPage(); 82
} else { 83
/*向右*/ 84
nextPage(); 85
} else { 87
/*不变*/ 88
scrollToPage(1); 89
return super.onTouchEvent(ev); 94
/*完成实例化*/ 97
@Override 98
protected void onFinishInflate(){ 99
super.onFinishInflate();100
Log.i(tag, "onFinishInflate Called!");101
init();102
/*初始化,加入三个子View*/105
private void init(){106
this.childGroup=(KamLinearLayout) findViewById(R.id.container);107
/*添加LayoutChange监听器*/108
childGroup.addKamLayoutChangeListener(listener);109
/*调用其自身的LayoutChange监听器(不支持Android2.3)*/110
/*childGroup.addOnLayoutChangeListener(listener);*/111
addRight(createExampleView(-1));113
addRight(createExampleView(0));114
addRight(createExampleView(1));115
/*添加监听器*/117
kamLayoutChangeListener listener = new kamLayoutChangeListener() {118
@Override120
public void onLayoutChange() {121
// TODO Auto-generated method stub122
Log.i(tag, "onLayoutChanged Called!");123
scrollToPage(1);124
//注意,如果不需要支持Android2.3,可以将上面的listener替换成下方listener128
OnLayoutChangeListener listener = new OnLayoutChangeListener() {129
@Override131
public void onLayoutChange(View arg0, int arg1, int arg2, int arg3,132
int arg4, int arg5, int arg6, int arg7, int arg8) {133
// TODO Auto-generated method stub134
Log.i(tag, "onLayoutChanged Called!");135
scrollToPage(1);136
/*左翻页*/141
public void prevPage(){142
PageNo--;143
addLeft(createExampleView(PageNo-1));144
removeRight();145
/*右翻页*/148
public void nextPage(){149
PageNo++;150
addRight(createExampleView(PageNo+1));151
removeLeft();152
/*获取某个孩子的X坐标*/156
private int getChildLeft(int index){157
if (index&=0 && childGroup != null) {158
if(index& childGroup.getChildCount())159
return childGroup.getChildAt(index).getLeft();160
return 0;162
* 向右边添加View166
* @param view 需要添加的View167
* @return true添加成功|false添加失败168
public boolean addRight(View view){170
if(view==null || childGroup==null)171
childGroup.addView(view);172173
* 删除右边的View177
* @return true成功|false失败178
public boolean removeRight(){180
if( childGroup==null || childGroup.getChildCount()&=0)181
childGroup.removeViewAt(childGroup.getChildCount()-1);182183
* 向左边添加View187
* @param view 需要添加的View188
* @return true添加成功|false添加失败189
public boolean addLeft(View view){191
if(view==null || childGroup==null)192
childGroup.addView(view, 0);193
/*因为在左边增加了View,因此所有View的x坐标都会增加,因此需要让ScrollView也跟着移动,才能从屏幕看来保持平滑。*/195
int tmpwidth = view.getLayoutParams().196
if(tmpwidth==0)tmpwidth=getWinWidth();197
Log.i(tag, "the new view's width = "+view.getLayoutParams().width);198
this.scrollTo(this.getScrollX()+tmpwidth, 0);199
* 删除左边的View205
* @return true成功|false失败206
public boolean removeLeft(){208
if( childGroup==null || childGroup.getChildCount()&=0)209
/*因为在左边删除了View,因此所有View的x坐标都会减少,因此需要让ScrollView也跟着移动。*/211
int tmpwidth=childGroup.getChildAt(0).getWidth();212
childGroup.removeViewAt(0);213
this.scrollTo((int) (this.getScrollX()-tmpwidth), 0);214
* 跳转到指定的页面220
* @param index 跳转的页码222
* @return223
public boolean scrollToPage(int index){225
if(childGroup==null)226
if(index&0 || index &= childGroup.getChildCount())227
smoothScrollTo(getChildLeft(index), 0);228229
private int getWinWidth() {232
DisplayMetrics dm = new DisplayMetrics();233
// 获取屏幕信息234
dm = context.getResources().getDisplayMetrics();235
return dm.widthP236
private int getWinHeight() {239
DisplayMetrics dm = new DisplayMetrics();240
// 获取屏幕信息241
dm = context.getResources().getDisplayMetrics();242
return dm.heightP243
/*生成一个测试用View。真正使用的时候就不需要这个了。*/245
private View createExampleView(int index){246
LayoutParams params = new LayoutParams(getWinWidth(), getWinHeight());247
/*设置不同的背景色使效果更加明显*/248
int colorarr[] = {249
Color.rgb(240, 180, 180),250
Color.rgb(240, 240, 180),251
Color.rgb(180, 240, 240),252
Color.rgb(180, 240, 180)};253
TextView txtview = new TextView(context);254
txtview.setBackgroundColor(colorarr[(index%4+4) % 4]);255
txtview.setText(index + "");256
txtview.setTextSize(40);257
txtview.setGravity(Gravity.CENTER);258
txtview.setLayoutParams(params);259
/*下面的方法仅仅是个人喜好加上的,用于判断用户手指左右滑动的速度。*/265
private void initSpeedChange(int x){266
if(poscache.length&=1)267
poscache[0]=1;268
for(int i=1;i&poscache.i++){269
private void movingSpeedChange(int x){273
poscache[0]%=poscache.length-1;274
poscache[0]++;275
//Log.i(tag, "touch speed:"+(x-poscache[poscache[0]]));276
poscache[poscache[0]]=x;277
private int releaseSpeedChange(int x){279
return releaseSpeedChange(x, 30);280
private int releaseSpeedChange(int x,int limit){282
poscache[0]%=poscache.length-1;283
poscache[0]++;284
/*检测到向左的速度很大*/285
if(poscache[poscache[0]]-x&limit)return 1;286
/*检测到向右的速度很大*/287
if(x-poscache[poscache[0]]&limit)return -1;288
return 0;290
}291 }&&KamLinearLayout.java (如果不需要支持APILevel 10及以下,可以无视这个类) 1 package com.kam.horizontalscrollviewtest. 2
3 import android.content.C 4 import android.util.AttributeS 5 import android.widget.LinearL 6
7 public class KamLinearLayout extends LinearLayout { 8
kamLayoutChangeListener listener = 9
public void addKamLayoutChangeListener(kamLayoutChangeListener listener){11
this.listener=12
public KamLinearLayout(Context context) {15
super(context);16
// TODO Auto-generated constructor stub17
public KamLinearLayout(Context context, AttributeSet attrs) {19
super(context, attrs);20
// TODO Auto-generated constructor stub21
@Override25
public void onLayout(boolean changed,26
int l, int t, int r, int b){27
super.onLayout(changed, l, t, r, b);28
if(this.listener!=null)this.listener.onLayoutChange();29
}30 31 }32 /*自定义监听器*/33 interface kamLayoutChangeListener{34
abstract void onLayoutChange();35 36 }&MainActivity.java 1 package com.kam.hori 2
3 import android.support.v7.app.ActionBarA 4 import android.os.B 5 import android.view.M 6 import android.view.MenuI 7
8 public class MainActivity extends ActionBarActivity { 9 10
@Override11
protected void onCreate(Bundle savedInstanceState) {12
super.onCreate(savedInstanceState);13
setContentView(R.layout.kamhsview);14
@Override17
public boolean onCreateOptionsMenu(Menu menu) {18
// I this adds items to the action bar if it is present.19
getMenuInflater().inflate(R.menu.main, menu);2021
@Override24
public boolean onOptionsItemSelected(MenuItem item) {25
// Handle action bar item clicks here. The action bar will26
// automatically handle clicks on the Home/Up button, so long27
// as you specify a parent activity in AndroidManifest.28
int id = item.getItemId();29
if (id == R.id.action_settings) {3031
return super.onOptionsItemSelected(item);33
}34 }&kamhsview.&??&&com.kam.horizontalscrollviewtest.view.KamHorizontalScrollView
="/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/kamscrollview"
android:fadingEdge="none"
android:scrollbars="none"
&!-- 如果你不需要支持Android2.3,可以把后面的KamLinearLayout替换成普通的LinearLayout
&LinearLayout
android:id="@+id/container1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" &
&/LinearLayout & --&
&com.kam.horizontalscrollviewtest.view.KamLinearLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"&
&/com.kam.horizontalscrollviewtest.view.KamLinearLayout&&/com.kam.horizontalscrollviewtest.view.KamHorizontalScrollView&AndroidManifest就是默认的那个,没有改。&??&&manifest ="/apk/res/android"
package="com.kam.horizontalscrollviewtest"
android:versionCode="1"
android:versionName="1.0" &
android:minSdkVersion="8"
android:targetSdkVersion="10" /&
&application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppBaseTheme" &
android:name=".MainActivity"
android:label="@string/app_name" &
&intent-filter&
&action android:name="android.intent.action.MAIN" /&
&category android:name="android.intent.category.LAUNCHER" /&
&/intent-filter&
&/activity&
&/application&&/manifest&&

我要回帖

更多关于 ext containerscroll 的文章

 

随机推荐