15

TextView我的活动中有一个要添加阴影的活动。它应该看起来像OsmAnd(100% 不透明):

我想要的是

但它看起来像这样:

我有的

可以看到当前阴影模糊并逐渐消失。我想要一个坚实的、不透明的阴影。但是怎么做?

我目前的代码是:

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/speedTextView"
    android:text="25 km/h"

    android:textSize="24sp"
    android:textStyle="bold"
    android:textColor="#000000"
    android:shadowColor="#ffffff"
    android:shadowDx="0"
    android:shadowDy="0"
    android:shadowRadius="6"
/>
4

2 回答 2

11

我尝试了这里这里这里等其他帖子中的所有技巧、提示和技巧。

它们都没有那么好或看起来那么好。

现在这就是你真正的做法(在OsmAnd应用程序的源代码中找到):

您使用 FrameLayout(具有将其组件相互叠加的特性)并将 2 个 TextViews 放在同一位置。

MainActivity.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:background="#445566">

    <FrameLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="top"
        android:layout_weight="1">

        <TextView
            android:id="@+id/textViewShadowId"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="top"
            android:textSize="36sp"
            android:text="123 ABC" 
            android:textColor="#ffffff" />

        <TextView
            android:id="@+id/textViewId"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="top"
            android:textSize="36sp"
            android:text="123 ABC"
            android:textColor="#000000" />
    </FrameLayout>

</LinearLayout>

onCreate您的活动方法中,您设置阴影 TextView 的笔触宽度并将其从 FILL 更改为 STROKE:

import android.graphics.Paint;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
    
public class MainActivity extends AppCompatActivity {    

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        //here comes the magic
        TextView textViewShadow = (TextView) findViewById(R.id.textViewShadowId);
        textViewShadow.getPaint().setStrokeWidth(5);
        textViewShadow.getPaint().setStyle(Paint.Style.STROKE);
    }
}

结果如下所示:

结果截图

于 2016-08-26T09:42:11.610 回答
3

我遇到了同样的问题,调用setTextColor导致onDraw无限绘制循环。我想让我的自定义文本视图在渲染文本时具有与轮廓颜色不同的填充颜色。这就是为什么我setTextColor多次打电话的原因onDraw

我使用OutlineSpan参见https://github.com/santaevpavel/OutlineSpan找到了替代解决方案。这比使用多个 TextView 或使用反射使布局层次结构复杂化要好,并且需要最少的更改。有关详细信息,请参阅 github 页面。例子

val outlineSpan = OutlineSpan(
    strokeColor = Color.RED,
    strokeWidth = 4F
)
val text = "Outlined text"
val spannable = SpannableString(text)
spannable.setSpan(outlineSpan, 0, 8, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)

// Set text of TextView
binding.outlinedText.text = spannable 
于 2019-06-19T23:09:51.890 回答