这个shape和selector,Android代码中经常用到。。。。。。
最近的项目中写得太多,只是更换颜色而已,一个颜色又搞个xml都要呕吐,然而用颜色代替图片是正确的做法,可以有效减少占用的内存
于是乎,网上查看下资料,看看API等等,写了简单的util工具类,我个人觉得有用,因为可减少工作量
给大伙搬个砖,写的不好,不喜勿喷。。。觉得有用的,可以根据自己项目需求更改方法即可,详情看代码import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.GradientDrawable;
import android.graphics.drawable.StateListDrawable;
import android.text.TextUtils;
import android.util.Log;
import android.util.TypedValue;
/**
* 该类是制作ShapeDrawable和代码设置selector的一个小工具类
* 只是简单写了几个常用的,要用的时候可以复制方法改改就好
* com.tqk.intimemodel
* Created by ${tqk}
* 2015/12/4.
*/
public class ShapeSelectorUtils {
private static final String TAG = ShapeSelectorUtils.class.getSimpleName();
/**
* Shape is a rectangle, possibly with rounded corners
*/
public static final int RECTANGLE = 0;
/**
* Shape is an ellipse
*/
public static final int OVAL = 1;
/**
* Shape is a line
*/
public static final int LINE = 2;
/**
* Shape is a ring.
*/
public static final int RING = 3;
/**
* Gradient is linear (default.)
*/
public static final int LINEAR_GRADIENT = 0;
/**
* Gradient is circular.
*/
public static final int RADIAL_GRADIENT = 1;
/**
* Gradient is a sweep.
*/
public static final int SWEEP_GRADIENT = 2;
private static final int DEFAULT_SHAPE = RECTANGLE;
private static final int DEFAULT_GRADIENT = LINEAR_GRADIENT;
private static final int DEFAULT_STROKE_WIDTH = -1;
private static final int DEFAULT_ROUND_RADIUS = 0;
private static final String DEFAULT_STROKE_CORLOR = "#dcdcdc";
public static StateListDrawable makeSelector(Drawable normal, Drawable pressed, Drawable focused) {
StateListDrawable bg = new StateListDrawable();
bg.addState(new int[]{android.R.attr.state_hovered},pressed);
bg.addState(new int[]{android.R.attr.state_selected},pressed);
bg.addState(new int[]{android.R.attr.state_checked},pressed);
bg.addState(new int[]{android.R.attr.state_pressed}, pressed);
bg.addState(new int[]{android.R.attr.state_focused}, focused);
bg.addState(new int[]{}, normal);
return bg;
}
public static StateListDrawable makeSelector(Context context, int normalId, int pressedId, int focusedId) {
StateListDrawable bg = new StateListDrawable();
Drawable normal = context.getResources().getDrawable(normalId);
Drawable pressed = context.getResources().getDrawable(pressedId);
Drawable focused = context.getResources().getDrawable(focusedId);
bg.addState(new int[]{android.R.attr.state_hovered},pressed);
bg.addState(new int[]{android.R.attr.state_selected},pressed);
bg.addState(new int[]{android.R.attr.state_checked},pressed);
bg.addState(new int[]{android.R.attr.state_pressed,}, pressed);
bg.addState(new int[]{android.R.attr.state_focused}, focused);
bg.addState(new int[]{}, normal);
return bg;
}
public static Drawable createDrawableDefault(Context context, String fillColor, int shape) {
return createShapeDrawableByShape(context, fillColor, DEFAULT_STROKE_CORLOR, DEFAULT_STROKE_WIDTH, DEFAULT_ROUND_RADIUS,shape);
}
public static Drawable createDrawableDefaultWithRadius(Context context, String fillColor, int shape,int roundRadius) {
return createShapeDrawableByShape(context, fillColor, DEFAULT_STROKE_CORLOR, DEFAULT_STROKE_WIDTH, roundRadius,shape);
}
public static Drawable createDrawableDefault(Context context, String fillColor, String strokeColor,int strokeWidth,int shape) {
return createShapeDrawableByShape(context, fillColor, strokeColor, strokeWidth, DEFAULT_ROUND_RADIUS,shape);
}
public static Drawable createRectangleDefault(Context context,String fillColor) {
return createRectangleShape(context, fillColor, DEFAULT_STROKE_CORLOR, DEFAULT_STROKE_WIDTH, DEFAULT_ROUND_RADIUS);
}
public static Drawable createRectangleWithRadius(Context context,String fillColor,int roundRadius) {
return createRectangleShape(context, fillColor, DEFAULT_STROKE_CORLOR, DEFAULT_STROKE_WIDTH, roundRadius);
}
public static Drawable createRectangleShape(Context context,String fillColor,
String strokeColor,int strokeWidth,
int roundRadius) {
return createShapeDrawableByShape(context, fillColor, strokeColor, strokeWidth, roundRadius, RECTANGLE);
}
public static Drawable createOvalDefault(Context context,String fillColor) {
return createOvalShape(context, fillColor, DEFAULT_STROKE_CORLOR, DEFAULT_STROKE_WIDTH, DEFAULT_ROUND_RADIUS);
}
public static Drawable createOvalByRadius(Context context,String fillColor,int roundRadius) {
return createOvalShape(context, fillColor, DEFAULT_STROKE_CORLOR, DEFAULT_STROKE_WIDTH, roundRadius);
}
public static Drawable createOvalShape(Context context,String fillColor,
String strokeColor,int strokeWidth,
int roundRadius) {
return createShapeDrawableByShape(context, fillColor, strokeColor, strokeWidth, roundRadius, OVAL);
}
private static Drawable createShapeDrawableByShape(Context context, String fillColor,
String strokeColor, int strokeWidth,
int roundRadius, int shape) {
return createShapeDrawable(context, fillColor, strokeColor, strokeWidth, roundRadius, shape, LINEAR_GRADIENT);
}
private static Drawable createShapeDrawable(Context context,String fillColor,
String strokeColor,int strokeWidth,
int roundRadius, int shape,int gradient) {
if (context == null || TextUtils.isEmpty(fillColor)) {
return null;
}
if (!fillColor.startsWith("#") || !strokeColor.startsWith("#")) {
Log.e(TAG, "Here a String color must be start with '#'");
return null;
}
if (roundRadius
roundRadius = DEFAULT_STROKE_WIDTH;
}
if (shape 2) {
shape = DEFAULT_SHAPE;
}
if (gradient 2) {
gradient = DEFAULT_GRADIENT;
}
if (TextUtils.isEmpty(strokeColor)) {
strokeColor = DEFAULT_STROKE_CORLOR;
}
strokeWidth = dp2px(context, strokeWidth); // dp 边框宽度
roundRadius = dp2px(context, roundRadius); // dp 圆角半径
int sColor = Color.parseColor(strokeColor);//边框颜色
int fColor = Color.parseColor(fillColor);//内部填充颜色
GradientDrawable drawable = new GradientDrawable();//创建drawable
drawable.setColor(fColor);
drawable.setGradientType(gradient);
drawable.setShape(shape);
drawable.setCornerRadius(roundRadius);
drawable.setStroke(strokeWidth, sColor);
return drawable;
}
/**
* dp转px
*
* @param context
* @param dpVal
* @return
*/
public static int dp2px(Context context, float dpVal) {
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
dpVal, context.getResources().getDisplayMetrics());
}
}不知道怎么搞的,这个格式。。。。好吧,不熟悉,其实没什么难懂的东西,主要就是GradientDrawable这个类了,不熟悉的可以看一下源码,我也看了,有时候自己看源码比看别人对源码的解析理解更深刻一点
用法:
给个颜色就好了,小例子:
String []colors = new String[]{ "#d6eddc", "#d6ede9", "#d6e8ed", "#d6e0ed", "#dad6ed", "#edd6eb", "#edd6df", "#eddcd6", "#f1ebd4" };Drawable btDefault = ShapeSelectorUtils.createDrawableDefault(this, "#fe612a", ShapeSelectorUtils.OVAL); Drawable btPressed = ShapeSelectorUtils.createDrawableDefault(this, colors[0], ShapeSelectorUtils.OVAL); findViewById(R.id.button).setBackground(ShapeSelectorUtils.makeSelector(btDefault, btPressed, btPressed)); Drawable ttDefault = ShapeSelectorUtils.createRectangleWithRadius(this, colors[1],3); Drawable ttPressed = ShapeSelectorUtils.createRectangleWithRadius(this, "#fe612a",3); findViewById(R.id.text).setBackground(ShapeSelectorUtils.makeSelector(ttDefault, ttPressed, ttPressed));
酱紫就不用各种写shape和selector了。。最后还是不知道格式是什么鬼,不知道怎么加个框