Android 在可滚动静态卡上显示标准玻璃滚动条
我使用可滚动静态卡片作为项目选择器(滚动直到找到一个,然后使用onItemSelected事件捕捉单击)。它可以工作,但它不会像菜单项和所有标准系统卡那样在底部显示滚动条。有什么方法可以实现它吗 以下是适配器代码: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;
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);