button组件筛选android,Android自定义Button组件

如何开发出一个漂亮的Buttton按钮,想必大家都迫不及待了。现在我来通过一个简单的过程说说这一过程。

首先查看一下Button类源码:

@RemoteView

public class Button extends TextView {

public Button(Context context) {

this(context, null);

}

public Button(Context context, AttributeSet attrs) {

this(context, attrs, com.android.internal.R.attr.buttonStyle);

}

public Button(Context context, AttributeSet attrs, int defStyle) {

super(context, attrs, defStyle);

}

}

大家发现没有,它继承了TextView类。只不过多了两个构造函数而已

我现在定义一个attrs.xml文件。这个文件的代码,如下所示:

然后实现这个SmoothButton类,如下所示:

public class SmoothButton extends Button {

private static final long DELAY = 25;

private LevelListDrawable transitionDrawable;

private int transitionDrawableLength;

private int level;

private int[] colors;

public SmoothButton(Context context, AttributeSet attrs) {

super(context, attrs);

TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SmoothButton);

transitionDrawable = (LevelListDrawable) a.getDrawable(R.styleable.SmoothButton_transitionDrawable);

transitionDrawableLength = a.getInt(R.styleable.SmoothButton_transitionDrawableLength, 0);

int useTextColors = 0;

int c0 = 0;

if (a.hasValue(R.styleable.SmoothButton_transitionTextColorUp)) {

c0 = a.getColor(R.styleable.SmoothButton_transitionTextColorUp, 0);

useTextColors++;

}

int c1 = 0;

if (useTextColors == 1 && a.hasValue(R.styleable.SmoothButton_transitionTextColorDown)) {

c1 = a.getColor(R.styleable.SmoothButton_transitionTextColorDown, 0);

useTextColors++;

}

a.recycle();

if (transitionDrawable == null) {

throw new RuntimeException("transitionDrawable must be defined in XML (with valid xmlns)");

}

if (transitionDrawableLength == 0) {

throw new RuntimeException("transitionDrawableLength must be defined in XML (with valid xmlns)");

}

if (useTextColors == 2) {

setTextColor(c0);

int a0 = Color.alpha(c0);

int r0 = Color.red(c0);

int g0 = Color.green(c0);

int b0 = Color.blue(c0);

int a1 = Color.alpha(c1);

int r1 = Color.red(c1);

int g1 = Color.green(c1);

int b1 = Color.blue(c1);

colors = new int[transitionDrawableLength];

for (int i=0; i

int ai = a0 + i * (a1 - a0) / transitionDrawableLength;

int ri = r0 + i * (r1 - r0) / transitionDrawableLength;

int gi = g0 + i * (g1 - g0) / transitionDrawableLength;

int bi = b0 + i * (b1 - b0) / transitionDrawableLength;

colors[i] = Color.argb(ai, ri, gi, bi);

}

}

level = 0;

transitionDrawable.setLevel(level);

int paddingLeft = getPaddingLeft();

int paddingTop = getPaddingTop();

int paddingRight = getPaddingRight();

int paddingBottom = getPaddingBottom();

setBackgroundDrawable(transitionDrawable);

setPadding(paddingLeft, paddingTop, paddingRight, paddingBottom);

}

@Override

protected void drawableStateChanged() {

super.drawableStateChanged();

int delta = isPressed()? 1 : -1;

handler.removeMessages(-delta);

handler.sendEmptyMessage(delta);

}

private Handler handler = new Handler() {

@Override

public void handleMessage(Message msg) {

int what = msg.what;

level += what;

if (level >= 0 && level < transitionDrawableLength) {

transitionDrawable.setLevel(level);

if (colors != null) {

setTextColor(colors[level]);

}

handler.sendEmptyMessageDelayed(what, DELAY);

} else {

level = Math.max(0, level);

level = Math.min(transitionDrawableLength-1, level);

}

}

};

public void setTransitionDrawable(Drawable drawable, int length) {

transitionDrawable = (LevelListDrawable) drawable;

transitionDrawableLength = length;

level = 0;

invalidate();

}

}

里面有一个TypeArray类。这个类负责调用上面的attrs.xml中的配置属性。

并将这些属性添加到Button中。比如一些默认的属性。

然后在main.xml文件中定义这个自定义Button组件,代码如下所示:

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_gravity="center"

android:id="@+id/smoothButton2"

android:text="click me and see top panel..."

android:textStyle="bold"

panel:transitionDrawable="@drawable/transition_list"

panel:transitionDrawableLength="8"

panel:transitionTextColorUp="#eee"

panel:transitionTextColorDown="#aaa"

/>

这样就可以配置好了该Button组件,

接下来要在Activity子类中调用。如下所示:

findViewById(R.id.smoothButton1).setOnClickListener(new OnClickListener() {

public void onClick(View v) {

Log.d("hellow","heelow");

}

});

实现效果如下所示:

0818b9ca8b590ca3270a3433284dd417.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值