模糊TextView中的特定单词

时间:2019-05-13 17:10:39

标签: android

我有一个Android应用程序,内部有一个垂直LinearLayout中的3个TextViews。我想通过包含应模糊处理的单词的String数组模糊TextViews的部分。 TextViews看起来像这样。

enter image description here

在此示例中,我要模糊单词“ than”和“ third”的所有出现。

我目前正在使用this answer中的BlurMaskFilter模糊文本。但是,它模糊了TextView中的整个文本,我只想模糊特定的单词。

我的解决方案是用3个水平LinearLayouts替换3个TextView,并遍历TextView的文本,当到达需要模糊的单词时,将TextView分成三个TextView:开始,模糊部分,结束。在我们的示例中,第三个TextView的名称为“ this is”,“ third”(模糊),“ textview”。

我遇到的问题可以在这里看到:

enter image description here

如您所见,当文本到达多行时,第二行不会从屏幕的开头开始,因为它是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>

1 个答案:

答案 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);