美文网首页高级UI
CardView阴影颜色设置

CardView阴影颜色设置

作者: 名字不想带英文 | 来源:发表于2019-09-30 12:05 被阅读0次

    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(就是本周课表)能够紧贴左边

    相关文章

      网友评论

        本文标题:CardView阴影颜色设置

        本文链接:https://www.haomeiwen.com/subject/yhbcpctx.html