android可自动定位到底部的textview

背景

在很多情况下我们可能见过像类似显示歌词页面,出来一句歌词就自动将页面向上滚动并且定位到最底部,简单回忆并实现xml中创建和动态创建两种情况。

  • 第一种是在xml中创建布局
  • 第二种是动态生成的布局

分析

当然textview想要实现垂直滚动,我们可以将其外层嵌套一个ScrollView,设置好两个属性 android:fadeScrollbars=”false”和android:scrollbars=”vertical”,这是什么意思呢:fadeScrollbars就是是否显示滑动按钮,当然scrollbars是滑动的方向。

实例

一如既往,以实际演示为主更容易学会使用
- xml创建布局

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ScrollView
        android:id="@+id/scrollView"
        android:layout_width="match_parent"
        android:layout_height="300dp"
        android:background="@color/colorAccent"
        android:fadeScrollbars="false"
        android:scrollbars="vertical">

        <TextView
            android:id="@+id/textview"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:fadeScrollbars="false"
            android:scrollbars="vertical"
            android:textSize="25sp"/>
    </ScrollView>

    <Button
        android:id="@+id/btn_add"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/scrollView"
        android:text="增加"
        android:textSize="25sp"/>

</RelativeLayout>
  • MainActivity代码
public class MainActivity extends AppCompatActivity {
    TextView mTextView;
    ScrollView mScrollView;
    Button mButton;
    int count;
    Handler handler = new Handler();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTextView = (TextView) findViewById(R.id.textview);
        mScrollView = (ScrollView) findViewById(R.id.scrollView);
        mButton = (Button) findViewById(R.id.btn_add);
        mTextView.setMovementMethod(ScrollingMovementMethod.getInstance());
        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                count++;
                mTextView.append("\r\n");
                mTextView.append(count + "");
                scrollToBottom(mScrollView, mTextView);
            }
        });

    }


    /**
     * 根据scrolview 和子view去测量滑动的位置
     *
     * @param scrollView
     * @param view
     */
    private void scrollToBottom(final ScrollView scrollView, final View view) {

        handler.post(new Runnable() {

            @Override
            public void run() {
                if (scrollView == null || view == null) {
                    return;
                }
                // offset偏移量。是指当textview中内容超出 scrollview的高度,那么超出部分就是偏移量
                int offset = view.getMeasuredHeight()
                        - scrollView.getMeasuredHeight();
                if (offset < 0) {
                    offset = 0;
                }
                //scrollview开始滚动
                scrollView.scrollTo(0, offset);
            }
        });
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (handler != null) {
            handler = null;
        }

    }
}
  • 效果展示
    这里写图片描述

动态生成的可自行练习,思路是用悬浮窗实现。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值