android 代码写select,Android 代码实现Shape和Selector

这个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了。。最后还是不知道格式是什么鬼,不知道怎么加个框

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值