Android问题汇总(遥远的回忆过去)

Android-代码动态创建Shape并运用到控件背景(Grad

2019-08-14  本文已影响2人  MonkeyLei

最近再做通用弹窗的封装FanChael/CommonPopupWindow,在涉及到注册、登录弹窗的时候,为了统一色调(光标、下划线、按钮、文本框),用户调用时会传入颜色“#xxxxxxx”,这个时候就需要修改按钮、文本框的背景shape的动态修改(因为涉及到圆角处理,所以其背景采用了shape的方式)。

1. 创建shape,做了下封装 - 跟xml的方式一样,都是设置相关属性,不慌不慌!

import android.graphics.Color;
import android.graphics.drawable.GradientDrawable;

/*
 *@Description: Shape创建工具
 *@Author: hl
 *@Time: 2019/2/19 16:42
 */
public class ShapeUtil {
    /**
     * 创建一个Shape - GradientDrawable
     *
     * @param _strokeWidth - 沿边线厚度;无需传入-1
     * @param _roundRadius - 圆角半径;无需传入-1
     * @param _shape       - shape绘制类型(rectangle、oval等);无需传入-1,将采用默认的GradientDrawable.RECTANGLE
     * @param _strokeColor - 沿边线颜色;无需传入null/""
     * @param _fillColor   - 内部填充颜色
     * @return
     */
    public static GradientDrawable createShape(int _strokeWidth,
                                               int _roundRadius, int _shape,
                                               String _strokeColor, String _fillColor) {
        int strokeWidth = _strokeWidth; // px not dp
        int roundRadius = _roundRadius; // px not dp
        int strokeColor = -1;
        if (null != _strokeColor && !_strokeColor.equals("")) {
            strokeColor = Color.parseColor(_strokeColor);
        }
        int fillColor = Color.parseColor(_fillColor);

        GradientDrawable gd = new GradientDrawable();
        gd.setColor(fillColor);

        if (-1 == _shape) {
            gd.setShape(GradientDrawable.RECTANGLE);
        } else {
            gd.setShape(_shape);
        }

        if (-1 != roundRadius) {
            gd.setCornerRadius(roundRadius);
        }
        if (-1 != strokeWidth && -1 != strokeColor) {
            gd.setStroke(strokeWidth, strokeColor);
        }
        return gd;
    }
}

2. 进行Button、TextView的相关shape背景设置

   ///< 创建一个
   GradientDrawable gradientDrawable = ShapeUtil.createShape(-1,
                    6,
                    -1, null, allColor);

   ///< minsdk最小为15,因此做了个兼容判断;
   TextView getVerifyTv = findViewById(R.id.xxxx);
   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
        getVerifyTv.setBackground(gradientDrawable);
   }else{
        getVerifyTv.setBackgroundDrawable(gradientDrawable);
   }
  1. 注意,多个控件需要创建多个GradientDrawable,不能共用一个GradientDrawable,否则显示要出问题!
上一篇下一篇

猜你喜欢

热点阅读