android - AppCompat v7 r21 更改 ActionBar 标题的 Alpha

标签 android android-actionbar android-support-library android-appcompat

使用以前版本的 AppCompat 可以很容易地获取 ActionBar 的标题 TextView 并对其进行修改。

这是我使用的方法:

 private TextView getActionBarTitleView() {
     int id = getResources().getIdentifier("action_bar_title", "id", "android");
     return (TextView) findViewById(id);
}

然后更改标题的 alpha 值:

getActionBarTitleView().setAlpha(ratio*255);

现在由于某些原因,最新 AppCompat 版本的“action_bar_title”不再起作用。当我尝试使用我的方法时,它返回给我“null”。尝试使用 ActionBar 的其他 ID,但没有找到合适的 ID。

我在 StackOverflow 上看到了 Ahmed Nawara 的 1 篇文章,他目前找到的唯一方法是对 Toolbar 的 subview 进行迭代,并且每当 TexView 找到,将它的文本值与 toolbar.getTitle() 进行比较,以确保这是我们正在查看的 TexView

如果有人可以帮助我将此解决方案集成到我的案例中,因为我实际上不知道该怎么做。

最佳答案

我猜你是从 Flavien Laurent's post 得到你的方法的让 ActionBar 不乏味。如果您仔细观察,他详细介绍了另一种设置 ActionBar 标题的 alpha 的技术,其灵感来自 Cyril Mottier。

它使用自定义 AlphaForegroundColorSpan 类扩展 ForegroundColorSpan :

public class AlphaForegroundColorSpan extends ForegroundColorSpan
{
    private float mAlpha;

    public AlphaForegroundColorSpan(int color)
    {
        super(color);
    }

    public AlphaForegroundColorSpan(Parcel src)
    {
        super(src);
        mAlpha = src.readFloat();
    }

    public void writeToParcel(Parcel dest, int flags)
    {
        super.writeToParcel(dest, flags);
        dest.writeFloat(mAlpha);
    }

    @Override
    public void updateDrawState(TextPaint ds)
    {
        ds.setColor(getAlphaColor());
    }

    public void setAlpha(float alpha)
    {
        mAlpha = alpha;
    }

    public float getAlpha()
    {
        return mAlpha;
    }

    private int getAlphaColor()
    {
        int foregroundColor = getForegroundColor();
        return Color.argb((int) (mAlpha * 255), Color.red(foregroundColor), Color.green(foregroundColor), Color.blue(foregroundColor));
    }
}

然后,使用 SpannableString,您只需将 alpha 设置为 AlphaForegroundColorSpan,然后将此 AlphaForegroundColorSpan 设置为 SpannableString :

public void onCreate(Bundle savedInstanceState)
{
    ...
    spannableString = new SpannableString("ActionBar title");
    alphaForegroundColorSpan = new AlphaForegroundColorSpan(0xffffffff);
    ...
}

private void setActionBarTitle(int newAlpha)
{
    alphaForegroundColorSpan.setAlpha(newAlpha);
    spannableString.setSpan(alphaForegroundColorSpan, 0, spannableString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    getSupportActionBar().setTitle(spannableString);
}

希望对您有所帮助。如果还不够清楚,再看看 Flavient Laurent 的帖子!

关于android - AppCompat v7 r21 更改 ActionBar 标题的 Alpha,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26572164/

相关文章:

android - 如何在 C 中将 *.vert 和 *.frag 转换为 char?

java - 安卓工作室 : finished with non-zero exit value2

android - 两个版本的android support-v4

android - Circular Reveal Android Compat With Design Library 28

android - usb_buffer_free 和 usb_buffer_alloc 的编译错误

Android Studio - Google map 在真正的 Android 设备上发布 apk 时仍为空白

android - 在 Android 5.0 上的 Activity 之间转换时如何排除 ActionBar

android - 删除操作栏下方的阴影

Android ActionBar 模式 - 多个 Activity 或 fragment

android - float 操作按钮不会停留在 SnackBar 之上