Android GradientDrawable动态设置背景

平时我们对GradientDrawable的使用都是静态使用,也就是在xml中使用shape标签定义。
其实呢,我们也可以在代码中动态设置背景。

//新建一个Drawable对象
GradientDrawable drawable=new GradientDrawable();
//设置背景色
drawable.setColor(Color.rgb(255,0,0));
//设置边框的厚度以及边框的颜色
drawable.setStroke(1,Color.rgb(0,0,0));
//设置圆角的半径  当然也是可以一个个设置圆角的半径
drawable.setCornerRadius(20);
//设置背景的形状,默认就是矩形,跟xml文件中类型android:shape的值保持一致,具体有:GradientDrawable.LINE  GradientDrawable.OVAL GradientDrawable.RECTANGLE  GradientDrawable.RING
drawable.setShape(GradientDrawable.RECTANGLE);
//判断当前版本号,版本号大于等于16,使用setBackground;版本号小于16,使用setBackgroundDrawable。
if(android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN)
{
tvDrawable.setBackground(drawable);
}else{
tvDrawable.setBackgroundDrawable(drawable);
}

学会了这个,自然地就会想到Selector选择器是否也可以在代码中动态设置呢?当然也是可以的

 //背景1 背景红色 边框宽度为1,黑色
 GradientDrawable drawable=new GradientDrawable();
 drawable.setColor(Color.rgb(255,0,0));
 drawable.setStroke(1,Color.rgb(0,0,0));
 drawable.setCornerRadius(20);
 drawable.setShape(GradientDrawable.RECTANGLE);

//背景2  背景蓝色  边框宽度为1,黑色
GradientDrawable drawable2=new GradientDrawable();
drawable2.setColor(Color.rgb(0,0,0));
drawable2.setStroke(1,Color.rgb(0,0,0));
drawable2.setCornerRadius(20);
drawable2.setShape(GradientDrawable.RECTANGLE);

//动态生成Selector
int pressed = android.R.attr.state_pressed; //取负值就表示pressed为false的意思
StateListDrawable drawable3= new StateListDrawable();
drawable3.addState(new int[]{pressed},drawable);//  状态  , 设置按下的图片
drawable3.addState(new int[]{-pressed}, drawable2);//默认状态,默认状态下的图片

个人觉得在某个shape或者selector选择器用得不多的情况下,可以考虑使用代码动态生成,这样可以减少drawable文件夹下面少一些xml文件。

使用了一阵子之后,发现还忘了用代码实现背景渐变的效果。

GradientDrawable drawable;
        //API大于等于16
        if(android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN)
        {
            drawable=new GradientDrawable();
            //俩设置方法其实就是对应着带参构造参数的那俩参数
            drawable.setOrientation(GradientDrawable.Orientation.LEFT_RIGHT);
            drawable.setColors(colors);
        }else{
            drawable = new GradientDrawable(GradientDrawable.Orientation.LEFT_RIGHT, colors);
        }

        drawable.setCornerRadii(radius);
        drawable.setGradientType(GradientDrawable.LINEAR_GRADIENT);

API小于16的时候,需要使用GradientDrawable的带参构造函数;API大于16的时候,直接调用相关方法就行了。

在项目中使用的时候,可以将上述功能写成一个工具类,然后直接调用。

import android.graphics.drawable.GradientDrawable;
import android.os.Build;
import android.view.View;

/**
 * Created by Administrator on 2018/8/3 0003.
 */

public class DrawableGetUtil {


    /**
     *
     * @param radius 四个角的半径
     * @param colors 渐变的颜色
     * @return
     */
    public static GradientDrawable getNeedDrawable(float []radius,int []colors) {
        //TODO:判断版本是否大于16  项目中默认的都是Linear散射 都是从左到右 都是只有开始颜色和结束颜色
        GradientDrawable drawable;
        if(android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN)
        {
            drawable=new GradientDrawable();
            drawable.setOrientation(GradientDrawable.Orientation.LEFT_RIGHT);
            drawable.setColors(colors);
        }else{
            drawable = new GradientDrawable(GradientDrawable.Orientation.LEFT_RIGHT, colors);
        }

        drawable.setCornerRadii(radius);
        drawable.setGradientType(GradientDrawable.LINEAR_GRADIENT);
        return drawable;
    }

    /**
     *
     * @param radius 四个角的半径
     * @param bgColor 背景颜色
     * @param strokeWidth 边框宽度
     * @param strokeColor 边框颜色
     * @return
     */
    public static GradientDrawable getNeedDrawable(float []radius, int bgColor,int strokeWidth, int strokeColor) {
        GradientDrawable drawable = new GradientDrawable();
        drawable.setCornerRadii(radius);
        drawable.setStroke(strokeWidth, strokeColor);
        drawable.setColor(bgColor);
        return drawable;
    }

    /**
     *
     * @param radis 四个角的半径
     * @param bgColor 背景颜色
     * @return
     */
    public static GradientDrawable getNeedDrawable(float []radis,int bgColor)
    {
        GradientDrawable drawable=new GradientDrawable();
        drawable.setCornerRadii(radis);
        drawable.setColor(bgColor);
        return drawable;
    }


    /**
     *
     * @param drawable 生成的背景
     * @param view 需要添加背景的View
     */
    public static void setBackground(GradientDrawable drawable,View view)
    {
        //判断当前版本号,版本号大于等于16,使用setBackground;版本号小于16,使用setBackgroundDrawable。
        if(android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN)
        {
            view.setBackground(drawable);
        }else{
            view.setBackgroundDrawable(drawable);
        }
    }
}

使用实例如下:

 float []r1=new float[8];
        float []r2=new float[8];
        for(int i=0;i<8;i++)
        {
            r1[i]=10f;
            r2[i]=50f;
        }

        float []r3={50f,50f,0,0,0,0,50f,50f};

        //转发点击
        DrawableGetUtil.setBackground(DrawableGetUtil.getNeedDrawable(r1,Color.rgb(255,255,255),1,Color.rgb(255,46,37)),tvForwardingClick);
        //状态
        DrawableGetUtil.setBackground(DrawableGetUtil.getNeedDrawable(r2,new int[]{Color.rgb(253,187,155),Color.rgb(249,47,0)}),tvState);
        //分享收益
        DrawableGetUtil.setBackground(DrawableGetUtil.getNeedDrawable(r2,new int[]{Color.rgb(253,187,155),Color.rgb(249,47,0)}),tvMoneyValue);
        //倒计时
        DrawableGetUtil.setBackground(DrawableGetUtil.getNeedDrawable(r3,Color.rgb(155,155,155)),tvTime);

这样用xml方式实现的功能,用代码基本都能写了。
Android GradientDrawable动态设置背景_第1张图片

你可能感兴趣的:(Android开发)