因此您可能知道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>
答案 0 :(得分:1)
截至目前,GDK不提供API来显示静态Card对象的菜单;只有Mirror API提供(“阅读更多”只是一个菜单选项)。谷歌很可能会在下一次GDK更新中添加静态卡的菜单支持。
您必须使用现场卡或沉浸式显示长文本,因为现场卡和沉浸式游戏都可以附加菜单并让您更好地控制UI。请参阅https://developers.google.com/glass/develop/gdk/ui/index以快速比较三种类型的UI选项。
你实际上可以通过将菜单附加到一个活动来使卡片上附有一个菜单,你可以在这个活动中创建一堆卡片对象的CardScrollView - 但这些卡片在时间线上并不是真正的静态卡片,尽管它们使用与静态卡相同的Card API创建。