一 背景
通常我们自定义背景,一是直接用color,二是自定义xml,然而他们都有缺陷。前者纯颜色有时无法满足我们的需求,后者者是颜色只能固定写死,很不方便。今天教你一招轻松自定义drawable,满足日常开发需求,动态改变颜色,圆角等,话不多说上代码。
效果图
代码
package com.example.myndk;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.RectF;
import android.graphics.drawable.Drawable;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
public class MyDrawable extends Drawable {
/**
* 默认值
*/
private static int round = 20;
private static int color = Color.BLUE;
private RectF rectF = new RectF();
private Paint paint = new Paint();
public static MyDrawable getDrawable(View view, int c, int round) {
c = view.getContext().getResources().getColor(c);
return new MyDrawable(view, c, round);
}
public static MyDrawable getRandomDrawable(View view) {
int c = getRandomColor();
return new MyDrawable(view, c, round);
}
public MyDrawable(View view, int c, int r) {
view.post(new Runnable() {
@Override
public void run() {
round = r;
color = c;
rectF.left = 0;
rectF.top = 0;
rectF.right = view.getMeasuredWidth();
rectF.bottom = view.getMeasuredHeight();
invalidateSelf();
}
});
}
@Override
public void draw(@NonNull Canvas canvas) {
paint.setAntiAlias(true);
paint.setColor(color);
canvas.drawRoundRect(rectF, round, round, paint);
}
@Override
public void setAlpha(int i) {
}
@Override
public void setColorFilter(@Nullable ColorFilter colorFilter) {
}
@Override
public int getOpacity() {
return PixelFormat.TRANSLUCENT;
}
private static int getRandomColor() {
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < 6; i++) {
buffer.append(arr[(int) (Math.random() * arr.length)]);
}
return Color.parseColor("#" + buffer.toString());
}
private static String[] arr = new String[]{
"0",
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"a",
"b",
"c",
"d",
"e",
"f"
};
}
引用
注意
view一定要设置大小哈!不然无法显示!
view一定要设置大小哈!不然无法显示!
view一定要设置大小哈!不然无法显示!