我有一个Android应用程序,内部有一个垂直LinearLayout中的3个TextViews。我想通过包含应模糊处理的单词的String数组模糊TextViews的部分。 TextViews看起来像这样。
在此示例中,我要模糊单词“ than”和“ third”的所有出现。
我目前正在使用this answer中的BlurMaskFilter
模糊文本。但是,它模糊了TextView中的整个文本,我只想模糊特定的单词。
我的解决方案是用3个水平LinearLayouts替换3个TextView,并遍历TextView的文本,当到达需要模糊的单词时,将TextView
分成三个TextView:开始,模糊部分,结束。在我们的示例中,第三个TextView
的名称为“ this is”,“ third”(模糊),“ textview”。
我遇到的问题可以在这里看到:
如您所见,当文本到达多行时,第二行不会从屏幕的开头开始,因为它是LinearLayout
,并且视图需要占用一些空间。我想要实现的是能够在一行的中间剪切一个TextView,即使它是多行TextView,也可以在其旁边添加另一个TextView并对其进行模糊处理,然后在其后添加文本的连续部分,从头开始下一行。我不知道可以满足这些需求的任何布局类型,也不知道以其他方式实现它的方法。
我当前的代码实现上图所示的状态:
活动->创建文本,并将其附加到布局:
LinearLayout linear0 = findViewById(R.id.testlinear0);
LinearLayout linear1 = findViewById(R.id.testlinear1);
LinearLayout linear2 = findViewById(R.id.testlinear2);
TextView firstTextView = new TextView(this);
firstTextView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT));
setHtmlText(firstTextView, "adsada");
firstTextView.setTextAppearance(this, R.style.WikiTextViewStyle);
TextView aaa = new TextView(this);
aaa.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
setHtmlText(aaa, HelperClass.levelsContent.get(levelName)[0]);
aaa.setTextAppearance(this, R.style.WikiTextViewStyle);
TextView secondTextView = new TextView(this);
secondTextView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
setHtmlText(secondTextView, HelperClass.levelsContent.get(levelName)[1]);
secondTextView.setTextAppearance(this, R.style.WikiTextViewStyle);
TextView thirdTextView = new TextView(this);
thirdTextView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
setHtmlText(thirdTextView, HelperClass.levelsContent.get(levelName)[2]);
thirdTextView.setTextAppearance(this, R.style.WikiTextViewStyle);
thirdTextView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
float radius = thirdTextView.getTextSize() / 3;
BlurMaskFilter filter = new BlurMaskFilter(radius, BlurMaskFilter.Blur.NORMAL);
thirdTextView.getPaint().setMaskFilter(filter);
linear0.addView(firstTextView);
linear0.addView(aaa);
linear1.addView(secondTextView);
linear2.addView(thirdTextView);
布局->
<LinearLayout
android:id="@+id/imgLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/white"
android:gravity="center"
android:orientation="vertical">
<LinearLayout
android:id="@+id/testlinear0"
android:layout_width="match_parent"
android:orientation="horizontal"
android:layout_height="wrap_content"/>
<LinearLayout
android:id="@+id/testlinear1"
android:layout_width="match_parent"
android:orientation="horizontal"
android:layout_height="wrap_content"/>
<LinearLayout
android:id="@+id/testlinear2"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
答案 0 :(得分:3)
也许使用SpannableString
并使用MaskFilterSpan
标记要模糊的文本部分?例如:
SpannableString string = new SpannableString("Text with blur mask");
MaskFilter blurMask = new BlurMaskFilter(5f, BlurMaskFilter.Blur.NORMAL);
string.setSpan(new MaskFilterSpan(blurMask), 10, 15, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(string);