在TextView中有一个单词总是高于另一个单词

时间:2017-05-04 02:41:54

标签: java android text

我有一个应用程序,是青年基督教歌曲的集合,现在我想添加和弦。所以,假设我在.txt文件中有以下行:

     D         G             D            

Amazing grace! How sweet the sound

当线条不适合屏幕时,总会发生这种情况:

D

G D

Amazing grace!

How sweet the sound

我希望这种情况发生:

D

Amazing grace!

G D

How sweet the sound!

抱歉不清楚,我真的希望这是有道理的。我见过其他应用程序这样做,但我不知道该怎么做。

修改:

我的歌曲结构如下:

[chords for phrase]

[phrase]

2 个答案:

答案 0 :(得分:2)

我对你现在的文本文件及其格式有点困惑。我理解你所要求的行为。您的实现需要使用和弦和歌词的分离来影响包装。因此,描绘和弦和歌词是必要的。我将专注于逻辑和设计,而不是具体实现我可能的解决方案。请进一步关注评论。

有问题的格式:

[----1st phrase chords----][----1st phrase lyrics----][----2nd phrase chords----][----2nd phrase lyrics----]

如果是这种情况,您可能会遇到麻烦,因为当您的第一根和弦已满时,您将无法知道歌词的开始位置。例如,请参阅下面的伪代码:

String textFile = //your song
while textFile has characters left
   fill a line of the TextView with chords
   fill the next line of the TextView with the associated lyrics
endwhile

while-loop中的第二行无法执行,因为您不知道歌词的开始位置。您可能需要手动将文件调整为第二种设计的格式,因为它们可能是手动间隔以适合这种格式(如果是这种格式)。

固定格式:

这些格式承认并解决了逻辑上分离和弦和歌词的问题。一种格式:

[----1st phrase chords----]
[----1st phrase lyrics----]
[----2nd phrase chords----]
[----2nd phrase lyrics----]

您可以将每行读入单独的字符串,或者将另一行写入两个单独的文件:

<强> chords.txt:

[----1st phrase chords----]
[----2nd phrase chords----]

<强> lyrics.txt:

[----1st phrase lyrics----]
[----2nd phrase lyrics----]   

我说文本文件,但它可能是通过网络请求等接收的数据。

一旦你分开你的和弦和歌词,可能会有一个针对TextViews的特定于Android的解决方案,但我有两个解决方法的想法。

第一个解决方法可以计算适合TextViews单行的字符数,并相应地拆分文本。即:

Discover a line of the TextView holds X monospaced characters
While the chords and lyrics aren't exhausted
    Fill a new TextView line with X characters of chords
    Fill a new TextView with X characters of lyrics
Endwhile

另一种可能的解决方法是使用两个TextViews具有双倍(或更大)的行间距并将它们放在彼此的顶部。你可以有一个TextView按住和弦,另一个保持歌词,歌词顶部有一行额外的空格。这是我尝试的例子:

.      First TextView           below          Second TextView
[----1st phrase chords      ----]   [----Whitespace added manually ----]
[----Line-spacing whitespace----]   [----1st phrase lyrics         ----]
[----2nd phrase chords      ----]   [----Line-spacing whitespace   ----]
[----Line-spacing whitespace----]   [----2nd phrase lyrics         ----]

重要注意事项:

您需要使用monospaced font。这意味着所有字符的宽度都相同。否则,特定字符将影响每行中的数字。

答案 1 :(得分:2)

Matt对如何构建数据给出了很好的解释。我只想添加实现细节。

假设输入数据采用以下格式:

[ChordName] [Phrase for the chord]

您可以使用水平RecyclerView来显示数据。每个项目的布局看起来像

<LinearLayout 
android:layout_height="match_parent"
android:layout_width="wrap_content"
android:orientation="vertical">
   <TextView 
     android:id="@+id/tv_chord_name"
     android:layout_height="wrap_content"
     android:layout_width="wrap_content"
     android:layout_gravity="center_horizontal"
     />
   <TextView
     android:layout_height="wrap_content"
     android:layout_width="wrap_content"
     android:id="@+id/tv_phrase"/>
</LinearLayout>

我只添加了一些属性来展示结构。您可以使用layout_gravity="center_horizontal"作为第一个文本视图,使和弦名称与歌词居中对齐。

这种方法的工作方式是LinearLayout的宽度设置为wrap_content,这意味着它有效地与最长的孩子的长度相同,这将是你案例中的第二个TextView

现在layout_gravity="center_horizontal"将根据TextView的长度自动居中第一个LinearLayout,这正是您所需要的。因此无需添加空格来对齐内容