直接复制代码就可以跑了 希望某神可以见谅
1.自定义Button
package com.example.administrator.shapebuttontest;
import android.content.Context;
import android.content.res.ColorStateList;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.GradientDrawable;
import android.graphics.drawable.StateListDrawable;
import android.support.annotation.ColorInt;
import android.support.annotation.FloatRange;
import android.support.annotation.IntRange;
import android.support.v7.widget.AppCompatButton;
import android.util.AttributeSet;
/**
* @author deadline
* @time 2016-11-07
*/
public class StateButton extends AppCompatButton{
//text color
private int mNormalTextColor = 0;
private int mPressedTextColor = 0;
private int mUnableTextColor = 0;
ColorStateList mTextColorStateList;
//animation duration
private int mDuration = 0;
//radius
private float mRadius = 0;
private boolean mRound;
//stroke
private float mStrokeDashWidth = 0;
private float mStrokeDashGap = 0;
private int mNormalStrokeWidth = 0;
private int mPressedStrokeWidth = 0;
private int mUnableStrokeWidth = 0;
private int mNormalStrokeColor = 0;
private int mPressedStrokeColor = 0;
private int mUnableStrokeColor = 0;
//background color
private int mNormalBackgroundColor = 0;
private int mPressedBackgroundColor = 0;
private int mUnableBackgroundColor = 0;
private GradientDrawable mNormalBackground;
private GradientDrawable mPressedBackground;
private GradientDrawable mUnableBackground;
private int[][] states;
StateListDrawable mStateBackground;
public StateButton(Context context) {
this(context, null);
}
public StateButton(Context context, AttributeSet attrs) {
this(context, attrs, android.support.v7.appcompat.R.attr.buttonStyle);
}
public StateButton(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
setup(attrs);
}
private void setup(AttributeSet attrs) {
states = new int[4][];
Drawable drawable = getBackground();
if(drawable != null && drawable instanceof StateListDrawable){
mStateBackground = (StateListDrawable) drawable;
}else{
mStateBackground = new StateListDrawable();
}
mNormalBackground = new GradientDrawable();
mPressedBackground = new GradientDrawable();
mUnableBackground = new GradientDrawable();
//pressed, focused, normal, unable
states[0] = new int[] { android.R.attr.state_enabled, android.R.attr.state_pressed };
states[1] = new int[] { android.R.attr.state_enabled, android.R.attr.state_focused };
states[3] = new int[] { -android.R.attr.state_enabled};
states[2] = new int[] { android.R.attr.state_enabled };
TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.StateButton);
//get original text color as default
//set text color
mTextColorStateList = getTextColors();
int mDefaultNormalTextColor = mTextColorStateList.getColorForState(states[2], getCurrentTextColor());
int mDefaultPressedTextColor = mTextColorStateList.getColorForState(states[0], getCurrentTextColor());
int mDefaultUnableTextColor = mTextColorStateList.getColorForState(states[3], getCurrentTextColor());
mNormalTextColor = a.getColor(R.styleable.StateButton_normalTextColor, mDefaultNormalTextColor);
mPressedTextColor = a.getColor(R.styleable.StateButton_pressedTextColor, mDefaultPressedTextColor);
mUnableTextColor = a.getColor(R.styleable.StateButton_unableTextColor, mDefaultUnableTextColor);
setTextColor();
//set animation duration
mDuration = a.getInteger(R.styleable.StateButton_animationDuration, mDuration);
mStateBackground.setEnterFadeDuration(mDuration);
mStateBackground.setExitFadeDuration(mDuration);
//set background color
mNormalBackgroundColor = a.getColor(R.styleable.StateButton_normalBackgroundColor, 0);
mPressedBackgroundColor = a.getColor(R.styleable.StateButton_pressedBackgroundColor, 0);
mUnableBackgroundColor = a.getColor(R.styleable.StateButton_unableBackgroundColor, 0);
mNormalBackground.setColor(mNormalBackgroundColor);
mPressedBackground.setColor(mPressedBackgroundColor);
mUnableBackground.setColor(mUnableBackgroundColor);
//set radius
mRadius = a.getDimensionPixelSize(R.styleable.StateButton_radius, 0);
mRound = a.getBoolean(R.styleable.StateButton_round, false);
mNormalBackground.setCornerRadius(mRadius);
mPressedBackground.setCornerRadius(mRadius);
mUnableBackground.setCornerRadius(mRadius);
//set stroke
mStrokeDashWidth = a.getDimensionPixelSize(R.styleable.StateButton_strokeDashWidth, 0);
mStrokeDashGap = a.getDimensionPixelSize(R.styleable.StateButton_strokeDashWidth, 0);
mNormalStrokeWidth = a.getDimensionPixelSize(R.styleable.StateButton_normalStrokeWidth, 0);
mPressedStrokeWidth = a.getDimensionPixelSize(R.styleable.StateButton_pressedStrokeWidth, 0);
mUnableStrokeWidth = a.getDimensionPixelSize(R.styleable.StateButton_unableStrokeWidth, 0);
mNormalStrokeColor = a.getColor(R.styleable.StateButton_normalStrokeColor, 0);
mPressedStrokeColor = a.getColor(R.styleable.StateButton_pressedStrokeColor, 0);
mUnableStrokeColor = a.getColor(R.styleable.StateButton_unableStrokeColor, 0);
setStroke();
//set background
mStateBackground.addState(states[0], mPressedBackground);
mStateBackground.addState(states[1], mPressedBackground);
mStateBackground.addState(states[3], mUnableBackground);
mStateBackground.addState(states[2], mNormalBackground);
setBackgroundDrawable(mStateBackground);
a.recycle();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
setRound(mRound);
}
/****************** stroke color *********************/
public void setNormalStrokeColor(@ColorInt int normalStrokeColor) {
this.mNormalStrokeColor = normalStrokeColor;
setStroke(mNormalBackground, mNormalStrokeColor, mNormalStrokeWidth);
}
public void setPressedStrokeColor(@ColorInt int pressedStrokeColor) {
this.mPressedStrokeColor = pressedStrokeColor;
setStroke(mPressedBackground, mPressedStrokeColor, mPressedStrokeWidth);
}
public void setUnableStrokeColor(@ColorInt int unableStrokeColor) {
this.mUnableStrokeColor = unableStrokeColor;
setStroke(mUnableBackground, mUnableStrokeColor, mUnableStrokeWidth);
}
public void setStateStrokeColor(@ColorInt int normal, @ColorInt int pressed, @ColorInt int unable){
mNormalStrokeColor = normal;
mPressedStrokeColor = pressed;
mUnableStrokeColor = unable;
setStroke();
}
/****************** stroke width *********************/
public void setNormalStrokeWidth(int normalStrokeWidth) {
this.mNormalStrokeWidth = normalStrokeWidth;
setStroke(mNormalBackground, mNormalStrokeColor, mNormalStrokeWidth);
}
public void setPressedStrokeWidth(int pressedStrokeWidth) {
this.mPressedStrokeWidth = pressedStrokeWidth;
setStroke(mPressedBackground, mPressedStrokeColor, mPressedStrokeWidth);
}
public void setUnableStrokeWidth(int unableStrokeWidth) {
this.mUnableStrokeWidth = unableStrokeWidth;
setStroke(mUnableBackground, mUnableStrokeColor, mUnableStrokeWidth);
}
public void setStateStrokeWidth(int normal, int pressed, int unable){
mNormalStrokeWidth = normal;
mPressedStrokeWidth = pressed;
mUnableStrokeWidth= unable;
setStroke();
}
public void setStrokeDash(float strokeDashWidth, float strokeDashGap) {
this.mStrokeDashWidth = strokeDashWidth;
this.mStrokeDashGap = strokeDashWidth;
setStroke();
}
private void setStroke(){
setStroke(mNormalBackground, mNormalStrokeColor, mNormalStrokeWidth);
setStroke(mPressedBackground, mPressedStrokeColor, mPressedStrokeWidth);
setStroke(mUnableBackground, mUnableStrokeColor, mUnableStrokeWidth);
}
private void setStroke(GradientDrawable mBackground, int mStrokeColor, int mStrokeWidth) {
mBackground.setStroke(mStrokeWidth, mStrokeColor, mStrokeDashWidth, mStrokeDashGap);
}
/******************** radius *******************************/
public void setRadius(@FloatRange(from = 0) float radius) {
this.mRadius = radius;
mNormalBackground.setCornerRadius(mRadius);
mPressedBackground.setCornerRadius(mRadius);
mUnableBackground.setCornerRadius(mRadius);
}
public void setRound(boolean round){
this.mRound = round;
int height = getMeasuredHeight();
if(mRound){
setRadius(height / 2f);
}
}
public void setRadius(float[] radii){
mNormalBackground.setCornerRadii(radii);
mPressedBackground.setCornerRadii(radii);
mUnableBackground.setCornerRadii(radii);
}
/******************** background color **********************/
public void setStateBackgroundColor(@ColorInt int normal, @ColorInt int pressed, @ColorInt int unable){
mPressedBackgroundColor = normal;
mNormalBackgroundColor = pressed;
mUnableBackgroundColor = unable;
mNormalBackground.setColor(mNormalBackgroundColor);
mPressedBackground.setColor(mPressedBackgroundColor);
mUnableBackground.setColor(mUnableBackgroundColor);
}
public void setNormalBackgroundColor(@ColorInt int normalBackgroundColor) {
this.mNormalBackgroundColor = normalBackgroundColor;
mNormalBackground.setColor(mNormalBackgroundColor);
}
public void setPressedBackgroundColor(@ColorInt int pressedBackgroundColor) {
this.mPressedBackgroundColor = pressedBackgroundColor;
mPressedBackground.setColor(mPressedBackgroundColor);
}
public void setUnableBackgroundColor(@ColorInt int unableBackgroundColor) {
this.mUnableBackgroundColor = unableBackgroundColor;
mUnableBackground.setColor(mUnableBackgroundColor);
}
/*******************alpha animation duration********************/
public void setAnimationDuration(@IntRange(from = 0)int duration){
this.mDuration = duration;
mStateBackground.setEnterFadeDuration(mDuration);
}
/*************** text color ***********************/
private void setTextColor() {
int[] colors = new int[] {mPressedTextColor, mPressedTextColor, mNormalTextColor, mUnableTextColor};
mTextColorStateList = new ColorStateList(states, colors);
setTextColor(mTextColorStateList);
}
public void setStateTextColor(@ColorInt int normal, @ColorInt int pressed, @ColorInt int unable){
this.mNormalTextColor = normal;
this.mPressedTextColor = pressed;
this.mUnableTextColor = unable;
setTextColor();
}
public void setNormalTextColor(@ColorInt int normalTextColor) {
this.mNormalTextColor = normalTextColor;
setTextColor();
}
public void setPressedTextColor(@ColorInt int pressedTextColor) {
this.mPressedTextColor = pressedTextColor;
setTextColor();
}
public void setUnableTextColor(@ColorInt int unableTextColor) {
this.mUnableTextColor = unableTextColor;
setTextColor();
}
}
2.main
package com.example.administrator.shapebuttontest;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private String TAG = "MainActivity";
StateButton text;
StateButton background;
StateButton radius;
StateButton stroke;
StateButton dash;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//设置不同状态下文字变色
text = (StateButton) findViewById(R.id.text_test);
text.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
text.setEnabled(false);
}
});
//最常用的设置不同背景
background = (StateButton) findViewById(R.id.background_test);
background.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
background.setEnabled(false);
}
});
//设置四个角不同的圆角
radius = (StateButton) findViewById(R.id.different_radius_test);
radius.setRadius(new float[]{0, 0, 20, 20, 40, 40, 60, 60});
//设置不同状态下边框颜色,宽度
stroke = (StateButton) findViewById(R.id.stroke_test);
stroke.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
stroke.setEnabled(false);
}
});
//设置间断
dash = (StateButton) findViewById(R.id.dash_test);
dash.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dash.setEnabled(false);
}
});
}
private void initData() {
Log.d(TAG, "initData: ");
List
l = new ArrayList<>();
for (int i = 0; i < l.size(); i++) {
}
for (String s : l) {
}
boolean a = true;
}
private void initView() {
Log.d(TAG, "initView: ");
}
}
3.attrs
<?xml version="1.0" encoding="utf-8" ?> <resources> <declare-styleable name="StateButton"> <!-- text color --> <attr name="normalTextColor" format="color|reference"/> <attr name="pressedTextColor" format="color|reference"/> <attr name="unableTextColor" format="color|reference"/> <!-- stroke width and color, dash width, dash gap --> <attr name="strokeDashWidth" format="dimension|reference"/> <attr name="strokeDashGap" format="dimension|reference"/> <attr name="normalStrokeWidth" format="dimension|reference"/> <attr name="pressedStrokeWidth" format="dimension|reference"/> <attr name="unableStrokeWidth" format="dimension|reference"/> <attr name="normalStrokeColor" format="color|reference"/> <attr name="pressedStrokeColor" format="color|reference"/> <attr name="unableStrokeColor" format="color|reference"/> <!-- background color --> <attr name="normalBackgroundColor" format="color|reference"/> <attr name="pressedBackgroundColor" format="color|reference"/> <attr name="unableBackgroundColor" format="color|reference"/> <!-- background radius --> <attr name="radius" format="dimension|reference"/> <attr name="round" format="boolean|reference"/> <!-- animation duration --> <attr name="animationDuration" format="integer|reference"/> </declare-styleable> </resources>
4.xml
<?xml version="1.0" encoding="utf-8" ?> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@android:color/background_dark"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <com.example.administrator.shapebuttontest.StateButton android:id="@+id/text_test" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_margin="10dp" android:padding="10dp" android:text="change text color" app:normalBackgroundColor="@color/colorPrimary" app:normalTextColor="@android:color/white" app:pressedBackgroundColor="@color/colorPrimary" app:pressedTextColor="@android:color/holo_red_light" app:unableBackgroundColor="@color/colorPrimary" app:unableTextColor="@android:color/holo_orange_dark"/> <com.example.administrator.shapebuttontest.StateButton android:id="@+id/background_test" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_margin="10dp" android:padding="10dp" android:text="change background" android:textColor="@android:color/white" app:normalBackgroundColor="@color/colorPrimary" app:pressedBackgroundColor="@color/colorPrimaryDark" app:unableBackgroundColor="@android:color/holo_red_light"/> <com.example.administrator.shapebuttontest.StateButton android:id="@+id/radius_test" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_margin="10dp" android:padding="10dp" android:text="with radius" android:textColor="@android:color/white" app:normalBackgroundColor="@color/colorPrimary" app:pressedBackgroundColor="@color/colorPrimaryDark" app:radius="10dp" app:unableBackgroundColor="@android:color/holo_red_light"/> <com.example.administrator.shapebuttontest.StateButton android:id="@+id/round_test" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_margin="10dp" android:padding="10dp" android:text="round radius" android:textColor="@android:color/white" app:normalBackgroundColor="@color/colorPrimary" app:pressedBackgroundColor="@color/colorPrimaryDark" app:radius="2dp" app:round="true" app:unableBackgroundColor="@android:color/holo_red_light"/> <com.example.administrator.shapebuttontest.StateButton android:id="@+id/different_radius_test" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_margin="10dp" android:padding="10dp" android:text="different_radius" android:textColor="@android:color/white" app:normalBackgroundColor="@color/colorPrimary" app:pressedBackgroundColor="@color/colorPrimaryDark" app:unableBackgroundColor="@android:color/holo_red_light"/> <com.example.administrator.shapebuttontest.StateButton android:id="@+id/dash_test" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_margin="10dp" android:padding="10dp" android:text="with dash" app:normalStrokeColor="@android:color/white" app:normalStrokeWidth="2dp" app:normalTextColor="@android:color/white" app:pressedStrokeColor="@android:color/holo_red_light" app:pressedStrokeWidth="2dp" app:pressedTextColor="@android:color/holo_red_light" app:radius="5dp" app:strokeDashGap="5dp" app:strokeDashWidth="5dp" app:unableStrokeColor="@android:color/holo_orange_dark" app:unableStrokeWidth="2dp" app:unableTextColor="@android:color/holo_orange_dark"/> <com.example.administrator.shapebuttontest.StateButton android:id="@+id/stroke_test" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_margin="10dp" android:padding="10dp" android:text="with stroke" app:normalStrokeColor="@android:color/white" app:normalStrokeWidth="2dp" app:normalTextColor="@android:color/white" app:pressedStrokeColor="@android:color/holo_red_light" app:pressedStrokeWidth="2dp" app:pressedTextColor="@android:color/holo_red_light" app:radius="5dp" app:unableStrokeColor="@android:color/holo_orange_dark" app:unableStrokeWidth="2dp" app:unableTextColor="@android:color/holo_orange_dark"/> <com.example.administrator.shapebuttontest.StateButton android:id="@+id/stroke_background_test" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_margin="10dp" android:padding="10dp" android:text="keep stroke" app:normalStrokeColor="@android:color/white" app:normalStrokeWidth="2dp" app:normalTextColor="@android:color/white" app:pressedBackgroundColor="@color/colorPrimaryDark" app:pressedStrokeColor="@android:color/white" app:pressedStrokeWidth="2dp" app:pressedTextColor="@android:color/white" app:radius="5dp"/> <com.example.administrator.shapebuttontest.StateButton android:id="@+id/stroke_background_test2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_margin="10dp" android:padding="10dp" android:text="stroke_background" app:normalStrokeColor="@android:color/white" app:normalStrokeWidth="2dp" app:normalTextColor="@android:color/white" app:pressedBackgroundColor="@color/colorPrimaryDark" app:pressedTextColor="@android:color/white" app:radius="5dp"/> <com.example.administrator.shapebuttontest.StateButton android:id="@+id/stroke_background_animation_test" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_margin="10dp" android:padding="10dp" android:text="stroke_background_animation" app:animationDuration="200" app:normalStrokeColor="@android:color/white" app:normalStrokeWidth="2dp" app:normalTextColor="@android:color/white" app:pressedBackgroundColor="@color/colorPrimaryDark" app:pressedTextColor="@android:color/white" app:radius="5dp"/> </LinearLayout> </ScrollView>