android Scorller使用记录

本文介绍如何使用Android的Scorller类创建一个简单的可滚动布局组件ScrollLayout。该组件能够使内部视图实现滑动效果,并为实现下拉刷新功能打下基础。文章详细解释了computeScroll()和scrollTo()这两个关键方法的作用及如何正确刷新视图。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近学到android自定义控件,上次记录一个简单的自定义了一个显示图片控件,今天想做一个下拉刷新的控件,了解到Scorller类,它是android的帮助view滑动的一个帮助类,我也试着写了一个简单的ScorllLayout类,能使内部的view滑动,只是简单的封装了一下Scorller的功能,也是为下拉刷新控件做准备,记录一下。

package com.example.sosky.skytalk;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.FrameLayout;
import android.widget.Scroller;

/**
 * Created by sOSky on 2017/11/21.
 */

public class ScrollLayout extends FrameLayout {
    private Scroller mScorller;

    public ScrollLayout(Context context){
        super(context);
        mScorller = new Scroller(context);
    }
    public ScrollLayout(Context context, AttributeSet attributeSet){
        super(context,attributeSet);
        mScorller = new Scroller(context);
    }
    public ScrollLayout(Context context,AttributeSet attributeSet,int style){
        super(context,attributeSet,style);
        mScorller = new Scroller(context);
    }
    //在view重绘时被调用
    @Override
    public void computeScroll() {
        if (mScorller.computeScrollOffset()){
            this.scrollTo(mScorller.getCurrX(),mScorller.getCurrY());
            this.postInvalidate();
        }
    }
    public void scrollTo(int y){
        mScorller.startScroll(getScrollX(),getScrollY(),0,y,20000);
        this.invalidate();
    }
}
 <com.example.sosky.skytalk.ScrollLayout
            android:id="@+id/my_scrollLayout"
            android:layout_width="wrap_content"
            android:layout_height="300dp"
            android:layout_below="@id/my_imageview">
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="我们要开始滚动了!!!!"
                android:textSize="30dp"/>
        </com.example.sosky.skytalk.ScrollLayout>

其实主要函数只有两个,一个是computeScroll(),另外一个scrollTo()。computeScroll()是对view滑动重绘前时被调用,具体做的就是通过Scorller类让view滑动到应该滑动的位置(Scorller能够设置滑动时间,然后它来计算当前应当滑动到什么位置)。是否滑到终止也是由Scorller类的函数反馈的(computeScrollOffset())。
还有就是在两个函数刷新view的函数是不同的,虽然功能相同,他们在使用方式上同样也是不同的。
简洁的说 invalidate()只能在UI主线程中调用,而postinvalidate()可以在任何现成中调用。,因此在使用中注意调用函数的位置,避免出现异常。

有一个错误是我在自定义view中遇到的,Binary XML file line # : Error inflating class”,出现的原因是自定的view的构造函数有三个,在这里是
ScorllLayout(Context context);
ScorllLayout(Context context ,AttributeSet attributeSet);
ScorllLayout(CContext context,AttributeSet attributeSet,int style);
至少要实现前两个,如果你出现上面的异常,大多数时候是这个原因,其他原因可能就是引用路径有问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值