Android 应用中TextView垂直滚动

jopen 13年前

项目中欢迎词多的时候需要实现上下滚动,了解到在android中TextView可以轻松实现横向跑马灯效果,但是对垂直滚动没有直接的支持方法,于是百度上谷歌,谷歌上百度,最终还是没有发现一个拿来即用的demo,呵呵,于是自己研究了下,写了一个可以实现TextView垂直滚动的 demo,由于项目需要,在这里我使用的是AbsoluteLayout布局,左右键切换时更改滚动内容,希望此demo能给有同样需求的童鞋们带来帮助!

---写在前面

 

textscroll.xml配置:

    <?xml version="1.0" encoding="utf-8"?>        <AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"            android:layout_width="match_parent"            android:layout_height="match_parent"            android:orientation="vertical" >                    <TextView                android:id="@+id/tScroll"                android:layout_width="fill_parent"                android:layout_height="wrap_content"                android:maxLines="5"                android:scrollbars="none"                android:singleLine="false"                android:textColor="#FF0000" >            </TextView>                </AbsoluteLayout>  
Java代码:
    package sue.test;                import java.util.ArrayList;        import java.util.List;                import com.amttgroup.element.Container;        import com.amttgroup.element.RootLayout;        import com.amttgroup.element.Text;        import com.amttgroup.utils.G;                import android.app.Activity;        import android.graphics.Color;        import android.os.Bundle;        import android.os.Handler;        import android.util.Log;        import android.view.Gravity;        import android.view.KeyEvent;        import android.widget.AbsoluteLayout;        import android.widget.TextView;                public class TextScrollActivity extends Activity {            TextView tv;            String L = "TextScrollActivity";            List<String> welcomeWords = new ArrayList<String>();            int curIndex = 0;                    @Override            protected void onCreate(Bundle savedInstanceState) {                super.onCreate(savedInstanceState);                        welcomeWords                        .add("        您的下榻使我们倍感荣幸。我谨代表北京饭店全体员工向您表示诚挚的欢迎。始建于1900年的北京饭店是一座历史悠久的豪华饭店。拥有豪华典雅的客房;口味独特的佳肴;会议会展设施及娱乐健身设施。我们将竭诚为您提供满意而舒适的服务。希望您在北京饭店下榻愉快。\n 您的下榻使我们倍感荣幸。我谨代表北京饭店全体员工向您表示诚挚的欢迎。始建于1900年的北京饭店是一座历史悠久的豪华饭店。拥有豪华典雅的客房;口味独特的佳肴;会议会展设施及娱乐健身设施。我们将竭诚为您提供满意而舒适的服务。希望您在北京饭店下榻愉快。");                welcomeWords                        .add("  It is an honor for you to stay at the Beijing Hotel. On behalf of the staff at the Beijing Hotel, I sincerely welcome you.Built in 1900, Beijing Hotel is a luxury hotel with a long history. We have elegant guestrooms, exquisite cuisine, convenient facilities and entertainment facilities. It is our pleasure to offer you the best services.Have a nice stay!");                        setContentView(R.layout.textscroll);                        tv = (TextView) findViewById(R.id.tScroll);                                /**                * 动态设置坐标及宽和高,也可以忽略,在配置文件中设置                */                AbsoluteLayout.LayoutParams lp = (AbsoluteLayout.LayoutParams) tv                        .getLayoutParams();                lp.x = 300;                lp.y = 300;                lp.width = 500;                lp.height = 170;                                tv.setTextSize(16);                tv.setTextColor(Color.WHITE);                tv.setGravity(Gravity.LEFT);                        tv.setText(welcomeWords.get(curIndex));                        h.postDelayed(r, 3000);            }                    Handler h = new Handler();             int i = 0;            Runnable r = new Runnable() {                        @Override                public void run() {                    int height = tv.getHeight();                    int scrollY = tv.getScrollY();                    int lineHeight = tv.getLineHeight();                    int lineCount = tv.getLineCount();//总行数                    /**                    * textView不可见内容的高度,可以理解为偏移位移                    */                    int maxY = (tv.getLineCount() * tv.getLineHeight()                            + tv.getPaddingTop() + tv.getPaddingBottom())                            - tv.getHeight();                                        Log.e("=maxY=", maxY+"");                    Log.e("=height=", height+"");                    Log.e("=lineCount=", tv.getLineCount()+"");                                        double viewCount = Math.floor(height / lineHeight);//可见区域最大显示多少行                    if (lineCount > viewCount) {//总行数大于可见区域显示的行数时则滚动                                if (scrollY >= maxY) {                            tv.scrollBy(0, -maxY);                        } else {                            tv.scrollBy(0, lineHeight);                        }                        h.postDelayed(this, 3000);                    }                        }                    };                    public boolean onKeyDown(int keyCode, KeyEvent event) {                        switch (keyCode) {                case KeyEvent.KEYCODE_DPAD_UP:                                        break;                case KeyEvent.KEYCODE_DPAD_DOWN:                                        break;                case KeyEvent.KEYCODE_DPAD_RIGHT:                                        handle();                    break;                case KeyEvent.KEYCODE_DPAD_LEFT:                                        handle();                    break;                case KeyEvent.KEYCODE_DPAD_CENTER:                    handle();                    break;                case KeyEvent.KEYCODE_ENTER:                    handle();                    break;                case KeyEvent.KEYCODE_BACK:                    finish();                                        break;                default:                                    }                return super.onKeyDown(keyCode, event);            }                    public void handle() {                        h.removeCallbacks(r);                                            curIndex = (curIndex + 1) % 2;                        tv.setText(welcomeWords.get(curIndex));                        h.postDelayed(r, 3000);                    }                    @Override            public void onDestroy() {                super.onDestroy();                h.removeCallbacks(r);            }                }