android 滚动视图(ScrollView)学习与应用

文章转自:http://www.javaeye.com/topic/149773

[c-sharp] view plain copy print ?
  1. import android.app.Activity;    
  2. import android.os.Bundle;    
  3. import android.os.Handler;    
  4. import android.util.Log;    
  5. import android.view.KeyEvent;    
  6. import android.view.View;    
  7. import android.widget.Button;    
  8. import android.widget.LinearLayout;    
  9. import android.widget.ScrollView;    
  10. import android.widget.TextView;    
  11. import com.scrollview.R;  
  12. /** 
  13. * Demonstrates wrapping a layout in a ScrollView. 
  14. */   
  15. public class Scrollview extends Activity {    
  16.     private static final String LOG_TAG = "Scrollview";    
  17.     private LinearLayout mLayout;    
  18.     private ScrollView mScrollView;    
  19.     private final Handler mHandler = new Handler();    
  20.         
  21.     @Override   
  22.     protected void onCreate(Bundle icicle) {    
  23.         super.onCreate(icicle);    
  24.         setContentView(R.layout.main);    
  25.    
  26.         mLayout = (LinearLayout) findViewById(R.id.layout);    
  27.         mScrollView = (ScrollView) findViewById(R.id.scrollview);    
  28.    
  29.         Button button = (Button) findViewById(R.id.add_widget);    
  30.         button.setOnClickListener(mClickListener);    
  31.         //改变默认焦点切换    
  32.         button.setOnKeyListener(mAddButtonKeyListener);    
  33.     }    
  34.         
  35.     private Button.OnClickListener mClickListener = new Button.OnClickListener() {    
  36.         private int mIndex = 1;    
  37.         @Override   
  38.         public void onClick(View arg0) {    
  39.             // TODO Auto-generated method stub         
  40.             TextView textView = new TextView(Scrollview.this);    
  41.             textView.setText("Text View " + mIndex);    
  42.             LinearLayout.LayoutParams p = new LinearLayout.LayoutParams(    
  43.                     LinearLayout.LayoutParams.FILL_PARENT,    
  44.                     LinearLayout.LayoutParams.WRAP_CONTENT    
  45.             );    
  46.             mLayout.addView(textView, p);    
  47.    
  48.             Button buttonView = new Button(Scrollview.this);    
  49.             buttonView.setText("Button " + mIndex++);    
  50.             mLayout.addView(buttonView, p);    
  51.             //改变默认焦点切换    
  52.             buttonView.setOnKeyListener(mNewButtonKeyListener);    
  53.             //投递一个消息进行滚动    
  54.             mHandler.post(mScrollToBottom);    
  55.         }           
  56.     };    
  57.         
  58.     private Runnable mScrollToBottom = new Runnable() {    
  59.         @Override   
  60.         public void run() {    
  61.             // TODO Auto-generated method stub    
  62.             Log.d(LOG_TAG, "ScrollY: " + mScrollView.getScrollY());    
  63.             int off = mLayout.getMeasuredHeight() - mScrollView.getHeight();    
  64.             if (off > 0) {    
  65.                 mScrollView.scrollTo(0, off);    
  66.             }                           
  67.         }    
  68.     };    
  69.        
  70.     private View.OnKeyListener mNewButtonKeyListener = new View.OnKeyListener() {    
  71.         public boolean onKey(View v, int keyCode, KeyEvent event) {    
  72.             if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN &&    
  73.                     event.getAction() == KeyEvent.ACTION_DOWN &&    
  74.                     v == mLayout.getChildAt(mLayout.getChildCount() - 1)) {    
  75.                 findViewById(R.id.add_widget).requestFocus();    
  76.                 return true;    
  77.             }    
  78.             return false;    
  79.         }    
  80.     };    
  81.         
  82.     private View.OnKeyListener mAddButtonKeyListener = new Button.OnKeyListener() {    
  83.         @Override   
  84.         public boolean onKey(View v, int keyCode, KeyEvent event) {    
  85.             // TODO Auto-generated method stub    
  86.             Log.d(LOG_TAG, event.toString());    
  87.                 
  88.             View viewToFoucus = null;    
  89.             if (event.getAction() == KeyEvent.ACTION_DOWN) {    
  90.                 switch (keyCode) {    
  91.                 case KeyEvent.KEYCODE_DPAD_UP:    
  92.                     int iCount = mLayout.getChildCount();    
  93.                     if ( iCount > 0) {    
  94.                         viewToFoucus = mLayout.getChildAt(iCount - 1);    
  95.                     }    
  96.                     break;    
  97.                 case KeyEvent.KEYCODE_DPAD_DOWN:    
  98.                     if (mLayout.getChildCount() > 1) {    
  99.                         viewToFoucus = mLayout.getChildAt(1);    
  100.                     }    
  101.                     break;    
  102.                 default:    
  103.                     break;    
  104.                 }    
  105.             }    
  106.                 
  107.             if (viewToFoucus != null) {    
  108.                 viewToFoucus.requestFocus();    
  109.                 return true;    
  110.             } else {    
  111.                 return false;    
  112.             }    
  113.         }    
  114.     };    
  115. }   

[c-sharp] view plain copy print ?
  1. <?xml version="1.0" encoding="utf-8"?>    
  2. <!-- Demonstrates scrolling with a ScrollView. -->    
  3. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"   
  4.     android:layout_width="fill_parent"   
  5.     android:layout_height="wrap_content"   
  6.     android:orientation="vertical">    
  7.     <Button android:id="@+id/add_widget"   
  8.         android:layout_width="wrap_content"   
  9.         android:layout_height="wrap_content"   
  10.         android:text="增加按钮"/>    
  11. <ScrollView  
  12.     android:id="@+id/scrollview"   
  13.     android:layout_width="fill_parent"   
  14.     android:layout_height="wrap_content"   
  15.     android:scrollbars="vertical">    
  16.     <LinearLayout    
  17.         android:id="@+id/layout"   
  18.         android:orientation="vertical"   
  19.         android:layout_width="fill_parent"   
  20.         android:layout_height="wrap_content">    
  21.     </LinearLayout>    
  22. </ScrollView>    
  23. </LinearLayout>   

小结:

andorid view的键盘事件处理过程:
键盘事件首先交给当前Activity中获得焦点的View,该View的setKeyListener(OnKeyListener l)中设定的l的onKey方法被调用,若返回true,framwork不再处理,否则有framework继续处理.我就是用该方法实现的智能焦点切换。

然后是自动滚动的实现,当ViewGroup中添加了新的View后,不能马上进行滚动,因为此时相应的高度信息还没有更新,需要用Handler来向消息队列投递一个Runnale来进行滚动。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值