java - Android:在自定义 View 中启用滚动条

标签 java android scrollbar

我已经实现了一个扩展 RelativeLayout 的自定义布局。它显示许多在运行时创建的不同元素,并且可以使用 scrollTo() 和 scrollBy() 在两个维度上滚动。滚动有效,现在我想添加标准的 Android 滚动条。

使用 Scrollviews 是不可能的,因为我需要布局在 2 维中可滚动,所以我尝试按照此处所述进行操作:Android: Enable Scrollbars on Canvas-Based View

我已经使用一些(伪造的)值实现了所有计算*方法并启用了滚动条。但我仍然无法让他们出现。任何想法可能是什么问题?

在各种邮件列表和 SO 上有大量类似的问题,但到处都是答案似乎是“1. 调用 setHorizo​​ntalScrollbarEnabled(true),2. 实现所有计算*方法,3. 调用 awakenScrollbars()” .据我所知,我已经完成了所有这些工作,甚至尝试使用 initializeScrollbars() 但没有任何反应,文档也没有提供任何帮助。

public NodeLayout(Context context) {
    super(context);

    setVerticalScrollBarEnabled(true);
    setHorizontalScrollBarEnabled(true);

    TypedArray a = context.obtainStyledAttributes(R.styleable.View);
    initializeScrollbars(a);
    a.recycle();
}

@Override
protected int computeHorizontalScrollExtent() {
    return 5;
}

@Override
protected int computeHorizontalScrollOffset() {
    return 10;
}

@Override
protected int computeHorizontalScrollRange() {
    return 50;
}

@Override
protected int computeVerticalScrollExtent() {
    return getHeight() / 2;
}

@Override
protected int computeVerticalScrollOffset() {
    return getHeight() / 2;
}

@Override
protected int computeVerticalScrollRange() {
    return getHeight();
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    awakenScrollBars();
    invalidate();
    return true;
}

这就是我的 attrs.xml 文件的样子:

<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="View">
<attr name="android:background"/>
<attr name="android:clickable"/>
<attr name="android:contentDescription"/>
<attr name="android:drawingCacheQuality"/>
<attr name="android:duplicateParentState"/>
<attr name="android:fadeScrollbars"/>
<attr name="android:fadingEdge"/>
<attr name="android:fadingEdgeLength"/>
<attr name="android:fitsSystemWindows"/>
<attr name="android:focusable"/>
<attr name="android:focusableInTouchMode"/>
<attr name="android:hapticFeedbackEnabled"/>
<attr name="android:id"/>
<attr name="android:isScrollContainer"/>
<attr name="android:keepScreenOn"/>
<attr name="android:longClickable"/>
<attr name="android:minHeight"/>
<attr name="android:minWidth"/>
<attr name="android:nextFocusDown"/>
<attr name="android:nextFocusLeft"/>
<attr name="android:nextFocusRight"/>
<attr name="android:nextFocusUp"/>
<attr name="android:onClick"/>
<attr name="android:padding"/>
<attr name="android:paddingBottom"/>
<attr name="android:paddingLeft"/>
<attr name="android:paddingRight"/>
<attr name="android:paddingTop"/>
<attr name="android:saveEnabled"/>
<attr name="android:scrollX"/>
<attr name="android:scrollY"/>
<attr name="android:scrollbarAlwaysDrawHorizontalTrack"/>
<attr name="android:scrollbarAlwaysDrawVerticalTrack"/>
<attr name="android:scrollbarDefaultDelayBeforeFade"/>
<attr name="android:scrollbarFadeDuration"/>
<attr name="android:scrollbarSize"/>
<attr name="android:scrollbarStyle"/>
<attr name="android:scrollbarThumbHorizontal"/>
<attr name="android:scrollbarThumbVertical"/>
<attr name="android:scrollbarTrackHorizontal"/>
<attr name="android:scrollbarTrackVertical"/>
<attr name="android:scrollbars"/>
<attr name="android:soundEffectsEnabled"/>
<attr name="android:tag"/>
<attr name="android:visibility"/>
</declare-styleable>
</resources>

我正在为 Android 3.0 开发。

最佳答案

刚遇到同样的问题,终于弄明白了。

“问题”是您正在扩展 RelativeLayout,它是 ViewGroup 的子类。我发现我可以按照您在问题中描述的方式获得自定义 View 来显示滚动条,但是当我扩展 ViewGroup 或其子类之一时,没有滚动条出现了。

我终于想起 ViewGroup 默认情况下不会绘制自己。我在我的自定义 ViewGroup 构造函数中添加了一行: setWillNotDraw(false);

你懂什么,滚动条出现了!

希望对您有所帮助。

关于java - Android:在自定义 View 中启用滚动条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7312325/

相关文章:

java - 在字节好友中生成参数注解

android - 禁用其他子 fragment 的 View 寻呼机滑动

android - 如何以编程方式识别是否有任何损坏的 USB 电缆连接到 Android 充电端口?

jquery - Enscroll js 滚动条位于容器外

java - 对Java中的数组元素删除感到困惑

java - Eclipse编译将大量.class文件放入包文件夹中

java - 如何在 Spring 框架前端接收验证消息?

android - managed profile申请时如何获取主账号的包裹信息列表?

html - 垂直滚动条出现原因不明

html - 如何减慢悬停在滚动条上的效果?