`

使TextView文本可以水平和垂直滚动

阅读更多
在做一个小的电子书程序,要求电子书具有放大缩小的功能,所以肯定的要用到TextView的滚动效果。同样的还要求TextView在水平方向和垂直方向上都可以滚动。刚做的时候,也是没有头绪,后来想到了,TextView有一个ScrollTo或者ScrollBy方法,何不如此一用呢!

1.前期找资料

       因为刚开始,不知道怎么能够滚动,所以先去网上查找资料,垂直滚动很容易实现,直接使用TextView的

    setMovementMethod(ScrollingMovementMethod.getInstance());

方法就可以了。可是水平滚动如何实现?晚上说在TextView的前面在套一层HorizontalScrollView,这个我也做了尝试,效果不佳,因为你有可能要在程序中动态的改变TextView的布局,这样子程序中就会出错;在者如果你设定了你的TextView为500px,而你的内容一行要有700px,这时你的内容不会自动的切为两行;第三,在添加一个HorizontalScrollView感觉很不舒服,起码界面是这样。所以综合这几点,我放弃了使用这种方法。接着就想到用ScrollTo方法,首先需要声明的是,采用这种方法,你的程序中是没有水平和垂直滚动条的,这个你可以自己去优化实现,理论上是绝对可行的。我现在说的是我能保证文本可以水平和垂直滚动,但没有保证有滚动条。好,接下来,King就以一个实例做一下简单的使用。

2.我的实现。(里面注释很详细,就不过多说了)

public class Test_ScrollingText extends Activity implements OnTouchListener,

        OnGestureListener { // 实现触摸和手势的接口

    private TextView mContent;

    private DisplayMetrics metrics;

    private int mScreenWidth, mScreenHeight;// 屏幕分辨率

    private GestureDetector mDetector;// 手势监听者

    private String mDisplayTxt = "";

    private int mCurrentX = 0, mCurrentY = 0;// TextView左上角的像素值

 
    /** Called when the activity is first created. */

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        requestWindowFeature(Window.FEATURE_NO_TITLE);

        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,

                WindowManager.LayoutParams.FLAG_FULLSCREEN);// 全屏
 
        metrics = new DisplayMetrics();

        getWindowManager().getDefaultDisplay().getMetrics(metrics);

        mScreenWidth = metrics.widthPixels;

        mScreenHeight = metrics.heightPixels;// 获得屏幕分辨率
 
        setContentView(R.layout.main);// 指定布局

        mContent = (TextView) findViewById(R.id.content);
 
        resetTextView();

        loadFile();

        mDetector = new GestureDetector(this);

        mContent.setOnTouchListener(this);

        mContent.setLongClickable(true);// 初始化,注意这三步是必不可少的,但没顺序的限制

        mContent.setText(mDisplayTxt);// 显示文件内容

    }

 
    // 加载文件

    private void loadFile() {

        // TODO Auto-generated method stub

        String mTemp;

        try {

            InputStream mInputStream = getAssets().open("jinju.txt");

            BufferedReader mBufferedInputStream = new BufferedReader(

                    new InputStreamReader(mInputStream));

            while ((mTemp = mBufferedInputStream.readLine()) != null) {

                mDisplayTxt += mTemp;

            }

            mDisplayTxt = mDisplayTxt.replace(' ', '\n');

        } catch (IOException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

    }

 
    // 重置TextView的大小

    private void resetTextView() {

        // TODO Auto-generated method stub

        LinearLayout.LayoutParams mParams = (LayoutParams) mContent

                .getLayoutParams();

        mParams.width = mScreenWidth + 300;

        mParams.height = mScreenHeight + 500;

        mContent.setLayoutParams(mParams);

    }

 
    // 触摸TextView

    @Override

    public boolean onTouch(View v, MotionEvent event) {

        // TODO Auto-generated method stub

        return mDetector.onTouchEvent(event);// 工作交给手势监听者

    }

 
    // 下面的各个函数是OnGestureListener的实现,具体动作这里不做赘述

    @Override

    public boolean onDown(MotionEvent e) {

        // TODO Auto-generated method stub

        return false;

    }

 
    @Override

    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,

            float velocityY) {

        // TODO Auto-generated method stub

        return false;

    }

 
    @Override

    public void onLongPress(MotionEvent e) {

        // TODO Auto-generated method stub

 
    }
 

    @Override

    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,

            float distanceY) {

        // TODO Auto-generated method stub

        int mLayoutWidth = mContent.getLayoutParams().width; // 获得TextView的宽度

        int mLayoutHeight = mContent.getLineCount() * mContent.getLineHeight(); // 获得TextView的实际高度

        if (mCurrentX + distanceX >= 0) {

            if (mCurrentX + distanceX > mLayoutWidth - mScreenWidth) {

                mCurrentX = mLayoutWidth - mScreenWidth;

            } else {

                mCurrentX = (int) (mCurrentX + distanceX);

            }

        } else {

            mCurrentX = 0;

        }

        if (mCurrentY + distanceY >= 0) {

            if (mCurrentY + distanceY > mLayoutHeight - mScreenHeight) {

                mCurrentY = mLayoutHeight - mScreenHeight;

            } else {

                mCurrentY = (int) (mCurrentY + distanceY);

            }

        } else {

            mCurrentY = 0;

        }

        mContent.scrollTo(mCurrentX, mCurrentY); // 使文本滚动到指定的地方

        return false;

    }

 
    @Override

    public void onShowPress(MotionEvent e) {

        // TODO Auto-generated method stub

 

    }

 
    @Override

    public boolean onSingleTapUp(MotionEvent e) {

        // TODO Auto-generated method stub

        return false;

    }

}


3.后续

    我的文件是jinju.txt,是放在assets文件夹下面的,当然你可以放在其他的位置,指定你自己的路径就可以了,main.xml里面只有一个TextView,所以也没贴出来,下面看几张效果图:







http://hi.baidu.com/ljlkings/blog/item/ffe87e6cc51843cf80cb4a55.html

设置带滚动条的TextView
本来是想做一个显示文字信息的,当文字很多时View的高度不能超过一个固定的值,当文字很少时View的高度小于那个固定值时,按View的高度显示。因为ScrollView没有maxHeight,无法满足需求,只好另找方法了。
View本身是可以设置ScrollBar,这样就不一定需要依赖ScrollView了。TextView有个属性maxLine,这样也就满足了需求了,只要设置一个TextView带ScrollBar的,然后设置maxLine就可以了。
<TextView  
    android:id="@+id/text_view"  
    android:layout_width="fill_parent"  
    android:layout_height="wrap_content"  
    android:singleLine="false"  
    android:maxLines="10"  
    android:scrollbars="vertical"  
    />  

还需要在代码了设置TextView可以滚动。
TextView textView = (TextView)findViewById(R.id.text_view);   
textView.setMovementMethod(ScrollingMovementMethod.getInstance());


Android中计算一个文件在TextView中的显示
http://hi.baidu.com/ljlkings/blog/item/47f1afdb8874c9fd39012fdd.html
  • 大小: 66.5 KB
  • 大小: 58.1 KB
  • 大小: 58.8 KB
分享到:
评论

相关推荐

    Android TextView实现垂直滚动效果的方法

    在TextView中,如果文本很长,可能需要实现垂直滚动显示文本的效果。这里需要在XML布局文件中为TextView设置如下几个属性。 Android:scrollbars=vertical android:scrollbarStyle=X 其中X为outsideOverlay或...

    安卓textView相关-自定义垂直循环滚动Textview.rar

    自定义垂直循环滚动Textview.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。

    androidTextView的垂直滚动

    最近突然对原来做的一个项目有想法,当时是一个显示文本的界面会循环滚动,因为时间比较仓促,就以实现需求为目的写了一个滚动的TextView,结果还是效果挺好的。现在想把它分享给大家,这次写demo是从零开始,没在...

    Android中TextView实现垂直滚动和上下滚动效果

    上面左右滑动的非常好实现,直接把AutoHorizontalScrollTextView复制到项目中,复制全类名到布局文件中,和系统TextView一样,只需设置文本其他什么都不用设置; 下面垂直滚动的AutoVerticalScrollTextView相比...

    android UI TextView

    基本TextView控件的应用,包括TextView各种属性的设置,特殊的效果的TextView,如带边框的TextView各种实现方法,走马灯,垂直滚动,自动垂直滚动,歌词显示效果,超链接,Html标签在TextView中的应用等。

    clui:命令行用户界面(受TurboVision启发的控制台UI)

    TextView(具有垂直和水平滚动以及自动换行模式的类似ListBox的控件) ProgressBar(垂直和水平。后一个支持自定义文本控件) 框架(装饰性控件,也可以作为其他控件的容器) 可滚动框架 复选框(简单复选框) ...

    安卓java读取网页源码-Android_Assembly_Summary:对Android各组件分类汇总

    安卓java读取网页源码 Android_Assembly_Summary 对Android各组件分类汇总 一 、基本控件 TextView HTextView 一款支持TextView文字动画效果的Android组件库...垂直的Textview JumpingBeans 文字像 Mexican beans 一样

    Android基础知识详解

    垂直滚动(ScrollView) 77 水平滚动(HorizontalScrollView) 78 两个方向均可滚动 78 TabHost 79 ProgressBar、SeekBar、RatingBar 81 进度条(ProgressBar) 81 拖动条(SeekBar) 83 评分组件(RatingBar) 86 ...

    老罗android视频开发源码和ppt经典

    6.22 ScrollView垂直滚动控件的使用 6.23 HorizontalScrollView水平滚动 6.24 Gallery画廊控件 6.25 Spinner下拉列表控件 6.26 ImageSwitcher图片切换控件 6.27 GridView网格控件 6.28 TabHost卡片的使用 6.29 ...

    android 音乐播放器

    TextView &lt;style name="textview_style"&gt;... android:scrollbars="vertical"//滚动形式:垂直滚动 android:layout_width="match_parent"//宽度 android:layout_height="wrap_content" //高度 /&gt;

Global site tag (gtag.js) - Google Analytics