我有一个应用程序,是青年基督教歌曲的集合,现在我想添加和弦。所以,假设我在.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]
答案 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
,这正是您所需要的。因此无需添加空格来对齐内容