2014-01-22 24 views
2

因此,您可能知道Google Glass上的屏幕空間有限。 Mirror API有一個很好的「閱讀更多」功能,可以將長文本卡片轉換爲多張卡片,用戶可以通過該卡片進行滾動。我一直試圖用GDK中的文字來達到同樣的效果,但無濟於事。無法在GDK卡上顯示「更多信息」

所以問題是,很簡單,我如何使用GDK向用戶顯示長文本?例如,這對閱讀新聞報道非常重要。

更新:沒有找到任何可用的東西,我創建了一個活動,自動將文本分成多張卡片。這並不理想,所以希望有人可以改進它。接口是一類意圖和text額外的啓動活動:

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你需要小號omething的註腳,因此用戶知道自己在閱讀位置更多:

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

GDK中的任何更新都可以在卡片生成器中顯示ling文本? –

回答

1

截至目前,GDK不提供API來顯示一個靜態的卡對象的菜單;只有Mirror API提供了這個功能(「Read more」只是一個菜單選項)。 Google很可能會在下一次GDK更新中添加對靜態卡的菜單支持。

您必須使用即時貼或沉浸式屏幕才能顯示長文本,因爲活動卡片和沉浸式文件都可以附加菜單並讓您更好地控制UI。請參閱https://developers.google.com/glass/develop/gdk/ui/index以快速比較三種類型的UI選項。


實際上,你可以做一個卡似乎通過附加一個菜單,在其中創建了一堆卡對象的CardScrollView的活動已連接到它的菜單 - 但這些卡是不是真的在靜態卡時間表,儘管它們是使用與靜態卡相同的卡API創建的。

+0

嗯,我在活動中獲得了該卡,並且該活動顯示了該菜單。我試圖找到一種方法將文本「分解」爲幾張卡片。如果沒有更好的方法,我可能必須手動將其設置爲CardScrolLView。 – johnarleyburns

+0

CardScrollView是一個好主意。我的答案在這裏有更多的信息:http://stackoverflow.com/questions/21262830/how-to-scroll-live-cards-in-aglass-activity/21290443#21290443 –