无法在使用GDK的卡上显示“Read More”

时间:2014-01-22 14:49:20

标签: google-glass google-gdk

因此您可能知道Google Glass上的屏幕空间有限。 Mirror API具有很好的“阅读更多”功能,其中具有长文本的卡被转换为多个卡,用户可以通过这些卡滚动。我一直试图用GDK中的文本达到相同的效果,但无济于事。

所以问题是,如何简单地说,如何使用GDK向用户显示长文本?例如,这对于阅读新闻文章非常重要。

更新:找不到当前可用的内容,我创建了一个自动将文本拆分为多张卡片的活动。它并不理想,所以希望有人可以改进它。接口是使用类intent和text extra:

启动活动
case R.id.read_more:
    intent = new Intent(this, ReadMoreActivity.class);
    intent.putExtra(ReadMoreActivity.TEXT, text);
    startActivity(intent);
    return true;

这会调用ReadMoreActivity类,将文本分解为所需数量的卡片,以便查看全文。实现这一点的方式,我不建议以这种方式制作一部完整的小说,但它似乎可以处理多达十几张卡片的文字:

public class ReadMoreActivity extends Activity {

public static final String TEXT = "text";

private static final boolean DEBUG = true;
private static final String TAG = ReadMoreActivity.class.getSimpleName();

private static final float SPACING_MULT = 1.0f;
private static final float SPACING_ADD = 1.0f;
private static final boolean INCLUDE_PAD = false;

private String mText;
private CardScrollView mCardScrollView;
private TextCardScrollAdapter mAdapter;
private List<Card> mCards;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (savedInstanceState != null && savedInstanceState.containsKey(TEXT))
        mText = savedInstanceState.getString(TEXT);
    else if (getIntent() != null && getIntent().hasExtra(TEXT))
        mText = getIntent().getStringExtra(TEXT);
    else {
        Log.e(TAG, "no text found");
        finish();
        return;
    }

    createCardsFromText();
    mAdapter = new TextCardScrollAdapter();

    View rootLayout = getLayoutInflater().inflate(R.layout.card_scroll_layout, null);
    mCardScrollView = (CardScrollView)rootLayout.findViewById(R.id.card_scroll_view);
    mCardScrollView.setAdapter(mAdapter);
    mCardScrollView.activate();
    setContentView(rootLayout);
}

private void createCardsFromText() {
    int textSize = getResources().getDimensionPixelSize(R.dimen.card_main_layout_main_min_textSize);
    int maxWidth = getResources().getDimensionPixelSize(R.dimen.card_main_layout_main_width);
    int maxHeight = getResources().getDimensionPixelSize(R.dimen.card_main_layout_main_height);

    TextView tv = new TextView(this);
    tv.setTextSize(textSize);
    tv.setText(mText);
    StaticLayout measure = new StaticLayout(tv.getText(), tv.getPaint(),
            maxWidth, Layout.Alignment.ALIGN_NORMAL, 1.0f, 1.0f, false);
    int numLines = measure.getLineCount();
    if (DEBUG) Log.i(TAG, "calculated lines=" + numLines + " for text=[" + mText + "]");

    int linesPerCard = maxHeight / textSize;
    int numFullCards = numLines / linesPerCard;
    int numCards = numFullCards + (numLines % linesPerCard > 0 ? 1 : 0);

    mCards = new ArrayList<Card>();
    for (int cardNum = 0; cardNum < numCards; cardNum++) {
        int startLine = cardNum * linesPerCard;
        int nextStartLine = startLine + linesPerCard;
        int startOffset = measure.getLineStart(startLine);
        int endOffset = (nextStartLine < numLines) ? measure.getLineStart(nextStartLine) : mText.length();
        String cardText = mText.substring(startOffset, endOffset);
        Card card = new Card(this);
        card.setText(cardText);
        String cardFootnote = getString(R.string.read_more_format, cardNum + 1, numCards);
        card.setFootnote(cardFootnote);
        mCards.add(card);
    }
}

private class TextCardScrollAdapter 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();
    }
}
}

布局文件card_scroll_layout.xml' for this is pretty simple, just a wrapper around the CardScrollView`:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/black">

    <com.google.android.glass.widget.CardScrollView
        android:id="@+id/card_scroll_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</FrameLayout>

维度文件dimens.xml需要知道文本计算的卡片维度:

<dimen name="card_main_layout_main_width">560px</dimen>
<dimen name="card_main_layout_main_height">240px</dimen>
<dimen name="card_main_layout_main_min_textSize">30px</dimen>
<dimen name="card_main_layout_footnote_width">560px</dimen>
<dimen name="card_main_layout_footnote_height">40px</dimen>

同样在你的strings.xml中,你需要一些脚注,以便用户知道他们在阅读更多内容中的位置:

<string name="read_more_format">read more ~ page %1$d of %2$d</string>

1 个答案:

答案 0 :(得分:1)

截至目前,GDK不提供API来显示静态Card对象的菜单;只有Mirror API提供(“阅读更多”只是一个菜单选项)。谷歌很可能会在下一次GDK更新中添加静态卡的菜单支持。

您必须使用现场卡或沉浸式显示长文本,因为现场卡和沉浸式游戏都可以附加菜单并让您更好地控制UI。请参阅https://developers.google.com/glass/develop/gdk/ui/index以快速比较三种类型的UI选项。


你实际上可以通过将菜单附加到一个活动来使卡片上附有一个菜单,你可以在这个活动中创建一堆卡片对象的CardScrollView - 但这些卡片在时间线上并不是真正的静态卡片,尽管它们使用与静态卡相同的Card API创建。