CardView阴影颜色改变,下面CardUtils 是从某大神那拿的(原谅我忘记从哪里copy的),运用反射获得方法后修改阴影颜色。在BaseAppcation里添加CardUtils.init()初始化
import android.os.Build;
import android.support.v7.widget.CardView;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class CardUtils {
private static boolean inited=false;
//设置obj的成员变量
private static void setMember(Object obj, String memberName, Object value) {
try {
if (obj instanceof Class) {
//静态变量
Field declaredField = ((Class) obj).getDeclaredField(memberName);
declaredField.setAccessible(true);
declaredField.set(null, value);
} else {
Field declaredField = obj.getClass().getDeclaredField(memberName);
declaredField.setAccessible(true);
declaredField.set(obj, value);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void init() {
if (Build.VERSION.SDK_INT >= 21&&!inited) {
inited=true;
try {
//new 一个CardViewApi17Impl
Constructor<?> constructor = Class.forName("android.support.v7.widget.CardViewApi17Impl").getDeclaredConstructor();
constructor.setAccessible(true);
Object impl = constructor.newInstance();
//用新的代替掉原来的
setMember(CardView.class, "IMPL", impl);
//执行方法IMPL.initStatic()
Method initStatic = impl.getClass().getDeclaredMethod("initStatic");
initStatic.setAccessible(true);
initStatic.invoke(impl);
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void setCardShadowColor(CardView cardView, int startColor, int endColor) {
try {
//获取背景
Object background = cardView.getBackground();
//设置颜色
setMember(background, "mShadowStartColor", startColor);
setMember(background, "mShadowEndColor", endColor);
} catch (Exception e) {
e.printStackTrace();
}
}
}
初始化后调用setCardShadowColor。需要注意的是用17后阴影会占位置,即设置宽高时你要加上阴影的。同时内容不会自动帮你切圆角,即内容铺满的要自己切圆角,background的话自定义shape,ImageView的话要自定义圆角图片(另外一篇文章有)
还有就是打包代码混淆时要注意将反射类也混淆-keep class android.support.v7.widget.** { *; }
要注意的是上面是全局的,使用后所有cardview都会改变(就是说你demo里所有cardview都得重新设置)androidx的导入是implementation 'androidx.cardview:cardview:1.0.0',你得把上面所有android.support.v7.widget换成androidx.cardview.widget
CardUtils.setCardShadowColor(cardView, getResources().getColor(R.color.red_ff695e), getResources().getColor(R.color.tran));
test.png
<android.support.v7.widget.CardView
android:id="@+id/cardview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="3dp"
android:layout_marginTop="4dp"
android:layout_marginRight="3dp"
android:layout_marginBottom="8dp"
app:cardCornerRadius="6dp"
app:cardElevation="12dp"
app:cardPreventCornerOverlap="false"/>
从上面可以看到,阴影是12dp,而距离左右是3dp,所以左右实际间距是15dp。之所以用红色是因为显眼点,换成#ebeef5会好看很多。app:cardPreventCornerOverlap="false"是为了保障cardview里面的view(就是本周课表)能够紧贴左边
网友评论