android 滚动视图(ScrollView)学习与应用
2013-07-29 11:20
337 查看
文章转自:http://www.javaeye.com/topic/149773
[c-sharp]
view plaincopyprint?
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.TextView;
import com.scrollview.R;
/**
* Demonstrates wrapping a layout in a ScrollView.
*
*/
public class Scrollview extends Activity {
private static final String LOG_TAG =
"Scrollview";
private LinearLayout mLayout;
private ScrollView mScrollView;
private final Handler mHandler =
new Handler();
@Override
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
mLayout = (LinearLayout) findViewById(R.id.layout);
mScrollView = (ScrollView) findViewById(R.id.scrollview);
Button button = (Button) findViewById(R.id.add_widget);
button.setOnClickListener(mClickListener);
//改变默认焦点切换
button.setOnKeyListener(mAddButtonKeyListener);
}
private Button.OnClickListener mClickListener =
new Button.OnClickListener() {
private int mIndex = 1;
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
TextView textView = new TextView(Scrollview.this);
textView.setText("Text View " + mIndex);
LinearLayout.LayoutParams p =
new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.FILL_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT
);
mLayout.addView(textView, p);
Button buttonView = new Button(Scrollview.this);
buttonView.setText("Button " + mIndex++);
mLayout.addView(buttonView, p);
//改变默认焦点切换
buttonView.setOnKeyListener(mNewButtonKeyListener);
//投递一个消息进行滚动
mHandler.post(mScrollToBottom);
}
};
private Runnable mScrollToBottom =
new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
Log.d(LOG_TAG, "ScrollY: " + mScrollView.getScrollY());
int off = mLayout.getMeasuredHeight() - mScrollView.getHeight();
if (off > 0) {
mScrollView.scrollTo(0, off);
}
}
};
private View.OnKeyListener mNewButtonKeyListener =
new View.OnKeyListener() {
public boolean onKey(View v,
int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN &&
event.getAction() == KeyEvent.ACTION_DOWN &&
v == mLayout.getChildAt(mLayout.getChildCount() - 1)) {
findViewById(R.id.add_widget).requestFocus();
return
true;
}
return
false;
}
};
private View.OnKeyListener mAddButtonKeyListener =
new Button.OnKeyListener() {
@Override
public boolean onKey(View v,
int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
Log.d(LOG_TAG, event.toString());
View viewToFoucus = null;
if (event.getAction() == KeyEvent.ACTION_DOWN) {
switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_UP:
int iCount = mLayout.getChildCount();
if ( iCount > 0) {
viewToFoucus = mLayout.getChildAt(iCount - 1);
}
break;
case KeyEvent.KEYCODE_DPAD_DOWN:
if (mLayout.getChildCount() > 1) {
viewToFoucus = mLayout.getChildAt(1);
}
break;
default:
break;
}
}
if (viewToFoucus !=
null) {
viewToFoucus.requestFocus();
return true;
} else {
return false;
}
}
};
}
小结:
andorid view的键盘事件处理过程:
键盘事件首先交给当前Activity中获得焦点的View,该View的setKeyListener(OnKeyListener l)中设定的l的onKey方法被调用,若返回true,framwork不再处理,否则有framework继续处理.我就是用该方法实现的智能焦点切换。
然后是自动滚动的实现,当ViewGroup中添加了新的View后,不能马上进行滚动,因为此时相应的高度信息还没有更新,需要用Handler来向消息队列投递一个Runnale来进行滚动。
[c-sharp]
view plaincopyprint?
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.TextView;
import com.scrollview.R;
/**
* Demonstrates wrapping a layout in a ScrollView.
*
*/
public class Scrollview extends Activity {
private static final String LOG_TAG =
"Scrollview";
private LinearLayout mLayout;
private ScrollView mScrollView;
private final Handler mHandler =
new Handler();
@Override
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
mLayout = (LinearLayout) findViewById(R.id.layout);
mScrollView = (ScrollView) findViewById(R.id.scrollview);
Button button = (Button) findViewById(R.id.add_widget);
button.setOnClickListener(mClickListener);
//改变默认焦点切换
button.setOnKeyListener(mAddButtonKeyListener);
}
private Button.OnClickListener mClickListener =
new Button.OnClickListener() {
private int mIndex = 1;
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
TextView textView = new TextView(Scrollview.this);
textView.setText("Text View " + mIndex);
LinearLayout.LayoutParams p =
new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.FILL_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT
);
mLayout.addView(textView, p);
Button buttonView = new Button(Scrollview.this);
buttonView.setText("Button " + mIndex++);
mLayout.addView(buttonView, p);
//改变默认焦点切换
buttonView.setOnKeyListener(mNewButtonKeyListener);
//投递一个消息进行滚动
mHandler.post(mScrollToBottom);
}
};
private Runnable mScrollToBottom =
new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
Log.d(LOG_TAG, "ScrollY: " + mScrollView.getScrollY());
int off = mLayout.getMeasuredHeight() - mScrollView.getHeight();
if (off > 0) {
mScrollView.scrollTo(0, off);
}
}
};
private View.OnKeyListener mNewButtonKeyListener =
new View.OnKeyListener() {
public boolean onKey(View v,
int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN &&
event.getAction() == KeyEvent.ACTION_DOWN &&
v == mLayout.getChildAt(mLayout.getChildCount() - 1)) {
findViewById(R.id.add_widget).requestFocus();
return
true;
}
return
false;
}
};
private View.OnKeyListener mAddButtonKeyListener =
new Button.OnKeyListener() {
@Override
public boolean onKey(View v,
int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
Log.d(LOG_TAG, event.toString());
View viewToFoucus = null;
if (event.getAction() == KeyEvent.ACTION_DOWN) {
switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_UP:
int iCount = mLayout.getChildCount();
if ( iCount > 0) {
viewToFoucus = mLayout.getChildAt(iCount - 1);
}
break;
case KeyEvent.KEYCODE_DPAD_DOWN:
if (mLayout.getChildCount() > 1) {
viewToFoucus = mLayout.getChildAt(1);
}
break;
default:
break;
}
}
if (viewToFoucus !=
null) {
viewToFoucus.requestFocus();
return true;
} else {
return false;
}
}
};
}
[c-sharp] view plaincopyprint? <?xml version="1.0" encoding="utf-8"?> <!-- Demonstrates scrolling with a ScrollView. --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical"> <Button android:id="@+id/add_widget" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="增加按钮"/> <ScrollView android:id="@+id/scrollview" android:layout_width="fill_parent" android:layout_height="wrap_content" android:scrollbars="vertical"> <LinearLayout android:id="@+id/layout" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="wrap_content"> </LinearLayout> </ScrollView> </LinearLayout> <?xml version="1.0" encoding="utf-8"?> <!-- Demonstrates scrolling with a ScrollView. --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical"> <Button android:id="@+id/add_widget" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="增加按钮"/> <ScrollView android:id="@+id/scrollview" android:layout_width="fill_parent" android:layout_height="wrap_content" android:scrollbars="vertical"> <LinearLayout android:id="@+id/layout" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="wrap_content"> </LinearLayout> </ScrollView> </LinearLayout>
小结:
andorid view的键盘事件处理过程:
键盘事件首先交给当前Activity中获得焦点的View,该View的setKeyListener(OnKeyListener l)中设定的l的onKey方法被调用,若返回true,framwork不再处理,否则有framework继续处理.我就是用该方法实现的智能焦点切换。
然后是自动滚动的实现,当ViewGroup中添加了新的View后,不能马上进行滚动,因为此时相应的高度信息还没有更新,需要用Handler来向消息队列投递一个Runnale来进行滚动。
相关文章推荐
- 【android之ScrollView滚动视图】
- iOS学习笔记——滚动视图(scrollView)
- 从零开始学android<ScrollView滚动视图.十八.>
- Android复习之滚动视图scrollview
- Android布局控件之ScrollView(滚动视图)
- Android中滚动视图(ScrollView、HorizontalScrollView)的使用
- Cocos2d-x学习笔记(14)(更新函数scheduleUpdate、进度计时器CCProgressTo、滚动视图CCScrollView)
- 步步为营_Android开发课[25]_用户界面之ScrollView(滚动视图)
- 【Unity 3D】学习笔记七:ScrollView控件(滚动视图)
- Android应用开发学习笔记之网格视图
- Android应用开发学习之列表视图
- 从零開始学android<ScrollView滚动视图.十八.>
- Android应用开发学习笔记之画廊视图
- iOS学习笔记——滚动视图(scrollView)
- iOS学习笔记——滚动视图(scrollView)
- Android应用开发学习之画廊视图
- android-UI组件实例大全(十二)------ScrollView滚动视图
- Android零基础入门第61节:滚动视图ScrollView
- android 滚动视图(ScrollView)