运行时获取colorControlHighlight值返回负数及波纹透明度设置疑问
解答你的Android波纹颜色相关问题
Hey there! Let's break down your questions step by step using the code snippets you provided:
1. 波纹透明度需要手动设置吗?
完全不需要手动添加10%透明度。Android默认的?attr/selectableItemBackground对应的RippleDrawable会自动对colorControlHighlight指定的颜色应用符合Material Design规范的透明度(视觉上约10%的不透明度效果)。你在ripple_theme里设置的@color/google_yellow100会被系统自动处理成带透明度的波纹效果,无需额外手动调整。
2. 获取colorControlHighlight得到负数的解决办法
你拿到的负数其实是正常的ARGB颜色整数表示,不用紧张!原因是:
- Android中颜色以32位int存储,格式为
AARRGGBB,其中Alpha通道占最高8位。如果Alpha值是FF(完全不透明),这个整数的最高位是1,而Java的int是有符号类型,所以会显示为负数,但这并不代表颜色值错误。
你的代码逻辑基本正确,这里给出优化后的版本,并说明如何正确解读这个“负数”:
修正后的代码
int rippleColor = 0; View closeBtn = findViewById(R.id.close_button); TypedValue outValue = new TypedValue(); Resources.Theme viewTheme = closeBtn.getContext().getTheme(); if (viewTheme.resolveAttribute(android.R.attr.colorControlHighlight, outValue, true)) { if (outValue.resourceId != 0) { // 若解析结果是资源ID,通过ContextCompat获取实际颜色值 rippleColor = ContextCompat.getColor(closeBtn.getContext(), outValue.resourceId); } else { // 直接是颜色值,outValue.data就是ARGB格式的int值(可能为负数,属于正常情况) rippleColor = outValue.data; } } // 验证颜色的正确方式:分解ARGB分量 int alpha = Color.alpha(rippleColor); int red = Color.red(rippleColor); int green = Color.green(rippleColor); int blue = Color.blue(rippleColor); Log.d("RippleColor", String.format("ARGB分量: %d, %d, %d, %d", alpha, red, green, blue));
关键说明
- 不要直接以整数的正负判断颜色是否正确,而是通过
Color类的静态方法(Color.alpha()、Color.red()等)提取颜色分量,这些分量都是0-255的正数,能准确反映颜色信息。 - 你的布局中
close_button单独应用了android:theme="@style/ripple_theme",所以必须使用这个View的上下文主题(closeBtn.getContext().getTheme())来解析属性,这样才能获取到你自定义的google_yellow100颜色,而非全局主题的默认值。
内容的提问来源于stack exchange,提问作者Elad Benda
相关产品推荐
相关产品推荐

