Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/210.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在可滚动静态卡上显示标准玻璃滚动条_Android_Google Glass_Google Gdk - Fatal编程技术网

Android 在可滚动静态卡上显示标准玻璃滚动条

Android 在可滚动静态卡上显示标准玻璃滚动条,android,google-glass,google-gdk,Android,Google Glass,Google Gdk,我使用可滚动静态卡片作为项目选择器(滚动直到找到一个,然后使用onItemSelected事件捕捉单击)。它可以工作,但它不会像菜单项和所有标准系统卡那样在底部显示滚动条。有什么方法可以实现它吗 以下是适配器代码: private class FooCardScrollAdapter extends CardScrollAdapter { @Override public int findIdPosition(Object id) { return -1;

我使用可滚动静态卡片作为项目选择器(滚动直到找到一个,然后使用onItemSelected事件捕捉单击)。它可以工作,但它不会像菜单项和所有标准系统卡那样在底部显示滚动条。有什么方法可以实现它吗

以下是适配器代码:

private class FooCardScrollAdapter extends CardScrollAdapter {
    @Override
    public int findIdPosition(Object id) {
        return -1;
    }

    @Override
    public int findItemPosition(Object item) {
        return mCards.indexOf(item);
    }

    @Override
    public int getCount() {
        return mCards.size();
    }

    @Override
    public Object getItem(int position) {
        return mCards.get(position);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        return mCards.get(position).toView();
    }
}

这是一个众所周知的问题;目前无法在GDK
CardScrollView
上获取滚动指示器。请关注我们的问题跟踪程序,以便随着GDK的发展而更新

所以我和你有同样的问题。为了解决这个问题,我必须创建自己的滚动条视图。它不如镜像API的内置API好,因为它不处理fling滚动,但在谷歌发布自己的API之前,这是我们能做的最好的了

首先,我们创建一个自定义视图
SimulatedScrollBar

public class SimulatedScrollBar extends View {

private static final String TAG = SimulatedScrollBar.class.getSimpleName();
private static final boolean DEBUG = false;
private static final int WHITE_SCROLLBAR_COLOR = 0xfffefefe;

private int mScrollPosition;
private int mNumItems;
private Paint mPaint;
private float mInnerWidth;
private float mInnerHeight;
private int mOffsetX;
private int mWidth;
private int mHeight;

public SimulatedScrollBar(Context context, AttributeSet attrs) {
    super(context, attrs);
    TypedArray a = context.getTheme().obtainStyledAttributes(
            attrs,
            R.styleable.SimulatedScrollBar,
            0, 0);

    try {
        mScrollPosition = a.getInteger(R.styleable.SimulatedScrollBar_scrollPosition, 0);
        mNumItems = a.getInteger(R.styleable.SimulatedScrollBar_numItems, 0);
    } finally {
        a.recycle();
    }
    init();
}

private void init() {
    mPaint = new Paint();
    mPaint.setColor(WHITE_SCROLLBAR_COLOR);
    mPaint.setStyle(Paint.Style.FILL);
}

public int getScrollPosition() {
    return mScrollPosition;
}

public void setScrollPosition(int scrollPosition) {
    mScrollPosition = scrollPosition;
    invalidate();
    requestLayout();
}

public int getNumItems() {
    return mNumItems;
}

public void setNumItems(int numItems) {
    mNumItems = numItems;
    invalidate();
    requestLayout();
}

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);
    float xpad = (float)(getPaddingLeft() + getPaddingRight());
    float ypad = (float)(getPaddingTop() + getPaddingBottom());
    mInnerWidth = (float)w - xpad;
    mInnerHeight = (float)h - ypad;
    if (DEBUG) Log.i(TAG, "onSizeChanged() mInnerWidth=" + mInnerWidth + " mInnerHeight=" + mInnerHeight);
}

@Override
public void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    float widthFraction = mNumItems > 0 ? 1.0f / (float)mNumItems : 0;
    float scrollFraction = mNumItems > 0 ? (float)mScrollPosition / (float)mNumItems : 0;
    mOffsetX = (int)(mInnerWidth * scrollFraction);
    mWidth = (int)(mInnerWidth * widthFraction);
    mHeight = (int)mInnerHeight;
    Rect rect = new Rect(mOffsetX, 0, mOffsetX + mWidth, mHeight);
    if (DEBUG) Log.i(TAG, "onDraw() mOffsetX=" + mOffsetX + " mWidth=" + mWidth + " mHeight=" + mHeight
            + " mScrollPosition=" + mScrollPosition + " mNumItems=" + mNumItems);
    canvas.drawRect(rect, mPaint);
}

}
我们需要一个属性文件“attrs.xml”来支持配置视图:

<resources>
    <declare-styleable name="SimulatedScrollBar">
        <attr name="scrollPosition" format="integer"/>
        <attr name="numItems" format="integer"/>
    </declare-styleable>
</resources>
下面是您在
onCreate()
中放入的内容,用于将各个部分连接在一起:

mSimulatedScrollBar = (SimulatedScrollBar)rootLayout.findViewById(R.id.simulated_scroll_bar);
mSimulatedScrollBar.setScrollPosition(0);
mSimulatedScrollBar.setNumItems(mAdapter.getCount());

mCardScrollView = (CardScrollView)rootLayout.findViewById(R.id.card_scroll_view);
mCardScrollView.setAdapter(mAdapter);
mCardScrollView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        if (mSimulatedScrollBar != null)
            mSimulatedScrollBar.setScrollPosition(position);
    }
    @Override
    public void onNothingSelected(AdapterView<?> parent) {
    }
});
mCardScrollView.activate();
mSimulatedScrollBar=(SimulatedScrollBar)rootLayout.findViewById(R.id.simulated\u scroll\u bar);
mSimulatedScrollBar.setScrollPosition(0);
mSimulatedScrollBar.setNumItems(mAdapter.getCount());
mCardScrollView=(CardScrollView)rootLayout.findViewById(R.id.card\u scroll\u视图);
setAdapter(mAdapter);
mCardScrollView.setOnItemSelectedListener(新的AdapterView.OnItemSelectedListener(){
@凌驾
已选择公共视图(AdapterView父视图、视图视图、整型位置、长id){
if(mSimulatedScrollBar!=null)
mSimulatedScrollBar.setScrollPosition(位置);
}
@凌驾
未选择公共无效(AdapterView父级){
}
});
mCardScrollView.activate();

现在,当您在列表中滑动时,您将看到底部的滚动条跟踪列表位置。如果您的适配器更改了大小,请更新适配器或
onLoadFinished()
loader回调中的项目数和滚动位置。

从XE16开始,现在只需设置

mCardScrollView.setHorizontalScrollBarEnabled(true);
mCardScrollView.setHorizontalScrollBarEnabled(true);