Android实现快速滚动FastScrollView效果

先看效果图:

public class FastScrollView extends ScrollView {

    private Rect mBarRect = new Rect();
    private int mScrollExWidth;
    private int mScrollExHeight;
    private boolean mScrollStart;
    private int dx, dy;
    private int mRightPadding;

    public FastScrollView(Context context) {
        super(context);
        init();
    }

    public FastScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public FastScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        mScrollExWidth = dip2px(16); //扩展拖动区域宽度,可自行修改
        mScrollExHeight = dip2px(50); //扩展拖动区域高度,可自行修改
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        switch (ev.getAction() & ev.getActionMasked()) {
            case MotionEvent.ACTION_DOWN:
                //Log.e("fly", "down");
                mScrollStart = false;
                if (canScroll()) {
                    dx = (int) ev.getX();
                    dy = (int) ev.getY();
                    float scrollPos = (float) getHeight() / getChildView().getHeight();
                    int barHeight = (int) (scrollPos * getHeight());
                    //Log.e("fly", scrollPos+", "+ barHeight);
                    mBarRect.left = getWidth() - mRightPadding - getVerticalScrollbarWidth();
                    mBarRect.right = getWidth() - mRightPadding;
                    mBarRect.top = (int) (getScrollY() * scrollPos);
                    mBarRect.bottom = mBarRect.top + barHeight;
                    //Dbg.print(mBarRect.left, mBarRect.right, mBarRect.top, mBarRect.bottom, dx, dy);
                    if (dx >= mBarRect.left - mScrollExWidth
                            && dx < mBarRect.right
                            && dy >= mBarRect.top - mScrollExHeight
                            && dy < mBarRect.bottom + mScrollExHeight) {
                        //Log.e("fly", "mScrollStart");
                        mScrollStart = true;
                    }
                }
                break;
            case MotionEvent.ACTION_MOVE:
                if (mScrollStart) {
                    int offsetY = (int) ev.getY() - dy;
                    //Log.e("fly", "move: " + ev.getY());
                    int top = mBarRect.top + offsetY;
                    float scrollPos = (float) top / getHeight();
                    int scrollY = (int) (scrollPos * getChildView().getHeight());
                    if (scrollY < 0) {
                        scrollY = 0;
                    }
                    if (scrollY > getChildView().getHeight() - getHeight()) {
                        scrollY = getChildView().getHeight() - getHeight();
                    }
                    setScrollY(scrollY);
                    return true;
                }
                break;
        }
        return super.dispatchTouchEvent(ev);
    }

    private boolean canScroll() {
        View child = getChildView();
        if (child != null && child.getHeight() > getHeight()) {
            return true;
        } else {
            return false;
        }
    }

    private View getChildView() {
        if (getChildCount() > 0) {
            return getChildAt(0);
        } else {
            return null;
        }
    }

    private int dip2px(float dpValue) {
        final float scale = getContext().getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);
    }

    /**
     * 这里不用view的paddding,用于预留特殊空隙
     *
     * @param mRightPadding
     */
    public void setRightPadding(int mRightPadding) {
        this.mRightPadding = mRightPadding;
    }
}

布局中设置了大滚动条样式,滚动时更加明显:

<com.zwxuf.apkparserdemo.FastScrollView
	android:id="@+id/mScrollView"
	android:layout_width="0dp"
	android:layout_weight="1"
	android:scrollbarSize="10dp"
	android:paddingRight="10dp"
	android:scrollbarThumbVertical="@drawable/fast_scroll_thumb_drawable"
	android:layout_height="match_parent">

	<HorizontalScrollView
		android:layout_width="match_parent"
		android:layout_height="match_parent" >

		<EditText
			android:id="@+id/et_xml"
			android:layout_width="wrap_content"
			android:layout_height="wrap_content"
			android:background="@null"
			android:editable="false"
			android:textColor="#000000"
			android:textSize="10sp"
			android:typeface="monospace"/>
	</HorizontalScrollView>

</com.zwxuf.apkparserdemo.FastScrollView>

同理,可以依此制作快速滚动的 HorizontalScrollView。

到此这篇关于Android实现快速滚动FastScrollView的文章就介绍到这了,更多相关android滚动FastScrollView内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 在Android项目中使用AspectJ的详细攻詻

    AOP 全称"Aspect Oriented Programming",面向切面编程,由于面向对象的思想要求高内聚,低耦合的风格,使模块代码间的可见性变差,对于埋点,日志输出等需求,就会变的十分复杂,如果手动编写代码,入侵性很大,不利于扩展,AOP应运而生. AspectJ AspectJ实际上是对AOP编程的实践,目前还有很多的AOP实现,如ASMDex,但笔者选用的是AspectJ. 使用场景 当我们需要在某个方法运行前和运行后做一些处理时,便可使用AOP技术.具体有: 统计埋点

  • Android notifyDataSetChanged() 动态更新ListView案例详解

    有时候我们需要修改已经生成的列表,添加或者修改数据,notifyDataSetChanged()可以在修改适配器绑定的数组后,不用重新刷新Activity,通知Activity更新ListView.今天的例子就是通过Handler AsyncTask两种方式来动态更新ListView. <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://sc

  • Android AS创建自定义布局案例详解

    先创建一个title.xml <LinearLayout 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" andr

  • AndroidStudio报错Emulator:PANIC:Cannot find AVD system path. Please define ANDROID_SDK_ROOT(解决方案)

    Android Studio 运行后出现了下面的错误 Emulator: Process finished with exit code 1 Emulator: PANIC: Cannot find AVD system path. Please define ANDROID_SDK_ROOT 仿真器:进程结束退出代码1 模拟器:恐慌:找不到AVD系统路径.请定义ANDROID_SDK_ROOT 解决办法如下: 1.先把下载的AVD全部删除 这样打开 这样点,把这里的全部删除了 2.配置电脑环境

  • 捕获与解析Android NativeCrash

    目录 一.NE 简介 1.1.so 组成 1.2.查看 so 状态 1.3.获取 strip 和未被 strip 的 so 二.NE 捕获与解析 2.1.logcat捕获 2.2.通过DropBox日志解析--适用于系统应用 2.3.通过BreakPad捕获解析--适用于所有应用 2.3.1.BreakPad的实现功能 2.3.2.BreakPad的捕获原理 2.3.3.解析dump文件 2.3.4.获取崩溃堆栈 三.so符号表的提取 3.1.提取 so 的符号表 3.2.符号表分析 3.2.1

  • 解决java.lang.NoClassDefFoundError: android.support.v4.animation.AnimatorCompatHelper问题

    在开发过程中,有的时候引入了多个三方库.在调用的时候会出现版本对应不上的原因.就会出现如标题的异常.解决的办法就是在你的build.gradle里面加入如下代码块: configurations.all { resolutionStrategy.eachDependency { DependencyResolveDetails details -> def requested = details.requested if (requested.group == 'com.android.supp

  • Android实现快速滚动FastScrollView效果

    先看效果图: public class FastScrollView extends ScrollView { private Rect mBarRect = new Rect(); private int mScrollExWidth; private int mScrollExHeight; private boolean mScrollStart; private int dx, dy; private int mRightPadding; public FastScrollView(Co

  • Android实现文字滚动播放效果的代码

    在开发时,我们会遇到文字过长,TextView不能完全展示,但又不想文字换行展示,这样有时会影响美观.这时我们就需要文字滚动播放,让用户可以看到所有的文字. 话不多说,直接上代码: import android.content.Context; import android.util.AttributeSet; import android.widget.TextView; public class MarqueTextView extends TextView { public MarqueT

  • Android自定义控件实现按钮滚动选择效果

    本文实例为大家分享了Android实现按钮滚动选择效果的具体代码,供大家参考,具体内容如下 效果图 代码实现 package com.demo.ui.view; import android.annotation.TargetApi; import android.content.Context; import android.os.Build; import android.os.Handler; import android.support.v4.content.ContextCompat;

  • Android RecyclerView 实现快速滚动的示例代码

    简评:Android Support Library 26 中终于实现了一个等待已久的功能: RecyclerView 的快速滚动 . Android 官方早就在建议开发者使用 RecyclerView 替代 ListView,RecyclerView 也确实表现要好于 ListView,除了没有快速滚动,就像下面这样: 因此,之前要想在 RecyclerView 上实现快速滚动,往往是依赖第三方库,比如:FutureMind/recycler-fast-scroll或 timusus/Recy

  • Android TextView 字体滚动效果

    Android TextView 字体滚动效果 实例代码: package com.godinsec.seland.ui.tools; import android.content.Context; import android.text.TextUtils.TruncateAt; import android.util.AttributeSet; import android.widget.TextView; public class MarqueTextView extends TextVi

  • Android实现文字滚动效果

    Android 实现文字滚动效果,自己写了个timer小计时器,textview文字上下翻动效果: public class AutoTextView extends TextSwitcher implements ViewSwitcher.ViewFactory { private float mHeight; private Context mContext; //mInUp,mOutUp分别构成向下翻页的进出动画 private Rotate3dAnimation mInUp; priva

  • Android 使用CoordinatorLayout实现滚动标题栏效果的实例

    在Material Design里,CoordinatorLayout通常用来作为顶层视图,来协调处理各个子View之间的动作,从而实现各种动画效果,如Snackbar与FloatingActionButton的配合显示效果,就是以CoordinatorLayout作为根布局来实现的 CoordinatorLayout提供Behaviors接口,子View通过实现Behaviors接口来协调和其它View之间的显示效果,可以这么理解: CoordinatorLayout让其子View之间互相知道

  • Android仿淘宝头条基于TextView实现上下滚动通知效果

    最近有个项目需要实现通知栏的上下滚动效果,仿淘宝头条的那种. 我从网上看了一些代码,把完整的效果做了出来.如图所示: 具体代码片段如下: 1.在res文件夹下新建anmin文件夹,在这个文件夹里创建两个文件 (1).anim_marquee_in.xml进入时动画 <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/ap

  • android实现自动滚动的Gallary控件效果

    本文实例讲述了android实现自动滚动的Gallary控件.分享给大家供大家参考.具体如下: import java.util.Timer; import java.util.TimerTask; import android.content.Context; import android.os.Handler; import android.util.AttributeSet; import android.util.Log; import android.view.KeyEvent; im

  • Android实现歌词滚动效果

    本文实例为大家分享了Android实现歌词滚动效果的具体代码,供大家参考,具体内容如下 自定义TextView public class VerticalScrollTextView extends TextView { private Paint mPaint; private float mX; private Paint mPathPaint; public int index = 0; private List<Sentence> list; public float mTouchHi

随机推荐